Главная » Статьи » Программирование » Программирование в 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) | | |
Просмотров: 2666 | |
Всего комментариев: 0 | |