Пример 8. Энкодер и шаттл: ввод цифровой информацииЭнкодер иначе называют датчиком вращения (датчиком угла, датчиком поворота). Шаттл – это современное название элемента, который используется для ввода информации и управления цифровой техникой (музыкальные центры, ресиверы, тюнеры, автомагнитолы и пр.). Работа энкодера и шаттла заключается в выводе определенной последовательности импульсов при вращении вала устройства. Далее мы будем придерживаться названия энкодер, т.к. оно употребляется в официальной документации.
Энкодер современный и оригинальный элемент управления цифровыми устройствами. Энкодер по внешнему виду похож на переменный резистор (см. рисунок ниже). Вращение вала сопровождается щелчками, например 24 щелчка на один оборот. Аналогично работает колесо компьютерной мыши, только в данном случае вращают вал вместо колеса. Энкодер имеет 3 вывода – A, B, C и применяется для быстрого ввода данных в цифровые устройства. Некоторые модели имеют встроенную кнопку (например, PEC12-4220F-S0024), которая срабатывает по нажатию на вал энкодера (добавляется еще один вывод). Это свойство позволяет экономить порты МК: нажатием перебирать режимы, а вращением делать настройку. Например, одной ручкой энкодера можно регулировать громкость, баланс, высокие и низкие частоты и пр. режимы, что требует всего лишь трёх сигнальных линий.
Принцип работы. При повороте на один щелчок, например, вправо, сначала замыкается контакт А+С, затем В+С. Когда в этом щелчке вал доворачивается, в той же последовательности контакты размыкаются. При повороте вала в другую сторону, последовательность замыкания с контактом С меняется, т.е. при повороте влево замыкаются сначала В+С, затем А+С.
 
Приведем пример программы работы с энкодером (например, с использованием энкодера типа PEC12 – Incremental Encoder). Сигнал с вывода А будет использоваться для отслеживания факта вращения, сигнал В – для оценки направления вращения.
LIST P=PIC16F84A
__CONFIG H3FF1
W EQU 0
F EQU 1
PC EQU H0002
STATUS EQU H0003
PORTA EQU H0005
PORTB EQU H0006
TRISA EQU H0005
TRISB EQU H0006
C EQU 0
Z EQU 2
Reg_1 EQU H000C
Reg_2 EQU H000D
Reg_3 EQU H000E
Reg_4 EQU H000F ; регистр под результат
org 0 ; начало программы
; подготовительные моменты
bsf STATUS,5 ; переход в Банк 1
movlw b00011111
movwf TRISA
clrf TRISB
bcf STATUS,5 ; переход назад в Банк 0
; отрисовка нуля и подготовка регистра (очистка перед изменением)
movlw b01101111
movwf PORTB
clrf Reg_4
;====================================
; отслеживание вращения вала энкодера
En btfsc PORTA,0 ; старт от исходного значения (0 или 1)
goto en1
goto en2
en1 btfsc PORTA,0 ; выход на единицу
goto en1
goto en3
en2 btfss PORTA,0 ; выход на ноль
goto en2
goto en4
en3 call Pause ; задержка (антидребезг)
btfss PORTA,0 ; проверка на единицу
goto En
goto en5
en4 call Pause ; задержка (антидребезг)
btfsc PORTA,0 ; проверка на ноль
goto En
goto en5
; отслеживание направления вращения
en5 btfsc PORTA,1
goto en6
goto en7
en6 call Pause ; задержка (антидребезг)
btfsc PORTA,1 ; проверка на единицу
goto min ; уменьшение
goto En
en7 call Pause ; задержка (антидребезг)
btfss PORTA,1 ; проверка на ноль
goto max ; увеличение
goto En
;====================================
; проверка на ноль (на крайнее значение) и уменьшение значения регистра
min bcf STATUS,Z ; опустим флаг Z в ноль
movf Reg_4,F ; копировать из Reg_4 в Reg_4
btfsc STATUS,Z ; делаем бит-проверку Z-флага
goto m4 ; переходим на отрисовку значения
decf Reg_4,F ; уменьшить значение на 1 и сохранить
goto m4
; проверка на 9 (на др. крайнее значение) и увеличение значения регистра
max bcf STATUS,C ; опускаем флаг С в ноль
movlw .247 ; (255-9)+1 = 247 -> W
addwf Reg_4,W ; (Reg_4)+W
btfss STATUS,C ; делаем бит-проверку C-флага
goto m5
goto m4
m5 incf Reg_4,F ; увеличить значение на 1 и сохранить
m4 movf Reg_4,W
call TABLE
movwf PORTB
call Pause2
goto En
;====================================
TABLE addwf PC,F ; Содержимое счетчика команд PC = PC + W
retlw b01101111 ; 0
retlw b00001100 ; 1
retlw b01011011 ; 2
retlw b01011110 ; 3
retlw b00111100 ; 4
retlw b01110110 ; 5
retlw b01110111 ; 6
retlw b01001100 ; 7
retlw b01111111 ; 8
retlw b01111110 ; 9
;====================================
;delay = 100 machine cycles
Pause movlw .33
movwf Reg_1
wr decfsz Reg_1, F
goto wr
return
;delay = 50000 machine cycles
Pause2 movlw .238
movwf Reg_1
movlw .65
movwf Reg_2
wr2 decfsz Reg_1, F
goto wr2
decfsz Reg_2, F
goto wr2
return
end ; конец программы
Ниже текст прошивки:
:020000040000FA
:1000000083161F308500860183126F3086008F01B2
:1000100005180B280E2805180B281128051C0E287A
:1000200015284120051C08281928412005180828F2
:10003000192885181C2820284120851824280828DC
:100040004120851C2A28082803118F08031931280C
:100050008F0331280310F7300F07031C3028312895
:100060008F0A0F08362086004620082882076F3442
:100070000C345B345E343C34763477344C347F3427
:100080007E3421308C008C0B43280800EE308C002D
:0E00900041308D008C0B4A288D0B4A28080049
:02400E00F13F80
:00000001FF
Если предполагается низкая скорость вращения – задержки увеличивают, иначе их можно уменьшить. Задержки для подавления дребезга подбираются экспериментально. Ниже приводим схему подключения энкодера к макетной плате (обозначение элемента нам ранее не встречалось, соответственно, предлагаем свой вариант).

Далее рисунок печатной платы (вид со стороны печати).

Вид со стороны элементов.

Фотография собранного и подключенного к макетной плате энкодера.

На данной плате смонтирован энкодер со встроенной кнопкой. В связи с этим плата разведена с учетом этой особенности на перспективу использования.
Алгоритм работы с энкодером и шаттлом можно использовать для создания устройства, подсчитывающего количество людей, входящих и выходящих в помещение. Алгоритм найдет применение в автоматизации работы турникетов. В качестве датчика можно применить пару простейших оптических приемников и передатчиков.
(В данном примере энкодер обслуживается путем опроса сигнальных линий; по-взрослому энкодер должен обслуживаться по факту прерываний; прерывания будут рассмотрены далее).
|