Главная » Статьи » Как подключить

Энкодер и 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

Плату с контроллером собирал отдельно от индикатора, затем обе платы соединил стойками. Получается удобная и компактная двухэтажная конструкция.
Вот что получилось:
 
 
  А это в сборе, в энкодер воткнул родное колесо от мышки, так удобней крутить:
 

 
  
 

Скачать архив с готовой прошивкой для МК
Категория: Как подключить | Добавлено: 08.03.2011
Просмотров: 63543 | Комментарии: 52 | Теги: индикатор, исходники, bascom-avr, энкодер, ATtiny2313 | Рейтинг: 4.7/9
Всего комментариев: 52« 1 2
22 exersizze   (13.06.2012 19:54) [Материал]
на форуме есть возможность прикреплять небольшие файлы.

21 pitato   (13.06.2012 18:30) [Материал]
Спасибо за информацию. Попробую, не уверен, что выйдет. А как на этом сайте передать файлы?

20 amv2000   (13.06.2012 12:46) [Материал]
А можно ввести переменную Count и отсчитывать в обработчике прерывания.
If PinD.2 = 1 Then '
Count = Count + 1 '
Waitms 100 '
If Count = 20 Then 'если кнопка нажата 2 сек
................ 'здесь пишем что хотим сделать к примеру Set PinB.0
End If
End If

19 exersizze   (13.06.2012 12:36) [Материал]
Настройте таймер (например timer1) на прерывание через 2 секунды. В обработчике прерывания INT0 сбрасывайте счетчик в 0, как только прошло две секунды, счетчик переполнится и вызовет прерывание, в котором уже выставляете единицу на порт.

18 pitato   (13.06.2012 12:20) [Материал]
Здравствуйте. Собрал эту схему, всё работает. У меня вопрос. Как сделать так, что если сигнала на PD2 нет 2 секунды, то на PB0-PB6 была 1?

17 Алексей_bird   (06.02.2012 12:25) [Материал]
Получается, что энкодер следует подключать к одному из внешних прерываний? Больше никак?

16 space   (25.09.2011 13:06) [Материал]
извини не заметил)
много оборотный взял, на центр можно нажимать как на клавишу. что за фирма только чёрт его знает.
подтянул два резистора с плюса. на каждый вывод по кондёру. 0.1мкФ - 2 шт. и 16 мкФ
без обвязки вообще ни как, а так всё чётко))

15 exersizze   (25.09.2011 11:00) [Материал]
В статье после схемы, написано про подтяжку. Когда включал люминисценку, счетчик ловил помеху и переключался. Резистор лучше не жалеть, если собирать готовое устройство.
Энкодер какой применять будешь, многооборотный или с фиксатором угла(для чего увеличивать на 10)?

14 space   (25.09.2011 03:02) [Материал]
разобрался
решение :
W = W + 10

сначала пробовал так не получилось. видать гдет косяк был

13 space   (25.09.2011 01:05) [Материал]
exersizze, слушай может подсабишь. Делаю управление сервоприводом за счёт энкодера. остался только один момент. Надо команды Incr и Decr заменить на то что переменную будет изменять не на 1, а на 10.

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

$lib "lcd4.lbx"

$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 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 Integer
Dim X As Integer
Config Int0 = Falling

On Int0 Getencoder

Enable Interrupts
Enable Int0

Cha Alias Pind.2
Chb Alias Pind.3

Config Cha = Input
Config Chb = Input

Cls
Cursor Off

  W = 90

  Do

  If W > 150 Then W = 33
  If W < 33 Then W = 150
  Servo(1) = W
  Locate 1 , 1
  Lcd "encounter: " ; W ; "  "
  Waitms 100
  Loop

Getencoder:

  If Cha = 0 Then
  If Chb = 0 Then Incr W Else Decr W
  End If
  Waitms 5
  Gifr = 64
Return

End

12 space   (24.09.2011 23:14) [Материал]
не большое дополнение. На выводы энкодера не помешает еще подтяжка резисторами на плюс 10кОм или 1кОм. Более чётко считываются повороты энкодера. Опробовал просто сам только что. Вывод был однозначен))

