СЦБИСТ - железнодорожный форум, блоги, фотогалерея, социальная сеть
Это сообщение показано отдельно, перейти в тему, где размещено сообщение: Система событий микроконтроллеров ATxmega
Старый 04.12.2017, 11:03   #2 (ссылка)
Кандидат в V.I.P.
 
Аватар для Ev3658

Регистрация: 04.12.2017
Сообщений: 1
Поблагодарил: 0 раз(а)
Поблагодарили 1 раз(а)
Фотоальбомы: не добавлял
Репутация: 0
Вот код Bascom, позволяющий организовать 16 битный квадратурный счёт:

Настраиваем входы:
Код:
Config Pina.0 = Input                                       'A
Config Pina.1 = Input                                       'B
Определяем событие входов по падению сигнала:
Код:
Config Xpin = Pina.0 , Sense = Rising                       
Config Xpin = Pina.1 , Sense = Rising
Берём канал события поддерживающий QDEC- это 0,2,4, к примеру канал события №0:

Код:
Config Event_system = Dummy , Mux0 = Porta.0 , Qd0 = Enabled , Digflt0 = 2
Обратите внимание на выбор пина порта, надо выбрать первым по порядку пин, на 1 порт можно повесить точно два энкодера (0,1 - А и В энкодера 1 и 4,5- А и В энкодера 2). Так-же параметр Digflt (фильтр) лучше не ставить 1, считать не будет.

Таймер конфигурируем любой свободный, в Xmega A3 их 7 штук.

Код:
Config Tcc1 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec
Чтоб ограничить счёт для таймера, записываем нужное значение в его регистра Tcxx_PER так:

Код:
Tcc1_per = 9999
Значение энкодера можно выдрать из регистра Tcxx_CNT:
Код:
DIM EN1 As Word
..
..
..
En1= Tcc1_CNT

Вот, что у нас получилось:
Код:
Config Pina.0 = Input                                       'A
Config Pina.1 = Input                                       'B
Config Xpin = Pina.0 , Sense = Rising  
Config Xpin = Pina.1 , Sense = Rising 

Config Event_system = Dummy , Mux0 = Porta.0 , Qd0 = Enabled  , Digflt0 = 2  
Config Tcc1 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec 
Tcc1_per = 9999 

Do
Print Tcc1_cnt
Waitms 300
Loop
Но и тут мы не на коне

16 бит счёта - это мало, минимум бы 24, а лучше 32.
Аппаратно расширить счёт можно, но нигде и никто не может подсказать как это сделать так, чтоб второй таймер считал не только в плюс, но и в минус.
Так-же неизвестно как работать с QDIRM, а без него никак, ведь надо знать эталонное начало счёта.

По поводу расширения счёта таймера, делается это тоже через канал события. Берём к примеру канал №1 и настраиваем событие на переполнения таймера который подсчитывает квадратурную дешифрацию:

Код:
Config Event_system = Dummy , Mux1 = Tcс1_ovf
После берём любой свободный таймер и указываем ему такты и событие от канала события:

Код:
Config Tce1 = Normal , Prescale = E1 , Event_source = E1
Всё, готово, таймер Tce1 будет считать но к сожалению убавлять он не будет - может кто подскажет по этому поводу.
А, да, если чего, первый таймер по которому будет расширятся второй таймер, там предусмотрена задержка сигнала, это для того, чтоб второй таймер успел среагировать, задержку можно включить так (Event_delay = Enabled) :

Код:
Config Tcc1 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec , Event_delay = Enabled
По поводу Qdirm и коня.

Подскажите, как сбросить счёт по Qdirm?

Код:
Config Porta.3 = Input                                      'A
Config Porta.4 = Input                                      'B
Config Porta.5 = Input                                      'Z
Config Xpin = Porta.3 , Sense = Rising                     
Config Xpin = Porta.4 , Sense = Rising 
Config Xpin = Porta.5 , Sense = Both 
Config Event_system = Dummy , Mux0 = Porta.0 , Qd0 = Enabled , Qdi0 = Enabled , Qdirm0 = 1 , Digflt0 = 2
Config Tcc1 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec , Event_delay = Enabled
Подведём итог:
Плюсы: Считать квадратурные импульсы оказывается легко, скорость счёта очень быстрая и без ошибочная.

Минусы: Неизвестно как раширить двунаправленный счёт до 32 бит, неизвестно как работать с QDIx.
Ev3658 вне форума   Цитировать 0
 Нажмите здесь, чтобы написать комментарий к этому сообщению  
 

Яндекс.Метрика