Как отследить наличие/отсутствие сигнала?
- Войдите на сайт для отправки комментариев
Добрый день!
У меня есть такая задачка: нужно отследить наличие/отсутствие сигналов (импульсы прямоугольной формы) на входах ардуино. Импульсы берем с датчика КПП и таходатчика автомобиля. Обороты двигателя и скорость движения машины знать не обязательно - пусть этим занимается штатная панель приборов. Нужно отследить следующие события, например: скорость автомобиля нулевая (сигналов с датчика скорости нет), двигатель заглушили - через секунду включить подсветку салона. Или наоборот: двигатель работает, автомобиль поехал - включить ходовые огни.
Пока вижу два варианта:
1. Использовать прерывания. В момент прерываний записывать millis() в две переменные и проверять сколько времени прошло с момента последнего прерывания. Но есть опасения, что обрабатывая два прерывания, частота которых может быть довольно большой, у процессора не останется времени на выполнение остальной программы.
2. В основном цикле программы отслеживать состояние входов. И если состояние изменяется - значит двигатель работает (или машина едет). Тут наверно надо записывать время последнего изменения и последнее состояние. Зато мы не отвлекаемся от основной программы. Единственное что меня беспокоит в этом варианте - скорей всего сигнал будет меняться за несколько циклов loop() поэтому не в каждом цикле мы будем точно знать есть обороты или нет.
Прошу у гуру подсказки как лучше реализовать этот функционал? Может я драматизирую и на прерываниях все будет прекрасно работать. Либо есть какой-то еще вариант?
А что, с КПП прямо мегагерцы валят, чтобы всё блокировать? Полезная нагрузка ардуины - это, по ходу дела, только лампочка.
По примерным прикидкам частоты будут в пределах 400 Гц. В принципе - да, по сравнению с 16кГц это довольно немного. Но кто ж его знает сколько тактов надо процессору на обработку прерывания и запоминание millis() к тому же прерывания будут работать одновременно. Вот это то все меня и смутило.
Попробую тогда сделать на прерываниях, так гораздо проще. Спасибо.
Если сигнал один, то можно подвеситься на Overflow interrupt vector таймера #1 (328P) - тогда достаточно будет парой флагов оперировать, а остальное будет практически на железячном уровне отрабатывать.
А в 328PB уже три таймера могут захватывать сигналы.
для тахометра можно собрать детектор с разделительным конденсатором (ФВЧ) и опрашивать его через АЦП. обороты обычной зажигалки не ниже 600-700 для детектора достаточно. А скорость посадить на прерывание, тогда даже малые скорости можно фиксировать.
алгоритм целиком зависит от фантазии... к примеру если АЦП< хх двигатель заглушен... если машина едет прерывание скидывает некий счетчик (таймер)... если таймер достиг некоторого значения останавливаем его что-то делаем, ставим флаг и ждем следующего прерывания для сброса флага и запуска таймера......... и еще масса вариаций - полет фантазии свободный :))))))))))))
UPD еще вариация заведенного двигателя на тему напряжения бортовой сети - от генератора напряжение всегда выше, чем от аккумулятора, но тут зависит от потребителей....
У меня есть такая задачка: нужно отследить наличие/отсутствие сигналов (импульсы прямоугольной формы) на входах ардуино.
Как-то мне потребовалось быстренько написать функцию получения значения ШИМ. Если частоты в районе 400Гц то можно ее попробовать использовать. Прерывания не используются. Просто тупо много раз опрашивается пин.
Блин, написание комментариев заняло в 3 раза больше времени чем самого кода.