Добрый день.
Есть задача мне кажется довольно простая.
Нужно мерить частоту импульсов приходящую с устройства. Количество импульсов варьируется от 0имп/мин до 1000имп/мин
Пробовал по прерываниям от ноги измерять время между спадающими фронтами, время читал из millis. Работает. Но когда в системе еще есть прерывание от таймера то какие странности начинаются с показаниями. Поэтому переделал всё это дело по прерыванию от таймера которое у меня возникает с частотой 1кГц (сделал локальный счётчик в прерывании погрешность немного выше). Работает. Но возникает погрешность.
Какими способами еще можно реализовать?
Измерение частоты импульсов
- БлудныйКот
- Сообщения: 45
- Зарегистрирован: 29 дек 2016, 16:19
Re: Измерение частоты импульсов
Увеличить частоту прерывания по таймеру. Например, до 5 кГц (период 200 мкс).
- БлудныйКот
- Сообщения: 45
- Зарегистрирован: 29 дек 2016, 16:19
Re: Измерение частоты импульсов
Спасибо! Я тоже об этом подумал, но что-то только тогда когда запостил тему на форуме. И тогда уже придётся использовать micros().
Re: Измерение частоты импульсов
А не лучше считать циклы прерывания?
- БлудныйКот
- Сообщения: 45
- Зарегистрирован: 29 дек 2016, 16:19
Re: Измерение частоты импульсов
Сделал через циклы, но какая то муть. Использую мега2560.
Инициализирую таймер на прерывание каждые 96мкс:
Пред делитель установил 16 000 000/256
За 200мс у меня программой насчитывается 1786 импульсов, а по расчёту у меня должно быть 0,2/0,000096 = 2083 имп.
Может я где-то ошибаюсь, поправьте пожалуйста.
Инициализирую таймер на прерывание каждые 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 имп.
Может я где-то ошибаюсь, поправьте пожалуйста.
Re: Измерение частоты импульсов
Может проще время цикла задать библиотекой TimerOne урок 29.
Код: Выделить всё
void setup() {
Timer1.initialize(100); // инициализация таймера 1, период 100 мкс
Timer1.attachInterrupt(timerInterrupt, 100); // обработчик прерываний
}
void loop() {
}
//-------------------------------------- обработчик прерывания таймера 100 мкс
void timerInterrupt() {
}
- БлудныйКот
- Сообщения: 45
- Зарегистрирован: 29 дек 2016, 16:19
Re: Измерение частоты импульсов
Попробовал библиотекой. Спасибо, библиотека работает и разобрался сам, в чём была проблема.
Вернуться в «Программирование Ардуино»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей