Карма: 38
Рейтинг сообщений: 292
Зарегистрирован: Пт сен 07, 2018 20:20:02 Сообщений: 2594 Откуда: деревня в Тульской губернии
Рейтинг сообщения:0 Медали: 1
goldenandy, такой циклический таймер я использую один на всё. Его задача измерять все промежутки времени, которые потребуется. А прерывание GPIO все равно общее на порт - там и разбираюсь с пинами по необходимости. Очень короткие импульсы вызвавшие прерывание, но не подтвержденные при чтении из порта в обработчике прерывания игнорируются. Такой подход позволяет успешно обрабатывать одновременно и целый ряд кнопок, датчиков и даже принимать данные от ИК приемника. Есть проекты, где этот же таймер занимается ещё и ШИМированием, но тогда он должен быть 16- битным.
ПростоНуб, Нененене, у восьмой меги нет одного прерывания на порт! Там только Int0 и Int1
А вообще правильно. У каждого свой подход. Я постарался уйти от длинных обработчиков прерываний, предпочитаю один таймер выделить под sysClock и привязывать процессы не к прерыванию таймера, а к изменению системного счетчика... И прерывания только выставляют флаги срабатывания, а обработка идет в основном цикле программы.
Карма: 38
Рейтинг сообщений: 292
Зарегистрирован: Пт сен 07, 2018 20:20:02 Сообщений: 2594 Откуда: деревня в Тульской губернии
Рейтинг сообщения:0 Медали: 1
goldenandy, я тоже не использую длинные прерывания. Из прерывания просто помещаю сообщения с временной меткой в кольцевой буфер, а оттуда уже фоновый обработчик эти сообщения разгребает. При наличии временной метки можно уже не беспокоиться о времени обработки конкретного сообщения, пока размера буфера хвататет. А про восьмую мегу и впрямь забыл. Как то получалось подобные задачи решать на STM8, а там подобных проблем нет. И с делением, кстати, тоже )
Сделал со счётчиком, обновление 1 раз в секунду, вроде всё работает. Но хотелось бы чтобы показания не прыгали... Как этого достичь? Может сделать вывод 10 раз в секунду, или выборкой? Подозреваю что оверсемплинг и есть выборка...
Открыта удобная площадка с выгодными ценами, поставляющая весь ассортимент продукции, производимой компанией MEAN WELL – от завоевавших популярность и известных на рынке изделий до новинок. MEAN WELL.Market предоставляет гарантийную и сервисную поддержку, удобный подбор продукции, оперативную доставку по России.
На сайте интернет-магазина посетители смогут найти обзоры, интересные статьи о применении, максимальный объем технических сведений.
рокки1945, а чего им прыгать раз в секунду при стабильном входном сигнале? Хотите чаще - при прямом счете будет еще более грубая шкала. 2 раза в секунду мерять - шаг будет 120 оборотов.... Можно взять массив, допустим в 4 элемента, писать ежесекундные показания в массив по кругу, выводить на экранчик сумму всех элементов массива, деленную на 4. тогда у вас в каждый момент времени будет среднее от последних четырех показаний. Но при изменениях оборотов будет запаздывание отображения до 4х секунд.
Хотите более точное отображение и чаще чем раз в секунду - меряйте период импульсов...
Продукция MOSO предназначена в основном для индустриальных приложений, использует инновационные решения на основе более 200 собственных патентов для силовой электроники и соответствует международным стандартам. LED-драйверы MOSO применяются в системах наружного освещения разных отраслей, включая промышленность, сельское хозяйство, транспорт и железную дорогу. В ряде серий реализована возможность дистанционного контроля и программирования работы по заданному сценарию. Разберем решения MOSO
подробнее>>
Но хотелось бы чтобы показания не прыгали... Как этого достичь?
Выше писал как...
roman.com писал(а):
полученные данные пропускаем через фильтр - гистерезис (что бы показания на индикаторе не "прыгали")
рокки1945 писал(а):
Может сделать вывод 10 раз в секунду, или выборкой?
Будет в 10 раз быстрей прыгать))
goldenandy писал(а):
Можно взять массив, допустим в 4 элемента, писать ежесекундные показания в массив по кругу, выводить на экранчик сумму всех элементов массива, деленную на 4.
Будет в 4 раза медленней прыгать))
goldenandy писал(а):
а чего им прыгать раз в секунду при стабильном входном сигнале?
А потому что входной сигнал аналоговый, а выходной цифровой)) Как вы это делаете, c помощью таймера или АЦП, это не имеет значение. Смысл один - Вы переводите аналоговые величины в дискретные. Любой аналоговый сигнал содержит шумы. А ещё есть такое понятие - Шум квантования - https://ru.wikipedia.org/wiki/Шум_квантования
Единственный способ чтоб не "прыгало" это фильтр - гистерезис. Принцип предельно прост. Вводится (программно) "зона не чувствительности" к малым изменениям сигнала.
Допустим двигатель 120 оборотов. Индикатор показывает 120 оборотов. -При изменении на +/- 1 оборот индикатор продолжает показывать 120 оборотов. -При изменении на +/- 2 оборота индикатор показывает 118 или 122 оборотов соответственно.
По сути обычный Три́ггер Шми́тта, только программный, где +/- 1 оборот - это гистерезис Три́ггера Шми́тта.
Только так вы избавитесь от "прыганья" последних разрядов индикатора.
Да, это вносит погрешность +/- 1 оборот, но тут выбирайте сами, что вам важней: точность или чтоб не "прыгало" ))
сделал просто - счётчик T1 настроен по спадающему фронту, этот же вывод подтянут к плюсу питания. 1 раз в секунду считываю регистр TCNT1 и скидываю по UART-у.. Проверил сначала генератором с осциллографа (встроенный 1 кГц меандр) потом сделал еще одну атмегу с шимом в 62 герца и ВСЁ нормально..... только в первом случае счётчик выдаёт 1004 а во втором 63.... Погрешность не пропадает и с фильтром, подсчёт ровно по переполнению таймера ............ Вопрос у меня один как это всё выводить на семисегментники (динамическая индикация - ? tm1637 - ?) частота обновления тоже 1 раз в секунду?
roman.com, А потому что входной сигнал аналоговый, а выходной цифровой/ Не подменяйте понятия. Входной сигнал цифровой, в идеале - меандр. Но с неизвестной длительностью. А при примененном ТС алгоритме показания не могут прыгать на +/-1 единицу. Еще раз вчитайтесь - меряем секунду, умножаем на 60 - получаем обороты в минуту. Показания прыгают сразу на 60 единиц. Ибо всегда кратны 60. И никаким гистерезисом это не вылечится, ибо будет конская погрешность. Скользящий фильтр, теоретически, эти прыжки может попытаться усреднить. Но ценой запаздывания показаний. Оптимально, с моей точки зрения, мерять период сигнала, а потом уже этот период как то усреднять на средних и высоких оборотах, что бы показания не менялись чаще пары раз в секунду....
я сглаживаю более частым замером - для твоего случая я бы делал замера 4 в секунду, результаты в кольцевой буфер длинной 8 элементов... и 4 раза в секунду суммировал бы все элементы массива и делил на 2 для получения Гц. (*30 для имп/мин) (устаканивание 2 с, обноление показаний 4 Гц), потом можно и другие фильтры применить, типа гистерезиса... можно мзмерять и наоборот - засекать время между импульсами, для этого какраз и пригодится вход захвата... данный метод имеет максимальную точность при низких оборотах, а с ростом оборотов точность падает, првышают её в этом случае, или пропуская импульсы (если в регистре захввта мало - ждём следующий импульс и инкрементируем счетчик пропущенных импульсов) или повышая скорость счёта таймера... Чтобы получить результат в Гц или об/мин нужно разделить частоту счёта таймера на величину регистра захвата...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Карма: 38
Рейтинг сообщений: 292
Зарегистрирован: Пт сен 07, 2018 20:20:02 Сообщений: 2594 Откуда: деревня в Тульской губернии
Рейтинг сообщения:0 Медали: 1
Ivanoff-iv, тогда уж лучше медианный фильтр применять, но результат округлять до требуемой точности. Тогда колебания значений в пределах погрешности влиять на отображаемый результат не будут, а резкая смена оборотов приведет к резкой, а не плавной (как при усреднении) смене показаний
Не подменяйте понятия. Входной сигнал цифровой, в идеале - меандр. Но с неизвестной длительностью. А при примененном ТС алгоритме показания не могут прыгать на +/-1 единицу.
на +/-1 единицу - это просто пример, поясняющий принцип работа фильтр - гистерезиса. В реальной жизни всё иначе.
Я не подменяю понятия. Любой сигнал имеет шум. Идеальных сигналов в природе не существует)) Например синусоида:
Вы измеряете длительность импульсов (или скважность, или период... не важно). Таймер 16 разрядный ? (65536 разрядов). А теперь измерьте длительность импульсов, с учётом фазового шума меандра. Какая у вас будет погрешность измерения ? 1, 2, 3 разряда ? ))
Я уже молчу, что кроме фазового шума меандра есть ещё кратковременная стабильность кварцевого генератора МК.)) И т.д. и т.п. Поэтому, после измерения длительности импульсов, сначала пропускаем полученные данные через фильтр - гистерезис (убираем шум), а потом уже делайте с этими данными что хотите... Умножайте, делите, записывайте в массив... ищите среднее... делайте скользящее окно... и т.д.
Ivanoff-iv писал(а):
я сглаживаю более частым замером - для твоего случая я бы делал замера 4 в секунду, результаты в кольцевой буфер длинной 8 элементов... и 4 раза в секунду суммировал бы все элементы массива и делил на 2 для получения Гц. (*30 для имп/мин) (устаканивание 2 с, обноление показаний 4 Гц), потом можно и другие фильтры применить, типа гистерезиса...
Гистерезис лучше применять на начальном уровне обработки сигнала. "потом" гистерезис не поможет)) Будет только хуже.
А я просто увеличиваю частоту опроса датчика Холла в два раза (до 16 кГц). Затем пропускаю через фильтр - гистерезис, чтобы убрать неопределённость, т.к. у меня таймер не привязан к сигналу датчика и соответственно возникает биение. При этом точность измерения такая же, как при частоте опроса 8 кГц, и при этом показания не прыгают.)) При этом фазовый шум меня не интересует)) Какой там шум у импульсов или какая там крутизна фронтов... мне без разницы. Т.к. я измеряю количество импульсов в единицу времени (например каждые 1 с), а не длительность импульсов по таймеру.
правильно, обратная зависимость. Превращается в обороты делением константы на период. Я об этом писал.
По фильтрации. Опять вы предлагаете опрос входа с высокой частотой. Зачем, если речь идет об совершенно конкретном методе измерения с использованием захвата таймера.
На выходе будет получаться длительность периода в тиках таймера. вот ее можно усреднять или как то фильтровать. Но так, что б с водой и ребенка не выплеснуть.
С другой стороны, в зависимости от оборотов можно усреднять разное число отсчетов - вот и фильтрация. А на малых - ну тут увы. при одном импульсе от таходатчика раз в 2 секунды (30 об/мин) еще и фильтровать это - какие тогда запаздывания показаний будут?
Добавлено after 1 minute 53 seconds: Вобщем, если будут вопросы по существу - буду что то писать. А от полемики устал, сорри.
Уважаемый goldenandy, - сделал простенькую схему - 1. На плате мега8, кварц-8 мгц, вход счётчика T1 - без фильтра, для защиты стабилитрон 5.1 В и последовательно резистор 100 Ом (взял из книжки 1000 и 1 схема для микроконтроллера), семисегментник 4-х разрядный - без транзисторов только ограничительные 4 резистора на управляющие (думаю что этого достаточно). Питание через кренку AMS1117 - 5.0. 2 электролита. Полигоном залил всю плату и к земле. 2. Программу сделал как Вы в первом посте предложили - настройка T1 как счётчик по ниспадающему фронту, таймер 2-ой настроен как счётчик 31250 при обнулении флаг = 1, в основном цикле показания T1 умножаю на 60 и вывожу на семисегментник (частота обновления 1 раз в секунду). Потестил - проблем не выявленно.....
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 227
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения