Главная » Статьи » Как подключить |
Энкодер и Bascom-AVR. Счетчик импульсов
В проектах на микроконтроллерах для ввода какой-нибудь пользовательской информации чаще всего используются тактовые кнопки. Для оперативного изменения параметров, когда нужно быстро изменить значение например с 0 до 50, такое решение не самый лучший вариант. Давить на кнопку 50 раз или вводить в программу распознавание долгого нажатия кнопки не наш метод, поэтому обратим внимание на инкрементальный энкодер.
Разговор пойдет о механическом энкодере, как самом распространенном типе. Оптоэлектрические энкодеры отличаются лишь тем что требуют дополнительного питания светодиода, в остальном принцип работы схож с механическими собратьями. Механический энкодер внешне очень похож на переменый резистор, такой же трехногий и с крутилкой. Но в отличии от переменника, энкодер не имеет фиксаторов угла поворота, тоесть его можно крутить сколько угодно.
К примеру вот механический энкодер выдернутый со старой мышки:
Внутри у него находятся контактные площадки и контакты, которые при повороте замыкают эти площадки по хитрому алгоритму:
При повороте ручки на двух выводах энкодера появляются импульсы, смещенные относительно друг друга на 90 градусов. Именно это позволяет микроконтроллеру определить направление вращения. Для определения направления требуется завести один импульс (М1) на любую ногу прерывания (например INT0), а второй импульс (М2) на любую свободную ногу микроконтроллера. Общий вывод энкодера обычно сажается на землю.
Затем в программе заводим и разрешаем прерывание (у нас это INT0). Прерывание настраивается по нисходящему импульсу (когда уровень меняется с логической 1 на логический 0). В обработчике прерывания проверяем состояние на ноге куда завели импульс с М2. Если там 0 (тоесть импульс пришел) выполняем одно действие, если там осталась единица (импульс не пришел) - другое действие.
Также прерывание можно настраивать и на положительный фронт импульса (когда логический уровень меняется с - на +), разницы большой нет.
Можно заметить, что аналогией энкодера могут служить две кнопки, замыкающие два выхода на общий вывод.
Для примера решил собрать очень простой счетчик импульсов на attiny2313, позволяющий считать до 65535 как в прямом так и в обратном направлении. Схема приведена ниже. В качестве индикатора использованы семисегментные индикаторы с общим анодом (5 разрядов, на схеме один разряд не используется).
Можно также подтянуть выходы энкодера к шине питания, на случай сильных наводок (резисторами по 10к будет достаточно). Я обошелся внутренними подтягивающими резисторами, стоящими в самом мк.
А вот собственно код в Bascom-AVR:
$regfile = Attiny2313.dat
$crystal = 8000000 Dim W As Word Dim N1 As Byte Dim N2 As Byte Dim N3 As Byte Dim N4 As Byte Dim N5 As Byte Dim N6 As Byte Dim M1 As Long Dim M2 As Long Dim M3 As Long Dim M4 As Long Dim M5 As Long Dim M6 As Long Ddrd = &B11011011 ' аноды Ddrb = &B11111111 ' сегменты Config Int0 = Falling ' прерывание INT0 по нисходящему фронту (c + на -) On Int0 Encod Enable Interrupts Enable Int0 Do ' в главном цикле отображаем количество импульсов Portd = &B11111110 Select Case N1 Case 0 : Portb = &B11000000 Case 1 : Portb = &B11111001 Case 2 : Portb = &B10100100 Case 3 : Portb = &B10110000 Case 4 : Portb = &B10011001 Case 5 : Portb = &B10010010 Case 6 : Portb = &B10000010 Case 7 : Portb = &B11111000 Case 8 : Portb = &B10000000 Case 9 : Portb = &B10010000 End Select Waitms 5 Portd = &B11111101 Select Case N2 Case 0 : Portb = &B11000000 Case 1 : Portb = &B11111001 Case 2 : Portb = &B10100100 Case 3 : Portb = &B10110000 Case 4 : Portb = &B10011001 Case 5 : Portb = &B10010010 Case 6 : Portb = &B10000010 Case 7 : Portb = &B11111000 Case 8 : Portb = &B10000000 Case 9 : Portb = &B10010000 End Select Waitms 5 Portd = &B11110111 Select Case N3 Case 0 : Portb = &B11000000 Case 1 : Portb = &B11111001 Case 2 : Portb = &B10100100 Case 3 : Portb = &B10110000 Case 4 : Portb = &B10011001 Case 5 : Portb = &B10010010 Case 6 : Portb = &B10000010 Case 7 : Portb = &B11111000 Case 8 : Portb = &B10000000 Case 9 : Portb = &B10010000 End Select Waitms 5 Portd = &B11101111 Select Case N4 Case 0 : Portb = &B11000000 Case 1 : Portb = &B11111001 Case 2 : Portb = &B10100100 Case 3 : Portb = &B10110000 Case 4 : Portb = &B10011001 Case 5 : Portb = &B10010010 Case 6 : Portb = &B10000010 Case 7 : Portb = &B11111000 Case 8 : Portb = &B10000000 Case 9 : Portb = &B10010000 End Select Waitms 5 Portd = &B10111111 Select Case N5 Case 0 : Portb = &B11000000 Case 1 : Portb = &B11111001 Case 2 : Portb = &B10100100 Case 3 : Portb = &B10110000 Case 4 : Portb = &B10011001 Case 5 : Portb = &B10010010 Case 6 : Portb = &B10000010 Case 7 : Portb = &B11111000 Case 8 : Portb = &B10000000 Case 9 : Portb = &B10010000 End Select Waitms 5 Loop End Encod: ' тут узнаем в каком направлении вращают ручку энкодера Waitms 2 ' ждем пока утихнет дребезг контактов If Pind.5 = 1 Then ' если на ноге единица (импульс не пришел) тогда Incr W ' инкременируем переменную (увеличиваем на 1) Else ' в обратном случае Decr W ' декрементируем переменную (уменьшаем на 1) End If Gifr = 64 ' сбрасываем регистр хранения прерывания INT0 ' а тут готовим переменную к выводу на дисплей M1 = W M2 = M1 M3 = M1 M4 = M1 M5 = M1 M1 = M1 / 10000 ' обработка первого разряда N1 = Abs(M1) M2 = M2 Mod 10000 ' обработка второго разряда M2 = M2 / 1000 N2 = Abs(M2) M3 = M3 Mod 1000 ' обработка третьего разряда M3 = M3 / 100 N3 = Abs(M3) M4 = M4 Mod 100 ' обработка четвертого разряда M4 = M4 / 10 N4 = Abs(m4) M5 = M5 Mod 10 ' обработка пятого разряда N5 = Abs(m5) Return Плату с контроллером собирал отдельно от индикатора, затем обе платы соединил стойками. Получается удобная и компактная двухэтажная конструкция.
Вот что получилось:
А это в сборе, в энкодер воткнул родное колесо от мышки, так удобней крутить:
| |
Просмотров: 62696 | Комментарии: 52
| Теги: |
Всего комментариев: 52 | 1 2 » | |||||||||||||||||||||||||
| ||||||||||||||||||||||||||
1-30 31-52 | ||||||||||||||||||||||||||
авторизация
рубрики
Проекты [46] |
Как подключить [32] |
Инструменты [3] |
Полезная информация [18] |
Объявления [3] |
метки