счётчик импульсов - тахометр
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: счётчик импульсов - тахометр
goldenandy, такой циклический таймер я использую один на всё. Его задача измерять все промежутки времени, которые потребуется. А прерывание GPIO все равно общее на порт - там и разбираюсь с пинами по необходимости. Очень короткие импульсы вызвавшие прерывание, но не подтвержденные при чтении из порта в обработчике прерывания игнорируются.
Такой подход позволяет успешно обрабатывать одновременно и целый ряд кнопок, датчиков и даже принимать данные от ИК приемника. Есть проекты, где этот же таймер занимается ещё и ШИМированием, но тогда он должен быть 16- битным.
Такой подход позволяет успешно обрабатывать одновременно и целый ряд кнопок, датчиков и даже принимать данные от ИК приемника. Есть проекты, где этот же таймер занимается ещё и ШИМированием, но тогда он должен быть 16- битным.
- Реклама
- GoldenAndy
- Поставщик валерьянки для Кота
- Сообщения: 1925
- Зарегистрирован: Чт июл 28, 2016 07:58:37
- Откуда: Kyiv, UA
- Контактная информация:
Re: счётчик импульсов - тахометр
ПростоНуб, Нененене, у восьмой меги нет одного прерывания на порт! Там только Int0 и Int1 
А вообще правильно. У каждого свой подход.
Я постарался уйти от длинных обработчиков прерываний, предпочитаю один таймер выделить под sysClock и привязывать процессы не к прерыванию таймера, а к изменению системного счетчика...
И прерывания только выставляют флаги срабатывания, а обработка идет в основном цикле программы.
А вообще правильно. У каждого свой подход.
Я постарался уйти от длинных обработчиков прерываний, предпочитаю один таймер выделить под sysClock и привязывать процессы не к прерыванию таймера, а к изменению системного счетчика...
И прерывания только выставляют флаги срабатывания, а обработка идет в основном цикле программы.
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: счётчик импульсов - тахометр
goldenandy, я тоже не использую длинные прерывания. Из прерывания просто помещаю сообщения с временной меткой в кольцевой буфер, а оттуда уже фоновый обработчик эти сообщения разгребает. При наличии временной метки можно уже не беспокоиться о времени обработки конкретного сообщения, пока размера буфера хвататет.
А про восьмую мегу и впрямь забыл. Как то получалось подобные задачи решать на STM8, а там подобных проблем нет. И с делением, кстати, тоже )
А про восьмую мегу и впрямь забыл. Как то получалось подобные задачи решать на STM8, а там подобных проблем нет. И с делением, кстати, тоже )
Re: счётчик импульсов - тахометр
Сделал со счётчиком, обновление 1 раз в секунду, вроде всё работает. Но хотелось бы чтобы показания не прыгали... Как этого достичь? Может сделать вывод 10 раз в секунду, или выборкой? Подозреваю что оверсемплинг и есть выборка...
- GoldenAndy
- Поставщик валерьянки для Кота
- Сообщения: 1925
- Зарегистрирован: Чт июл 28, 2016 07:58:37
- Откуда: Kyiv, UA
- Контактная информация:
Re: счётчик импульсов - тахометр
рокки1945, а чего им прыгать раз в секунду при стабильном входном сигнале?
Хотите чаще - при прямом счете будет еще более грубая шкала. 2 раза в секунду мерять - шаг будет 120 оборотов....
Можно взять массив, допустим в 4 элемента, писать ежесекундные показания в массив по кругу, выводить на экранчик сумму всех элементов массива, деленную на 4.
тогда у вас в каждый момент времени будет среднее от последних четырех показаний. Но при изменениях оборотов будет запаздывание отображения до 4х секунд.
Хотите более точное отображение и чаще чем раз в секунду - меряйте период импульсов...
Хотите чаще - при прямом счете будет еще более грубая шкала. 2 раза в секунду мерять - шаг будет 120 оборотов....
Можно взять массив, допустим в 4 элемента, писать ежесекундные показания в массив по кругу, выводить на экранчик сумму всех элементов массива, деленную на 4.
тогда у вас в каждый момент времени будет среднее от последних четырех показаний. Но при изменениях оборотов будет запаздывание отображения до 4х секунд.
Хотите более точное отображение и чаще чем раз в секунду - меряйте период импульсов...
- Реклама
Re: счётчик импульсов - тахометр
Выше писал как...рокки1945 писал(а):Но хотелось бы чтобы показания не прыгали... Как этого достичь?
roman.com писал(а):полученные данные пропускаем через фильтр - гистерезис (что бы показания на индикаторе не "прыгали")
Будет в 10 раз быстрей прыгать))рокки1945 писал(а):Может сделать вывод 10 раз в секунду, или выборкой?
Будет в 4 раза медленней прыгать))goldenandy писал(а):Можно взять массив, допустим в 4 элемента, писать ежесекундные показания в массив по кругу, выводить на экранчик сумму всех элементов массива, деленную на 4.
А потому что входной сигнал аналоговый, а выходной цифровой)) Как вы это делаете, c помощью таймера или АЦП, это не имеет значение. Смысл один - Вы переводите аналоговые величины в дискретные. Любой аналоговый сигнал содержит шумы. А ещё есть такое понятие - Шум квантования - https://ru.wikipedia.org/wiki/Шум_квантованияgoldenandy писал(а):а чего им прыгать раз в секунду при стабильном входном сигнале?
Единственный способ чтоб не "прыгало" это фильтр - гистерезис. Принцип предельно прост. Вводится (программно) "зона не чувствительности" к малым изменениям сигнала.
Допустим двигатель 120 оборотов. Индикатор показывает 120 оборотов.
-При изменении на +/- 1 оборот индикатор продолжает показывать 120 оборотов.
-При изменении на +/- 2 оборота индикатор показывает 118 или 122 оборотов соответственно.
По сути обычный Три́ггер Шми́тта, только программный, где +/- 1 оборот - это гистерезис Три́ггера Шми́тта.
Только так вы избавитесь от "прыганья" последних разрядов индикатора.
Да, это вносит погрешность +/- 1 оборот, но тут выбирайте сами, что вам важней: точность или чтоб не "прыгало" ))
Re: счётчик импульсов - тахометр
сделал просто - счётчик T1 настроен по спадающему фронту, этот же вывод подтянут к плюсу питания.
1 раз в секунду считываю регистр TCNT1 и скидываю по UART-у..
Проверил сначала генератором с осциллографа (встроенный 1 кГц меандр) потом сделал еще одну атмегу с шимом в 62 герца и ВСЁ нормально.....
только в первом случае счётчик выдаёт 1004 а во втором 63....
Погрешность не пропадает и с фильтром, подсчёт ровно по переполнению таймера ............
Вопрос у меня один как это всё выводить на семисегментники (динамическая индикация - ? tm1637 - ?) частота обновления тоже 1 раз в секунду?
1 раз в секунду считываю регистр TCNT1 и скидываю по UART-у..
Проверил сначала генератором с осциллографа (встроенный 1 кГц меандр) потом сделал еще одну атмегу с шимом в 62 герца и ВСЁ нормально.....
только в первом случае счётчик выдаёт 1004 а во втором 63....
Погрешность не пропадает и с фильтром, подсчёт ровно по переполнению таймера ............
Вопрос у меня один как это всё выводить на семисегментники (динамическая индикация - ? tm1637 - ?) частота обновления тоже 1 раз в секунду?
- GoldenAndy
- Поставщик валерьянки для Кота
- Сообщения: 1925
- Зарегистрирован: Чт июл 28, 2016 07:58:37
- Откуда: Kyiv, UA
- Контактная информация:
Re: счётчик импульсов - тахометр
roman.com, А потому что входной сигнал аналоговый, а выходной цифровой/
Не подменяйте понятия. Входной сигнал цифровой, в идеале - меандр. Но с неизвестной длительностью.
А при примененном ТС алгоритме показания не могут прыгать на +/-1 единицу.
Еще раз вчитайтесь - меряем секунду, умножаем на 60 - получаем обороты в минуту.
Показания прыгают сразу на 60 единиц. Ибо всегда кратны 60.
И никаким гистерезисом это не вылечится, ибо будет конская погрешность. Скользящий фильтр, теоретически, эти прыжки может попытаться усреднить. Но ценой запаздывания показаний.
Оптимально, с моей точки зрения, мерять период сигнала, а потом уже этот период как то усреднять на средних и высоких оборотах, что бы показания не менялись чаще пары раз в секунду....
Не подменяйте понятия. Входной сигнал цифровой, в идеале - меандр. Но с неизвестной длительностью.
А при примененном ТС алгоритме показания не могут прыгать на +/-1 единицу.
Еще раз вчитайтесь - меряем секунду, умножаем на 60 - получаем обороты в минуту.
Показания прыгают сразу на 60 единиц. Ибо всегда кратны 60.
И никаким гистерезисом это не вылечится, ибо будет конская погрешность. Скользящий фильтр, теоретически, эти прыжки может попытаться усреднить. Но ценой запаздывания показаний.
Оптимально, с моей точки зрения, мерять период сигнала, а потом уже этот период как то усреднять на средних и высоких оборотах, что бы показания не менялись чаще пары раз в секунду....
Re: счётчик импульсов - тахометр
а измерить период, можно таймером захвата?
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: счётчик импульсов - тахометр
я сглаживаю более частым замером - для твоего случая я бы делал замера 4 в секунду, результаты в кольцевой буфер длинной 8 элементов... и 4 раза в секунду суммировал бы все элементы массива и делил на 2 для получения Гц. (*30 для имп/мин) (устаканивание 2 с, обноление показаний 4 Гц), потом можно и другие фильтры применить, типа гистерезиса...
можно мзмерять и наоборот - засекать время между импульсами, для этого какраз и пригодится вход захвата... данный метод имеет максимальную точность при низких оборотах, а с ростом оборотов точность падает, првышают её в этом случае, или пропуская импульсы (если в регистре захввта мало - ждём следующий импульс и инкрементируем счетчик пропущенных импульсов) или повышая скорость счёта таймера...
Чтобы получить результат в Гц или об/мин нужно разделить частоту счёта таймера на величину регистра захвата...
можно мзмерять и наоборот - засекать время между импульсами, для этого какраз и пригодится вход захвата... данный метод имеет максимальную точность при низких оборотах, а с ростом оборотов точность падает, првышают её в этом случае, или пропуская импульсы (если в регистре захввта мало - ждём следующий импульс и инкрементируем счетчик пропущенных импульсов) или повышая скорость счёта таймера...
Чтобы получить результат в Гц или об/мин нужно разделить частоту счёта таймера на величину регистра захвата...
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- ПростоНуб
- Собутыльник Кота
- Сообщения: 2723
- Зарегистрирован: Пт сен 07, 2018 20:20:02
- Откуда: деревня в Тульской губернии
Re: счётчик импульсов - тахометр
Ivanoff-iv, тогда уж лучше медианный фильтр применять, но результат округлять до требуемой точности. Тогда колебания значений в пределах погрешности влиять на отображаемый результат не будут, а резкая смена оборотов приведет к резкой, а не плавной (как при усреднении) смене показаний
- GoldenAndy
- Поставщик валерьянки для Кота
- Сообщения: 1925
- Зарегистрирован: Чт июл 28, 2016 07:58:37
- Откуда: Kyiv, UA
- Контактная информация:
Re: счётчик импульсов - тахометр
рокки1945, да.
Я там даже какие то расчеты под данный метод делал - см. на 1 странице - https://radiokot.ru/forum/viewtopic.php ... 4#p3698984
Добавлено after 31 second:
чисто подсчет, без всяких фильтраций.
Я там даже какие то расчеты под данный метод делал - см. на 1 странице - https://radiokot.ru/forum/viewtopic.php ... 4#p3698984
Добавлено after 31 second:
чисто подсчет, без всяких фильтраций.
Re: счётчик импульсов - тахометр
на +/-1 единицу - это просто пример, поясняющий принцип работа фильтр - гистерезиса. В реальной жизни всё иначе.goldenandy писал(а):Не подменяйте понятия. Входной сигнал цифровой, в идеале - меандр. Но с неизвестной длительностью.
А при примененном ТС алгоритме показания не могут прыгать на +/-1 единицу.
Я не подменяю понятия. Любой сигнал имеет шум. Идеальных сигналов в природе не существует))
Например синусоида: Меандр так же имеет шум: Вы измеряете длительность импульсов (или скважность, или период... не важно). Таймер 16 разрядный ? (65536 разрядов).
А теперь измерьте длительность импульсов, с учётом фазового шума меандра.
Какая у вас будет погрешность измерения ? 1, 2, 3 разряда ? )) Я уже молчу, что кроме фазового шума меандра есть ещё кратковременная стабильность кварцевого генератора МК.))
И т.д. и т.п.
Поэтому, после измерения длительности импульсов, сначала пропускаем полученные данные через фильтр - гистерезис (убираем шум), а потом уже делайте с этими данными что хотите... Умножайте, делите, записывайте в массив... ищите среднее... делайте скользящее окно... и т.д.
Гистерезис лучше применять на начальном уровне обработки сигнала. "потом" гистерезис не поможет)) Будет только хуже.Ivanoff-iv писал(а):я сглаживаю более частым замером - для твоего случая я бы делал замера 4 в секунду, результаты в кольцевой буфер длинной 8 элементов... и 4 раза в секунду суммировал бы все элементы массива и делил на 2 для получения Гц. (*30 для имп/мин) (устаканивание 2 с, обноление показаний 4 Гц), потом можно и другие фильтры применить, типа гистерезиса...
А я просто увеличиваю частоту опроса датчика Холла в два раза (до 16 кГц). Затем пропускаю через фильтр - гистерезис, чтобы убрать неопределённость, т.к. у меня таймер не привязан к сигналу датчика и соответственно возникает биение. При этом точность измерения такая же, как при частоте опроса 8 кГц, и при этом показания не прыгают.))
При этом фазовый шум меня не интересует)) Какой там шум у импульсов или какая там крутизна фронтов... мне без разницы. Т.к. я измеряю количество импульсов в единицу времени (например каждые 1 с), а не длительность импульсов по таймеру.
[uquote="рокки1945",url="/forum/viewtopic.php?p=3702156#p3702156"]а измерить период, можно таймером захвата?[/uquote]
Можно. Но показания будут нелинейные. Об это уже сказал Ivanoff-iv.
Можно конечно составить таблицу пересчётов... но нафиг надо)) Ерунда получится...
- GoldenAndy
- Поставщик валерьянки для Кота
- Сообщения: 1925
- Зарегистрирован: Чт июл 28, 2016 07:58:37
- Откуда: Kyiv, UA
- Контактная информация:
Re: счётчик импульсов - тахометр
правильно, обратная зависимость. Превращается в обороты делением константы на период. Я об этом писал.roman.com писал(а):Можно. Но показания будут нелинейные.а измерить период, можно таймером захвата?
По фильтрации. Опять вы предлагаете опрос входа с высокой частотой. Зачем, если речь идет об совершенно конкретном методе измерения с использованием захвата таймера.
На выходе будет получаться длительность периода в тиках таймера.
вот ее можно усреднять или как то фильтровать. Но так, что б с водой и ребенка не выплеснуть.
С другой стороны, в зависимости от оборотов можно усреднять разное число отсчетов - вот и фильтрация. А на малых - ну тут увы. при одном импульсе от таходатчика раз в 2 секунды (30 об/мин) еще и фильтровать это - какие тогда запаздывания показаний будут?
Добавлено after 1 minute 53 seconds:
Вобщем, если будут вопросы по существу - буду что то писать. А от полемики устал, сорри.
Re: счётчик импульсов - тахометр
Уважаемый goldenandy, - сделал простенькую схему -
1. На плате мега8, кварц-8 мгц, вход счётчика T1 - без фильтра, для защиты стабилитрон 5.1 В и последовательно резистор 100 Ом (взял из книжки 1000 и 1 схема для микроконтроллера), семисегментник 4-х разрядный - без транзисторов только ограничительные 4 резистора на управляющие (думаю что этого достаточно). Питание через кренку AMS1117 - 5.0. 2 электролита. Полигоном залил всю плату и к земле.
2. Программу сделал как Вы в первом посте предложили - настройка T1 как счётчик по ниспадающему фронту, таймер 2-ой настроен как счётчик 31250 при обнулении флаг = 1,
в основном цикле показания T1 умножаю на 60 и вывожу на семисегментник (частота обновления 1 раз в секунду).
Потестил - проблем не выявленно.....
1. На плате мега8, кварц-8 мгц, вход счётчика T1 - без фильтра, для защиты стабилитрон 5.1 В и последовательно резистор 100 Ом (взял из книжки 1000 и 1 схема для микроконтроллера), семисегментник 4-х разрядный - без транзисторов только ограничительные 4 резистора на управляющие (думаю что этого достаточно). Питание через кренку AMS1117 - 5.0. 2 электролита. Полигоном залил всю плату и к земле.
2. Программу сделал как Вы в первом посте предложили - настройка T1 как счётчик по ниспадающему фронту, таймер 2-ой настроен как счётчик 31250 при обнулении флаг = 1,
в основном цикле показания T1 умножаю на 60 и вывожу на семисегментник (частота обновления 1 раз в секунду).
Потестил - проблем не выявленно.....
- GoldenAndy
- Поставщик валерьянки для Кота
- Сообщения: 1925
- Зарегистрирован: Чт июл 28, 2016 07:58:37
- Откуда: Kyiv, UA
- Контактная информация:





