| Главная » Статьи » Программирование » Программирование в 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 | |
| Просмотров: 1485 | Теги: |
| Всего комментариев: 0 | |
Корзина
Посетители
Мини-профиль
Воскресенье, 20.05.2012, 20:16
Привет, Смертный
Гость, мы рады вас видеть. Пожалуйста зарегистрируйтесь или авторизуйтесь!
Привет, Смертный
Гость, мы рады вас видеть. Пожалуйста зарегистрируйтесь или авторизуйтесь!
Новое в блогах
| [17.09.2011] | |
| Продолжение моего проекта "Robbe" (2) | |
| [16.09.2011] | |
| Аналог моего проекта))) или наооборот (0) | |
| [15.09.2011] | |
| Монтаж элементов на платы закончен (5) | |
| [12.09.2011] | |
| Заводские платы наконец доставлены (3) | |
Последние комментарии
Написал: MysterySt
Написал: Space
Написал: MysterySt
Написал: MysterySt
Написал: timoff
Написал: Ynui_Tehnik
Написал: Ynui_Tehnik
Написал: kilgur
Написал: Space
Написал: timoff
Категории раздела
| Программирование в BascomAVR [16] Учимся благодаря статьям писать программы. Язык Basic |
| Программирование в CV AVR [4] Учимся благодаря статьям писать программы. Язык Си |
| О программаторах [2] Не много о том как и с помощью чего программировать. |





