Программа Сервисный Центр
0

На обработку сигнала квадратурного энкодера AVR тратит меньше 1 мкс


На обработку сигнала квадратурного энкодера AVR тратит меньше 1 мкс

Считывание сигналов квадратурного энкодера на больших скоростях (например, 1 МГц или 1 м/с с разрешением 1 мкм) часто требует использования специальных аппаратных решений. В данной статье показана простая схема, позволяющая выполнять эту функцию с использованием лишь AVR микроконтроллера ATtiny2313A. Разумеется, дополнительно можно через последовательный интерфейс связать микроконтроллер с другими устройствами, или отображать измеренную позицию на ЖК индикаторе, подключенном к порту PB. Кроме того, для индикации ошибок можно добавить один или несколько светодиодов.

На обработку сигнала квадратурного энкодера AVR тратит меньше 1 мкс
Рисунок 1.Считывание квадратурных сигналов с помощью ATtiny2313A.
Индексный сигнал Z необязателен.

При таком подходе первостепенное значение приобретает подпрограмма обработки прерываний. Сигналы A и B она считывает менее чем за 1 мкс. Дифференциальные сигналы AP/AN и BP/BN обрабатываются приемниками SN75157, необходимость в которых отпадет, если выходные сигналы вашего энкодера будут иметь логические уровни.

Процессор сконфигурирован для генерации прерываний по изменению состояния выводов порта PD. В таблице векторов это прерывание занимает последнее место и, следовательно, позволяет обойтись без команды перехода, в результате чего время обслуживания прерывания сокращается на 2-3 такта (100-150 нс).

Операция «исключающее ИЛИ» между предшествующим и текущим сигналами (AOLD ⊕ BNEW или ANEW ⊕ BOLD) позволяет определить, инкрементировалась или декрементировалась текущая позиция вала относительно предыдущей. Здесь AOLD и BOLD – сигналы на выходах A и B до изменения состояния, а ANEW и BNEW – значения после прерывания. Обработчик прерываний находится в файле PCIsubroutine1.txt.

Время выполнения программы обработки прерывания составляет 800-850 нс (16-17 тактов). Чтобы свести это время к минимуму, некоторые регистры были зарезервированы под обработчик прерываний, и не должны использоваться основной программой:

  • R10 для хранения значения SREG и проверки активизации нового прерывания;
  • R11 и R12 для нового и старого состояний;
  • R24 и R25 для хранения текущего положения вала энкодера.

Для вычисления текущего положения требуется всего один машинный такт. Недостатком является то, что количество позиций не может быть больше 65536. Можно, конечно, отвести под позицию энкодера 3 или 4 байта, но тогда из-за добавления нескольких инструкций время выполнения подпрограммы увеличится до 18-19 тактов. (Используйте регистровые пары R24, R26, R28 или R30).

Перед тем, как выйти из текущей подпрограммы обслуживания, обработчик прерываний проверяет наличие нового прерывания. О наступлении такого события сигнализирует бит T в регистре SREG. Выполнение этой проверки увеличивает время выполнения на три цикла. Мы проверили работу подпрограммы, используя датчик RB6029 (4000 импульсов на оборот) на максимальной скорости, и не зафиксировали ни одной ошибки.

Прежде чем разрешить прерывания, значение PCIE2 необходимо поместить в регистр R12 (прочтите регистр PIND до включения прерывания PCINT2 и установки флага I в регистре SREG).

Если вы хотите использовать еще и индексный сигнал Z, то для хранения позиции потребуются три регистра, поскольку количество значений достигнет 1,024,000 (4,000 остчетов на оборот, 256 оборотов). Данные, которые должен считывать обработчик, как это можно увидеть в PCIsubroutine2.txt, имеют более сложную структуру. Если текущая позиция инкрементируется при активном индексном выходе Z, длина подпрограммы составит 19 или 20 циклов.

Если индекс Z активен, мы очищаем регистры угловой позиции, инкрементируем счетчик числа оборотов и проверяем, не равнялось ли предыдущее значение углового положения числу 3999. В этой подпрограмме определяются три ошибки, одна из которых свидетельствует о наложении прерываний, а две других связаны с индексной меткой Z (проверка корректности предыдущего углового положения). Регистры счетчиков ошибок rerr1, rerr2 и rerr3 должны быть назначены пользователем. Для инициализации системы запустите подпрограмму InitIndexZ.txt, которая ожидает активности сигнала Z.

Теги: ATtiny2313A
 
 
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.
 
Обратная связь

Наши партнеры

 

Опросы

Есть ли справедливость в жизни?
Конечно есть, уверен!
Вроде как должна быть, но...
Затрудняюсь ответить...
Какая справедливость? О чем Вы?
Эх.., нет правды на свете!

 

Облако тегов

Требуется для просмотраFlash Player 9 или выше.

Показать все теги
 

Календарь публикаций

«    Декабрь 2016    »
ПнВтСрЧтПтСбВс
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 
 

Архив новостей

Декабрь 2016 (12)
Ноябрь 2016 (42)
Октябрь 2016 (34)
Сентябрь 2016 (38)
Август 2016 (34)
Июль 2016 (36)
 
Наверх Сервисные мануалы Даташиты Ремонт LCD, ЖК телевизоров LG Samsung Скрипт программы "Сервисный центр"