Недавно я опубликовал статью "Декодер для энкодера. Аппаратный и программный", где кроме описания работы энкодера привел готовые способы работы с ним. Как всегда, мнения читателей разделились. Об "банальщина" до "а так точно будет работать?".
Вопросы по статьям задают не только в комментариях, но и через Мессенджер. Я все таки предпочитаю обсуждать статьи через комментарии.
Поэтому я все решил написать еще одну статью про энкодеры, где более подробно затрону вопросы, которые посчитал "очевидными" в предыдущей статье. Заодно отвечу и на некоторые вопросы. Данную статью нужно рассматривать как дополнение предыдущей.
В статье, в примерах, будет использоваться энекодер PEC16-4220F-S0024. Вот его, нужные для данной статьи, параметры
- 24 щелчка на полный оборот вала. Как я ранее уже говорил, "щелчок" это физически ощутимое положение, фиксированное положение, при вращении вала.
- 24 импульса на полный оборот вала
- максимальное время дребезга контактов 5 мс
- Максимальная скорость вращения вала 100 об/мин. Это скорость, при которой еще гарантируется устойчивая работа энкодера.
Фазовый сдвиг и временнЫе параметры импульсов
В документации на энкодеры обычно указывают число импульсов за полный оборот вала и приводят идеализированную диаграмму, показывающие фазовые соотношения между импульсами фаз. При этом ни длительность импульсов, ни скважность, ни время задержки между фазами не указывается. По той простой причине, что эти параметры не важны.
Тем не менее, не редко у новичков по ним возникают вопросы. Поэтому я немного уделю им внимание.
Длительность импульсов и период
Начну с длительности импульсов. Вполне очевидно, что период следования импульсов фаз зависит от скорости вращения вала и количества формируемых за полный оборот вала импульсов.
Для PEC16, который и будет нам сегодня служить примером, максимальная скорость вращения 100 об/мин. При этом формируется 24 импульса за каждый полный оборот. То есть, за 1 секунду на максимальной скорости будет формироваться 40 импульсов (24*100/60). А это дает минимальный период следования импульсов 25 мс.
При этом никто не гарантирует, что скважность импульсов будет равна двум. Длительность замкнутого состояния зависит и соотношения между длиной контактной площадки и расстоянием между площадками. Вот, для примера, осциллограмма с энкодера PEC16
Длительность импульса (замкнутого состояния контактов) в данном случае равна 10 мс (специально старался так вращать вал). А период примерно 36 мс. В вашем энкодере соотношение может быть иным. Но совершенно не обязательно длительность импульса будет равна половине периода.
Сдвиг фаз
Следующий часто возникающий вопрос - на какое время сдвинуты сигналы фаз? На этот вопрос нет однозначного ответа, так как временной сдвиг зависит не только от механических параметров контактов, но и от скорости вращения. Как и длительность импульсов.
Тем не менее, иногда приводится минимальная величина сдвига выраженная в процентах или угловых величинах. И то, и другое, является относительными величинами.
Сдвиг в процентах указывается относительно длительности периода. То есть, если указано, что минимальный сдвиг между фазами составляет 10%, то для PEC16 при максимальной скорости вращения сдвиг будет равен 2.5 мс (25/10). А для примера показанного на осциллограмме 3.6 мс (период 36 мс).
Угловой сдвиг, в общем то, тоже обычно задается относительно длительности периода. Длительность периода принимается равной 360 градусам (2π радиан), как и для синусоидального сигнала. Для 25 мс периода это дает 14.4 градуса на 1 мс. Те же самые 2.5 мс дадут угол 36 градусов. Или 0.2π радиан.
Особенности энкодеров
Про гашение дребезга кнопки я уже писал статью "Работаем с кнопками. Или о дребезге контактов и не только о нем". Поэтому рекомендую сначала прочитать ее. Там рассказано и о явлении дребезга, и о способах борьбы с ним, как аппаратно, так и программно. Что бы мне не повторяться.
Но энкодеры имеют некоторые особенности, которые я и кратко рассмотрю. Основной особенностью энкодеров (механических), по сравнению с кнопками, является скользящий контакт.
Черным цветом показаны дорожки, которые нанесены на подвижной части энкодера, которая закреплена на валу. Скользящие контакты установлены на неподвижной части энкодера (корпус). Конструкция может быть иной, но суть сохраняется.
Дорожка износа это след оставляемый скользящими контактами при вращении вала. Износ это неизбежное явление. Изнашиваются и сами скользящие контакты, и неподвижные дорожки в местах скольжения контактов. При этом продукты износа (металлическая пыль) постепенно заполняют и промежутки между контактами дорожки, как грифель карандаша оставляет след на бумаге.
Поэтому кроме собственно дребезга контактов, который возникает при замыкании/размыкании контактов, здесь присутствует и нестабильность сопротивления между скользящими парами контактов. А загрязнения в между контактами приводят уменьшению сопротивления между разомкнутыми контактами.
Вот осциллограмма для сильно изношенного энкодера, который был снят при ремонте устройства
Здесь основная проблема в крайней нестабильности сопротивления замкнутого состояния контактов. На самом деле, аппаратными средствами можно добиться устойчивой работы даже с таким энкодером. Но проще его заменить.
Гашение дребезга
Если вы еще не прочитали статью о работе с кнопками, все таки прочитайте. Там я рассказывал о гашении дребезга довольно подробно, в том числе, с примерами программ. И в статье "Декодер для энкодера. Аппаратный и программный" я использовал некоторые из ранее рассмотренных методов.
Вот осциллограмма дребезга реального энкодера PEC16
Аппаратное гашение
Я уточню лишь один момент в данной статье - почему контакты энкодера не подключены просто параллельно конденсатору. Дело в том, что у энкодеров контакты довольно нежные. И накопленной в конденсаторе, даже 0.1 мкФ, энергии достаточно для их ускоренного износа.
При этом конденсатор разряжается в два раза быстрее, чем заряжается. А это дополнительно повышает подавление самой неприятной помехи, от нестабильности сопротивления между замкнутыми контактами.
Программное гашение
В программе я использовал ранее описанный способ (ссылку на статью о дребезге я уже приводил) дискретизации состояния контакта
Алгоритм дискретизации чрезвычайно прост
- Сдвигаем байт, хранящий информацию о состоянии контактов для последних 8 отсчетов, влево.
- Заносим в младший бит байта текущее состояние контактов
- Пауза до следующего отсчета
- Переход к шагу 1
Это алгоритм в его чистом виде. В реальных программах он в таком виде не используется. В программе из предыдущей статьи я использовал интервал дискретизации 0.5 мс. Поскольку устойчивыми состояниями контактов считаются состояния отсчетов 0 и 0xFF, максимальная длительность импульса дребезга, который мы можем погасить, равна 4 мс.
На самом деле, это излишне пессимистичное решение, но оно основано на реальном опыте. В принципе, можно уменьшить время до 2 мс (дискретизация каждые 250 мкс).
Дождавшись устойчивого состояния контактов мы можем сравнить его с предшествующим. И на основании этого сделать вывод о приходе положительного фронта импульса на фазе В, которое и используется для анализа устойчивого состояния фазы А.
Влияние гашения дребезга на фазовый сдвиг
Был задан вопрос, не приведет ли такая задержка из-за гашения дребезга к нарушению временных соотношений между фазами?
Нет, не приведет. По той причине, что идентичные методы гашения дребезга применяются к обеим фазам, а не к какой то одной. Это касается и аппаратного гашения, и программного.
При этом программный метод можно назвать адаптивным, поскольку нет жесткого времени гашения, есть лишь требование устойчивого состояния за последние 8 отсчетов. И здесь возможен некоторый дополнительный, вносимый гашением, сдвиг фаз. Но на работу декодера он не влияет. И это подтверждается многолетним опытом использования такого программного метода гашения дребезга, в самых разных устройствах. Причем не единичных.
О способе декодирования состояний энкодера
Действительно, многие из описываемых в интернете способы работы с энкодерами используют анализ обеих фаз энкодера. Однако, этот способ излишен, так состояние однозначно определяется уровнем фазы А при положительном фронте фазы В. Другие возможные варианты я упоминал в предыдущей статье. И метод декодирования с использованием D-триггера придуман не мной, причем давно, еще в чисто аппаратных решениях.
Заключение
Вот собственно и все на сегодня. Такое небольшое уточняющее дополнение к статье о работе с энкодерами. С ответами на заданные вопросы.