Измерение частоты импульсов

Вопросы программирования в системе Ардуино
Аватара пользователя
БлудныйКот
Сообщения: 41
Зарегистрирован: 29 дек 2016, 16:19

Измерение частоты импульсов

Сообщение БлудныйКот » 10 янв 2017, 13:59

Добрый день.
Есть задача мне кажется довольно простая.
Нужно мерить частоту импульсов приходящую с устройства. Количество импульсов варьируется от 0имп/мин до 1000имп/мин


Пробовал по прерываниям от ноги измерять время между спадающими фронтами, время читал из millis. Работает. Но когда в системе еще есть прерывание от таймера то какие странности начинаются с показаниями. Поэтому переделал всё это дело по прерыванию от таймера которое у меня возникает с частотой 1кГц (сделал локальный счётчик в прерывании погрешность немного выше). Работает. Но возникает погрешность.

Какими способами еще можно реализовать?


Эдуард
Администратор
Сообщения: 360
Зарегистрирован: 30 окт 2016, 20:53

Re: Измерение частоты импульсов

Сообщение Эдуард » 10 янв 2017, 16:47

Увеличить частоту прерывания по таймеру. Например, до 5 кГц (период 200 мкс).

Аватара пользователя
БлудныйКот
Сообщения: 41
Зарегистрирован: 29 дек 2016, 16:19

Re: Измерение частоты импульсов

Сообщение БлудныйКот » 10 янв 2017, 16:55

Спасибо! Я тоже об этом подумал, но что-то только тогда когда запостил тему на форуме. И тогда уже придётся использовать micros().

Эдуард
Администратор
Сообщения: 360
Зарегистрирован: 30 окт 2016, 20:53

Re: Измерение частоты импульсов

Сообщение Эдуард » 10 янв 2017, 17:32

А не лучше считать циклы прерывания?

Аватара пользователя
БлудныйКот
Сообщения: 41
Зарегистрирован: 29 дек 2016, 16:19

Re: Измерение частоты импульсов

Сообщение БлудныйКот » 11 янв 2017, 16:14

Сделал через циклы, но какая то муть. Использую мега2560.

Инициализирую таймер на прерывание каждые 96мкс:
Пред делитель установил 16 000 000/256

Код: Выделить всё

void TIM1_init(void)
{

  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1  = 0;

  OCR1A = 6; 
   
  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS12); 
  TIMSK1 |= (1 << OCIE1A); 

}


За 200мс у меня программой насчитывается 1786 импульсов, а по расчёту у меня должно быть 0,2/0,000096 = 2083 имп.
Может я где-то ошибаюсь, поправьте пожалуйста.

Эдуард
Администратор
Сообщения: 360
Зарегистрирован: 30 окт 2016, 20:53

Re: Измерение частоты импульсов

Сообщение Эдуард » 11 янв 2017, 16:59

Может проще время цикла задать библиотекой TimerOne урок 29.

Код: Выделить всё

void setup() {
  Timer1.initialize(100);  // инициализация таймера 1, период 100 мкс
  Timer1.attachInterrupt(timerInterrupt, 100);  // обработчик прерываний
}

void loop() {

}

//-------------------------------------- обработчик прерывания таймера 100 мкс
void  timerInterrupt() {

}

Аватара пользователя
БлудныйКот
Сообщения: 41
Зарегистрирован: 29 дек 2016, 16:19

Re: Измерение частоты импульсов

Сообщение БлудныйКот » 11 янв 2017, 17:13

Попробовал библиотекой. Спасибо, библиотека работает и разобрался сам, в чём была проблема.


Вернуться в «Программирование Ардуино»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость