Как легко подсчитать импульсы от энкодера с микроконтроллером?

Доброе утро!

Извините, если мой вопрос является самым «задаваемым» в мире, но я хотел бы, чтобы вы очистили мой разум!

У меня есть проект: каким-то образом подсчитать импульсы, поступающие от энкодера. Программа сохранит в качестве входных данных значение «предел», которое пользователь может изменить «во время выполнения» (например, программа считывает ввод в потоке и сохраняет переменную для следующего цикла «счетчика» потока). Частота должна быть до 100 кГц, 50 кГц достаточно, но кто знает... было бы лучше иметь более высокую производительность... Каждый раз, когда счетчик потока достигает предела, выдает цифру на выходе.

Программа на микроконтроллере должна быть на C; счетчик никогда не должен терять ни одного импульса (надежность обязательна).

Это все, что я знаю о проекте на данный момент, но я не думаю, что у меня будет что-то еще конкретное...

Реальный вопрос: какой микроконтроллер мне использовать из рекламы? Ардуино? Малина? И если я использую Raspberry, рискую ли я ТАК делать что-то в фоновом режиме, теряя импульсы? А как же Бигльбоун? Есть ли какой-нибудь проторенный путь решения этой проблемы (некоторая документация и руководство по конкретному микроконтроллеру)?

Повторюсь, у меня нет невероятных особенностей, кроме надежности! И извините, если я спросил, что-то уже обсуждалось, но я действительно запутался в лучшем и простом решении! И, пожалуйста, относитесь ко мне как к худшему из новичков, потому что, возможно, так оно и есть!

Большое спасибо, ребята, за вашу доброту!


person Francesco Zanel    schedule 13.12.2016    source источник
comment
да, вы можете, много совершенно правильных решений, так что это немного широкий вопрос. Может быть программным, или некоторые чипы имеют таймеры или другие периферийные устройства, которые вы можете активировать из внешних источников, чтобы они выполняли подсчет за вас.   -  person old_timer    schedule 13.12.2016


Ответы (3)


Определенно вы не хотите использовать что-либо с операционной системой Linux или Windows (например, Raspberry, Beaglebone и т. д.), потому что они не работают в режиме реального времени, и вы не можете быть уверены, что не пропустите любой пульс.

Почти любого современного микроконтроллера, запрограммированного на чистом C, должно хватить. Если вы возьмете AVR (например, Atmega8 или Atmega16 или даже Attiny2313) с тактовой частотой 8 МГц и вашим целевым разрешением 100 кГц, у вас будет 80 циклов ЦП на один импульс. Этого определенно должно быть достаточно, если вы используете аппаратное прерывание для обнаружения импульса. Чтобы быть уверенным - два пути:

  1. Анализ кода (сборка) после компиляции. Вы увидите, сколько инструкций у вас есть в вашей подпрограмме обслуживания прерывания. Затем с вашей таблицей данных микроконтроллера вы можете подсчитать подробное количество циклов, которое потребуется
  2. Подключите генератор сигналов, установите его на прямоугольную волну и посмотрите, на какой частоте вы начинаете терять импульсы. Если ваша целевая частота в 2-3 раза меньше, вы находитесь в безопасном диапазоне.

После того, как вы закончите часть со счетом, вы можете отправить количество импульсов, например. каждую секунду на какой-либо высокоуровневый компьютер/программное обеспечение, например, с использованием UART или SPI. Но это, конечно, зависит от ваших требований к дизайну.

person Mazi    schedule 14.12.2016

В Arduino Due есть два канала для квадратурных энодеров (QDEC), но оригинального «нет в наличии». Некоторые вопросы по этому поводу были в Arduino SE: Как настроить выводы ввода-вывода второго квадратурного декодера в Arduino IDE и Чтение двух квадратурных энкодеров с использованием одного Arduino Due

Без этого вы должны использовать прерывания. Однако для частот около 100 кГц вам может понадобиться более быстрая Arduino (на базе ARM) или внешний аппаратный декодер.

Что-нибудь например:

введите здесь описание изображения

и двунаправленный счетчик например...

person KIIV    schedule 13.12.2016

Вы можете использовать микроконтроллер (например, AVR) или Arduino (большинство из которых также использует микроконтроллер avr). Для чтения импульсов вы можете использовать функцию внешнего прерывания и функцию таймера. Внешнее прерывание используется для увеличения количества оборотов в секунду, которое запускается энкодером, а функция таймера используется для сброса счетчика оборотов в секунду после расчета общего оборота «х»-времени (т.е.: 1 сек)

person cureinside    schedule 19.12.2016