Пару месяцев назад я уже выкладывал в своем блоге и сообществе программы для работы с энкодером. Пост назывался «энкодер это просто». Недостатком тех программ было использование задержек для программного подавления дребезга контактов. В обычных устройствах такие задержки вполне приемлемы и не сказываются на качестве выполняемых задач. Но бывают задачи, когда использование задержек непозволительная роскошь, даже если это и не пресловутый delay().
И вот недавно случилось мне заниматься написанием программы для стенда по настройке топливной аппаратуры дизельных двигателей. В программе кроме тахометра, счетчика заданного количества оборотов, кнопок, индикации и т.п. нужно было еще обрабатывать данные с восьми энкодеров. Использование абсолютных энкодеров (ru.wikipedia.org/wiki/Датчик_угла_поворота) проект не предусматривал, поэтому пришлось мучиться с инкрементальными.
Первым делом нужно было избавиться от каких-либо задержек в обработке сигналов. После некоторого «мучения» получился вот такой код.
Несмотря на свою краткость, эта программа вполне успешно справляется со своей задачей.
Можете её использовать в проектах для регулировок, в паяльных станциях, усилителях и т.п.
Но мне нужно было увеличить точность отслеживания перемещения, нужно было реагировать на каждый бит информации.
Как принято говорить, «допилив» программу, получил желаемую точность.
Аппетит приходит во время еды, и на определенном этапе разработки было принято решение обрабатывать каждый энкодер своим контроллером. Использовать ATmega или ATtiny85 (это было в наличии) у которых на борту имеется UART, показалось как-то расточительно.
Выбор пал на ATtiny13… если бы я знал какой это мазохизм то наверное … Впрочем не будем об этом.
В сети есть немного информации по программному UART для ATtiny13, я за основу взял этот листинг.
pastebin.com/NBFMq1C6
Немного его доработал, добавил необходимые обработчики и получил такой себе псевдо абсолютный энкодер. Теперь все восемь энкодеров можно подключить на одну шину и не бояться, что основная программа пропустит какое-то изменение угла.
Всем удачных проектов и красивых решений.