Счетчик топлива. (подсчет поочередных импульсов от двух датчиков)
- Войдите на сайт для отправки комментариев
Пнд, 09/11/2020 - 23:49
Подскажите алгоритм подсчета поочередных импульсов с датчиков.
Есть електронный счетчик топлива MGE110 с дисплеем. Он умеет только отобразить объем. А мне надо управлять насосом. Я вижу такой выход: подключиться к датчикам оборотов (похоже на геркон, на плате даже есть розъем с сигналами от этих датчиков) счетных овальных шестеренок и соорудить свой счетчик на ардуинке.
Подключил ардуино, по отдельности кажется щитает нормально. Но вот пока никак в голову не придет алгоритм для сведения этих сигналов в сумму. Не просто суммировать количество, а учитывать только поочередные импульсы кроме первого (a-b-a-b-a-b-a-b = 7имп; a-b-b-a-a-b-b = 3имп).
Откуда a-a-a и b-b-b ббберутся у Вас? Там же двоичный код должен быть?...
a,b - импульс с первого и второго датчика соответственно. Нет там двоичного кода (не нашел, а было бы проще).
Если по простому, то датчики срабатывают по очереди и мне надо посчитать количество срабатываний,но исключить дубли от одного датчика.
у вас с одного датчика выходят два сигнала? Если да, то они код выдают, подключите библиотеку энкодера и проверьте
Ищите, должны быть коды... Обязаны!))
Сами то (хоть примерно) поняли как «отфильтровать»?
у вас с одного датчика выходят два сигнала? ...
нет, датчика - 2 и сигналов - 2. При вращении измерительного механизма датчики замыкаются поочередно.
Ищите, должны быть коды... Обязаны!))
Не спорю, может они и есть, но пока до осцила еще не дожился. До проца также не добраться - он под большим ЖК дисплеем. Пока буду розбираться с тем что есть.
Сами то (хоть примерно) поняли как «отфильтровать»?
Примерно так: при каждом срабатывании датчика (первого или второго) проверять была ли сработка "напарника" и если "да" то добавлять единицу к общей сумме и выставлять флаги. Но пока затрудняюсь как правильно расставить флаги. Первый импульс может быть как с "А" так и с "B" датчика.
Вам же уже сказали
подключите библиотеку энкодера и проверьте
Спасибо за пинок в нужном направлении, сама библиотека мне совсем не помогла, но попался кусок кода (всеми "любимого" Гайвера) обработчика энкодера который я подогнал под свои нужды и ПОКА (на столе) работает как надо.
Может кому пригодится:
Продолжу здесь.
Соорудил минимально необходимый алгоритм для обработки счетчика, на столе (магнит в руке) работает нормально. Но вот в железе - пропускает импульсы. Из 820 ипм насчитывает 780-800, при коеф. 42 имп на литр это уже большая погрешность.
Вот такой сигнал на входах.
Что уже проверял:
1. Питание платы брал от отдельного акумулятора - никакой разницы.
2. При отключении програмной проверки поочередности сигнала (считает все срабатывания) количество импульсов растет в 3-4 раза и количество плавает уже на несколько сотен единиц.
Подскажите алгоритм как найти виновника
Serial-у не место в обработчике прерывания.
Чтение volatile-переменной без обеспечения атомарности может привести к разным спецэффектам.
Предыдущий код был для изучения его "на столе", в проэкте сейчас этот работает. У меня также была догадка что из прерываний нужно убрать по максимуму.
https://github.com/PaulStoffregen/Encoder/blob/master/examples/Basic/Basic.pde
Проконтролируйте на этом скетче.
Проконтролируйте на этом скетче.
Спасибо!
Подключил эту библиотеку к своему проекту и все работает ! Правда выдает количество импульсов *2 но в данном случае это не критично, главное повторяемость результата, пока прогнал пару раз - все отлично!
п.с. таки да, не спроста тут хают код гайвера, а я думал сэкономлю место на библиотеке вставив несколько строчек кода. Теперь уже взял для проэкта мини на 32кб, теперь места хватит.
Сразу еще вопрос:
Хочу еще сделать связь по Serial из еще одним блоком, для обмена данными. частота обмена не критична, около 0.5-1 Гц
Вопрос: не помешают ли прерывание обмена для правильного подсчета импульсов.
Слишком абстрактный вопрос. Ни скорости обмена, ни алгоритма, ни объема данных, ни указания по какому сериалу - софтовому или нет.
Поставьте куда-нить println и посмотрите - будут или нет сбиваться показания с приемом частоты с генератора.
Да, но главное что правильный: действительно может мешать работе!
В принцыпе я планирую отправлять и принимать каждую секунду по апаратному или софт сериалу до 10 байт (поточный расход, указание остановки, режим работы...)
Для передачи планирую использовать радиомодуль прозрачний для UART. Вопрос: какой сериал предпочтительней для такой стуации, апаратный или софт? Если софт то порекомендуйте адекватную библиотеку.
Скорость обмена будет небольшая (для нормальной работы радиомодуля)
Спасибо!
Софтовый точно прерывания запретит на передаче. И тут уже зависит от скорости , на которой он работает. При слишком медленной есть шанс напропускать тики.