Главная » Статьи » Программирование » Программирование в BascomAVR

Работа с энкодером
   Энкодер - оптоэлектронный датчик для определения отрезков траектории, частоты вращения, позиционирования и тп. Такие, например, стоят в колесиках на мышках, цифровых регуляторах громкости на усилителях и в куче других устройств с регулируемыми параметрами. Это очень удобный тип переключателей, в которых шаг изменения параметра не зависит от диапазона, как в случае с переменными резисторами и АЦП. К тому же энкодеры вращаются "бесконечно". Энкодеры делятся на два вида: механические и оптические.


   Пока решил опробовать механический энкодер. Взял я 5 контактный. 2 контакта для замыкания энкодера, то есть можно нажать как на кнопку. 2 контакта - это выходы энкодера A и B, которые переключаются при повороте ручки:


   В механическом энкодере стоят обычные контактные пластины, которые размыкаются и замыкаются при повороте. У них есть проблема дребезга которую можно решить путём добавления подтягивающих резисторов и кондёров. Еще у них есть характерная особенность - ощутимый щелчок при каждом повороте на один шаг.


   Для устранения дребезга контактов я применил вот такую схему + программно сделал задержку в 5 мс:


Теперь напишем программу для примера, которая будет увеличивать/уменьшать на единицу значение переменной при повороте энкодера и выводить результат на дисплей.

'***************************Тип_микроконтроллера**  ******************************
$regfile = "m16def.dat"                                     ' файл спецификации Меги32
$crystal = 16000000                                         ' указываем на какой частоте будем работать

$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space

Config Pind.2 = Input : Cha Alias Pind.2
Config Pind.3 = Input : Chb Alias Pind.3

$lib "lcd4.lbx"
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2

Dim W As Integer

Config Int0 = Falling                                       ' прерывание INT0 по нисходящему фронту (c + на -)
On Int0 Encod                                               ' вызываем подпрограмму Encod по прерыванию

Enable Interrupts                                           'разрешаем все прерывания
Enable Int0                                                 'резрешаем прерывания для INT0

Cls                                                         ' очистка дисплея
Cursor Off                                                  'отключить курсор

Do

Locate 1 , 1
Lcd "encounter: " ; W ; "     "
Waitms 100

Loop

Encod:

If Cha = 0 Then
If Chb = 0 Then Incr W Else Decr W                  'увеличение/уменьшение переменной на Х
End If
Waitms 5                                                    ' задержка для антидребезга контактов
Gifr = 64                                                   ' Главный регистр флагов прерываний
Return


End

   Вот такая не сложная программа. Если требуется увеличивать/уменьшать переменную не на единицу, а на пример на 5 единиц, то вместо Incr W прописать надо W = W + 5, а вместо Decr W пишем W = W - 5. 
   За счёт энкодера можно рулить сервой. Нужно лишь не много изменить программу.


'***************************Тип_микроконтроллера**  ******************************
$regfile = "m16def.dat"                                     ' файл спецификации Меги32
$crystal = 16000000                                         ' указываем на какой частоте будем работать

$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space

Config Pind.2 = Input : Cha Alias Pind.2
Config Pind.3 = Input : Chb Alias Pind.3

$lib "lcd4.lbx"
Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 16 * 2

Config Servos = 1 , Servo1 = Portd.7 , Reload = 11


Dim W As Byte , X As Byte

Config Int0 = Falling                                       ' прерывание INT0 по нисходящему фронту (c + на -)
On Int0 Encod                                               ' вызываем подпрограмму Encod по прерыванию

Enable Interrupts                                           'разрешаем все прерывания
Enable Int0                                                 'резрешаем прерывания для INT0

Cls                                                         ' очистка дисплея
Cursor Off                                                  'отключить курсор

X = 2

Do

If W > 140 Then W = 40                                      'диапозон значений от 140 до 40
If W < 40 Then W = 140                                      'диапозон значений от 40 до 140

Servo(1) = W

Locate 1 , 1
Lcd "encounter: " ; W ; "     "
Waitms 100

Loop

Encod:

If Cha = 0 Then
If Chb = 0 Then W = W + X Else W = W - X                    'увеличение/уменьшение переменной на Х
End If
Waitms 5                                                    ' задержка для антидребезга контактов
Gifr = 64                                                   ' Главный регистр флагов прерываний
Return


End




Источник: http://enore.ru
Категория: Программирование в BascomAVR | Добавил: Space (25.09.2011) | Автор: Space E W
Просмотров: 2666 | Теги: оптический энкодер, энкодер, bascomavr, механический энкодер, Работа с энкодером
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]