11 rasel   (17.09.2011 19:52) [Материал]
http://www.qsl.net/oe5jfl/ant_cont.htm

вот тут есть про SSI biggrin

10 rasel   (17.09.2011 11:04) [Материал]
На сайте есть семплы магнитов
http://www.austriamicrosystems.com/eng/Products/Magnetic-Encoders/Magnets3/AS5000-MD6SH-1
и нужны только эти так как редкоземельные которые я купил с этим энкодером не работали а точней работали но не так как должны, wacko а если придумаешь как просматривать данные с SSI то просто цены тебе не будет, ну а если конвертор в инкремент то думаю сможешь не плохо на этом заработать smile

9 exersizze   (16.09.2011 23:31) [Материал]
под хитрым магнитом подразумеваешь цилиндрик с разными полюсами в одной плоскости как в ДШ на энкодер?


в продаже видел только цилиндрические магниты с разными полюсами сверху и снизу, но думаю что-нибудь придумать можно будет)
а на микроконтроллере нельзя реализовать этот интерфейс SSI? очень похож на I2C
ссылка на программу SSI - USB не вставилась

8 rasel   (16.09.2011 15:25) [Материал]
КАК ИНКРЕМЕНТНЫЙ ЭНКОДЕР НЕ ОЧЕНЬ ТАК КАК РАЗРЕШЕНИЕ 256 ИМПУЛЬСОВ НО ТАМ ЕСТЬ ИНТЕРФЕЙС SSI АБСОЛЮТНОГО 10 БИТ ПОЛОЖЕНИЯ, ЧТО НЕ МОЖЕТ БЫТЬ ИНТЕРЕСНЫМ ТОЛЬКО ИНТЕРФЕЙС НУЖЕН ДЛЯ КОМПЬЮТЕРА ВОТ ЗДЕСЬ К ЕСТЬ ПРОГРАММА И ИСХОДНИКИ SSI - USB nyam

7 rasel   (15.09.2011 23:37) [Материал]
Без ихних магнитов работать нормально не будет smile они там какие-то хитрые crazy

6 exersizze   (15.09.2011 22:50) [Материал]
Магнитный тоже не плох.
ЗЫ спасибо за ссылку, заказал себе пару семплов wink

5 rasel   (14.09.2011 23:41) [Материал]
http://www.austriamicrosystems.com/eng/Products/Magnetic-Encoders

Магнитный энкодер на базе эффекта холла будет использоваться AS5040 smile

4 exersizze   (14.09.2011 21:51) [Материал]
а вот в чем дело biggrin протеус не симулирует толком схемы с транзисторами, транзисторы нарисованы для схемы. Если заместо них в протеусе поставить какой нибудь инвертирующий буфер (например триггер шмитта 74HC14) то схема будет нормально моделироваться.
Частоту процессора поднять можно, для тини это правда потолок, но велика вероятность что заведется. Проблема в другом-будет ли успевать справляться энкодер? Хорошо если имеется оптический энкодер, тогда без проблем.

3 rasel   (14.09.2011 21:08) [Материал]
Я без претензий, просто замечание, что что-то не так wink Я вообще очень доволен smile
Вопрос возможно ли поднять частоту кварца на максимум 20 мгц, Зачем для того что энкодер будет крутить DC двигло 10~20 оборотов в сек, справится ли эта схема с подобной нагрузкой? smile

2 rasel   (14.09.2011 20:59) [Материал]
я собрал вашу схему в протусе и что бы вы думали alco и на базе вашей собрал свою и что ? работает с индикаторов общий анод dry

http://imageshack.us/photo/my-images/855/14092011195617.png/

1 exersizze   (14.09.2011 19:49) [Материал]
rasel Написано же, что один из разрядов не используется (а именно крайне левый, который пронумерован как 1). Индикатор с общим анодом, в схеме и в коде это можно наблюдать.. Еще одно сообщение в подобном тоне - бан. Если что не понятно, научитесь задавать грамотные вопросы..

1-30 31-52
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






авторизация