Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » atXmega - Quadrature Decoder Channels


atXmega - Quadrature Decoder Channels

Сообщений 1 страница 30 из 50

1

Столкнулся я с тем, что нужно оцифровать два энкодера и держать позицию.
Пришла мне тут Xmega256, вот думаю ЛУТануть её. Сунулся в Datasheet, а там вообще всё по другому, даже с портами разобраться сложно.
Наткнулся на интересную штуку - Quadrature Decoder Channels, их аж три штуки, понял, что они как раз под мои нужды.
У меня в двигателе стоит энкодер, каждый канал по 2500 делений, по двум каналам можно получить 10000 импульсов за оборот. То-есть алгоритм высчитывания положения по этим импульсам получается значительный, если учесть, что двигатель 3000об./мин. и за 1 оборот 10 000 прерываний + алгоритм нулевой метки.
В Datasheet на 75й странице показывают, что алгоритм высчитывания положения реализован аппаратно.
http://sg.uploads.ru/t/DbKnZ.png
Мало про него написано. Если кто сталкивался, он там как, может вызывать прерывания, он просто говорит в какую сторону двинулось?

0

2

Какая модель-то? Их там 4 типа...

0

3

RDW написал(а):

Какая модель-то? .

AtXmega256A3 AU

Свернутый текст

http://cvs.aiq.ru/tft24/a3.jpg

Отредактировано Ev3658 (2016-09-29 12:31:37)

0

4

Перевод:

6.7 Квадратурные Decoder
Система событий включает в себя три квадратурных декодеров (QDECs), которые позволяют устройству декодирования квадратурной вход на
Ввода / вывода и отправки событий данных, таймер / счетчик может декодировать подсчитать, обратный отсчет, или индекс / сброса. Таблица 6-2 на
страница 75 суммирует, какие события данных квадратурного декодера доступны, как они расшифровываются, и как они могут быть
генерируется. В QDECs и связанных с ними функций и управления и состояния регистров доступны для каналов событий 0, 2 и 4.
http://s4.uploads.ru/t/xShZf.png

6.7.1 Квадратурные Операция
Квадратурный сигнал характеризуется наличием двух квадратных волн, которые сдвинуты по фазе на 90 градусов относительно друг
Другие. Вращательное движение может быть измерено путем подсчета краев двух форм волны. Фазовое соотношение
между двумя квадратными волнами определяет направление вращения.

http://sh.uploads.ru/t/CEI6h.png

На рисунке 6-4 показаны типичные квадратурные сигналы от датчика вращения. Сигналы QDPH0 и QDPH90 являются два
квадратурные сигналы. Когда QDPH90 приводит QDPH0, вращение определяется как положительным, так и вперед. Когда QDPH0 приводит QDPH90, вращение определяется как отрицательное или обратное. Конкатенацией двух фазовых сигналов называется
квадратурный состояние или фазовое состояние.
Для того чтобы знать абсолютное РОТАЦИОННЫЙ, может быть использован сигнал третьего индекса (QINDX). Это дает указание
один раз за оборот.

6.7.2 Настройка QDEC
Для полной установки QDEC, требуется следующее:
 Два или три ввода булавки порт ввода / вывода для ввода сигнала квадратурной
 Два системных событий каналов для квадратурной декодирования
 один таймер / счетчик вверх, вниз, и дополнительный подсчет индекса
Следующая процедура должна быть использована для установки QDEC:
1. Выберите два последовательных контактов на порт в качестве фазовых входов QDEC.
2. Установите направление контактный разъем для QDPH0 и QDPH90 в качестве входных данных.
3. Установите конфигурацию контактный разъем для QDPH0 и QDPH90 низкого уровня смысле.
4. Выберите штифт QDPH0 в качестве входного мультиплексора для канала событий, п.
5. Включить квадратурной декодирование и цифровую фильтрацию в канале событий.
6. Необязательно:
1. Установить индекс QDEC (QINDX).
2. Выберите третий контакт служит для ввода QINDX.
3. Установить направление штифта для QINDX в качестве входных данных.
4. Установите конфигурацию разъема для QINDX толку обоих краев.
5. Выберите QINDX в качестве входа мультиплексора для канала событий N + 1
6. Установить индекс квадратурной включить бит в канале событий п.
7. Выберите режим распознавания индекса для канала событий п.
7. Установить квадратурной декодирования как действие события для таймера / счетчика.
8. Выберите канал событие п в качестве источника событий для таймера / счетчика.
 Установите период регистр таймера / счетчика (к 'число строк' * 4 - 1), число строк квадратурного кодера.
 Включите таймер / счетчик без тактового задания масштабирования.
Угол импульсного датчика, прикрепленного к QDPH0, QDPH90 (и QINDX) теперь можно читать прямо с
Таймер / счетчик регистра счетчика. Если регистр счетчика отличается от BOTTOM, когда индекс распознана,
флаг ошибки таймера / счетчика устанавливается. Аналогичным образом, флаг ошибки устанавливается, если счетчик положение проходит BOTTOM без
признание индекса.

0

5

Ух-ты! Смотрите, чем меня угостили  8-)

AVR1600: Using the XMEGA Quadrature Decoder  - >http://www.atmel.com/images/doc8109.pdf

Отредактировано Ev3658 (2016-09-29 16:00:49)

0

6

Извращенческий МАНЬЯК !

0

7

Я с энкодерами конечно не работал, но Ev3658, уверен, что эта штука есть во всей серии XMeg? Мне просто лень читать, но помню там камни порой сильно кромсают в отличии от топа А1.

0

8

Да куда не гляну, везде есть. Вот только есть подозрения, что это просто набор логики, который под двум сигналам высчитывает 4ре положения, облегчая при этом обработку увесистого кода программы, который должен определить по прерываниям текущее положение (одно из 4х):
https://wiki.pierobotics.org/wiki/w/images/a/ab/Encoderwave.png
Ща, с Xmega разберусь, не сдаётся просто так.

0

9

Начитался я тут. Вообщем пока в теории, настраивается мультиплексер на один из 3х квадратурных каналов, дальше направляется на 0,2 или 4 канал события. После настраивается таймер-счётчик на нужное событие и как-бы получается аппаратный энкодер.
Вот только в Datasheet нигде не написано, какие выводы контроллера могут быть квадратурным энкодером.

0

10

http://www.atmel.com/images/doc8109.pdf
http://www.avrfreaks.net/forum/xmega-qu … mp;t=77699
https://www.youtube.com/watch?v=ORKURIF6WKk
http://scbist.com/mikrokontrollery/4363 … xmega.html  :cool:

+1

11

6.7.2 Настройка квадратурного декодера
Для полной настройки QDEC необходимо выполнить следующее:
1. Линии портов ввода-вывода - вход квадратурного сигнала
2. Система событий - квадратурная дешифрация
3. Таймер-счетчик - счет вперед, назад и опциональный индексный счет
4. Для настройки QDEC необходимо выполнить следующие процедуры:
5. Выбрать два соседних вывода порта в качестве входов QDEC.
6. Указать, что выводы QDPH0 и QDPH90 являются входами.
7. Настроить выводы QDPH0 и QDPH90 на обнаружение низкого уровня.
8. Выбрать вывод QDPH0 в качестве входа мультиплексора канала событий n.
9. Разрешить квадратурную дешифрацию и цифровую фильтрацию в канале события.
10. Опционально:
11. Настроить индексный вход QDEC (QINDX).
12. Выбрать третий, индексный, вход QINDX.
13. Указать, что QINDX является входом.
14. Настроить вывод QINDX на обнаружение обоих фронтов.
15. Выбрать QINDX в качестве входа мультиплексора канала событий n+1
16. Установить бит разрешения квадратурного индекса в канале событий n+1.
17. Выбрать режим распознавания индекса в канале событий n+1.
18. Указать, что квадратурная дешифрация является действием события для таймера-счетчика.
19. Выбрать таймер-счетчик источником событий для канала событий n.
20. Настроить регистр периода таймера-счетчика равным ('число меток' * 4 - 1), где число меток - параметр квадратурного энкодера.
21. Разрешить работу таймера-счетчика настройкой бит CLKSEL в регистре CLKSEL_DIV1.
В результате, величину углового перемещения квадратурного энкодера, генерирующего сигналы QDPH0, QDPH90 (и QINDX) можно будет считать непосредственно из счетного регистра таймера-счетчика. Если значение в счетном регистре отличается от значения BOTTOM, по которому распознается индекс, устанавливается флаг ошибки таймера-счетчика. Аналогичным образом, установка флага ошибки происходит, если счетчик положения пересекает значение BOTTOM без распознавания индекса.


страница 64 - https://vk.com/doc5082961_439017711

0

12

доки нечем читать

0

13

Система событий микроконтроллеров ATxmega

А. САВЧЕНКО, пос. Зеленоградский Московской обл.

В предыдущих поколениях микроконтроллеров производства фирмы Atmel (ATtiny, ATmega) для взаимодействия внутренних модулей микроконтроллера между собой в режиме реального времени можно было применять только один инструмент — систему прерываний процессора. Для неё характерно вовлечение процессора в процесс взаимодействия, что приводит к его отвлечению от выполнения основной программы и, следовательно, к потерям машинного времени. Время передачи воздействия от модуля-источника к модулю-приёмнику достигает десяти и более циклов синхронизации, что для современных высокоскоростных вычислительных систем довольно много.

Для устранения отмеченных недостатков межмодульного взаимодействия в микроконтроллерах ATxmega появился весьма удобный механизм оперативного взаимодействия модулей между собой — система событий (англ. Event System, EVSYS).

В отличие от системы прерываний, система событий представляет собой аппаратный механизм взаимодействия модулей микроконтроллера между собой без участия процессора. Сигнал о произошедшем событии доставляется от модуля-источника к модулю-приёмнику через сеть маршрутизации событий. Она имеет восемь независимых каналов, что позволяет одно-
временно передавать до восьми сигналов о различных событиях. Система событий функционирует как в активном режиме работы микроконтроллера, так и в "спящем" режиме (IDLE).

Событием считается изменение состояния модуля-источника, факт которого фиксируют элементы его внутренней структуры. Например, таймер-счётчик фиксирует факт переполнения своего
регистра в ходе счёта. Это и есть событие переполнения таймера-счётчика.

Генерировать события (выступать в роли модулей-источников) могут таймеры-счётчики, счётчик реального времени, аналого-цифровые преобразователи, аналоговые компараторы, порты ввода—вывода, узел системной синхронизации. Следует заметить, что они генерируют события при тех же условиях, что и запросы прерывания. Кроме того, возможна и программная генерация событий. В этом случае источник события — процессор.

Модулями-приёмниками могут быть таймеры-счётчики, аналого-цифровые преобразователи, цифроаналоговые преобразователи, порты ввода—вывода, контроллер ПДП. Полная информация о возможности генерирования событий модулями-источниками и их использовании модулями-приёмниками приведена в [1].

События могут быть сигнальными или информационными. Сигнальное событие сообщает модулю-приёмнику лишь факт того, что состояние модуля-источника изменилось. Информационное событие содержит также дополнительные сведения о произошедшем, которые при необходимости могут быть использованы модулем-приёмником.

В процессе передачи сообщений о событиях предусмотрена возможность их цифровой фильтрации и квадратурного декодирования. Если функция цифровой фильтрации активна, сигнал о событии поступит на модуль-приёмник только в том случае, если запрограммированное число (2—8) его отсчётов, взятых с частотой системной синхронизации, имеет одинаковое логическое значение. Понятно, что применять такую фильтрацию имеет смысл лишь к сигналам событий, формируемым асинхронно относительно тактовой частоты микроконтроллера. Это, например, изменения логических уровней на входах портов.

Квадратурное декодирование позволяет обрабатывать квадратурные сигналы, поступающие на входы портов микроконтроллера и передавать информационные события об их изменениях таймеру-счётчику. Последний увеличит или уменьшит на единицу содержимое своего счётного регистра. В системе событий имеются три квадратурных декодера, привязанных к каналам событий 0, 2 и 4.

Типичные устройства, сигналы которых требуют квадратурной обработки, — широко применяемые в качестве органов управления датчики угла поворота (энкодеры). Обычно энкодер при вращении его вала формирует две последовательности прямоугольных импульсов, сдвинутых по фазе на 90°. Этим сигналам в микроконтроллерах ATxmega присвоены символические имена QDPH0 и QDPH90. Некоторые энкодеры формируют также сигнал QDINDX, свидетельствующий о совершении его валом полного оборота. Возможность его обработки узлом квадратурного декодирования также имеется. В зависимости от конкретной задачи сигнал QDINDX может быть использован для определения абсолютного положения вала, для формирования сигнала ошибки декодирования, для подсчёта числа полных оборотов или для обнуления счётчика.

Организация квадратурного декодирования требует конфигурирования как минимум двух линий порта на ввод и одного таймера-счётчика на приём информационного события. После этого из счётного регистра таймера-счётчика можно считывать угол поворота вала энкодера, а также принимать решения о необходимой реакции на изменение сигнала QDINDX. Пример настройки системы событий на обслуживание энкодера будет приведён в конце статьи.

Сеть маршрутизации событий представляет собой, по сути, множество связанных между собой многоканальных мультиплексоров — матрицу соединений. Задавая состояния мультиплексоров, можно обеспечить прохождение
сигналов событий между модулями микроконтроллера по необходимым маршрутам. Полная схема сети приведена в [1]. Управляющую информацию для этой сети заносят в программнодоступные регистры системы событий: CHnMUX — регистр мультиплексора канала события п. Его содержимое поз-
воляет выбрать источник события в соответствии с табл. 1, которая действительна для всех микроконтроллеров ATxmega независимо от того, имеется в них то или иное устройство ввода-вывода или нет. Выбор источником события устройства, которого фактически нет в микроконтроллере, будет проигнорирован. События, сгенерированные программно, имеют приоритет над заданными в регистре CHnMUX и передаются по назначению, даже если в этом регистре записано нулевое значение. В табл. 2. приведены возможные варианты генерации событий таймером-счётчиком.

CHnCTRL — регистр управления каналом события п. Разряд 7 этого регистра зарезервирован для будущих разработок. Разряды 6—3 имеются только в регистрах CHOCTRL, CH2CTRL, CH4CTRL.

QDIRM[ 1:0] (6, 5) — режим распознавания индекса квадратурной дешифрации. В табл. 3 указано состояние сигналов QDPH0 и QDPH90, по которому следует распознавать индексный сигнал. Эти разряды используют только в случае, если имеется индексный сигнал квадратурного энкодера.

QDEN (3) — разрешение квадратурной дешифрации. Запись единицы в этот разряд разрешает работу квадратурного декодера в канале п.

DIGFI LT[2:0] (2—0) — в цифровом фильтре будет использовано DIGFILT+1 отсчётов сигнала. DIGFILT = 0 означает отключение цифровой фильтрации.

Для программной генерации событий в системе предусмотрены два регистра:

STROBE — регистр стробирования события, DATA — регистр данных события.

Для генерации сигнального события в канале п необходимо записать 1 в соответствующий разряд регистра STROBE. Например, запись в этот регистр значения &В00000101 приведёт к генерации сигнальных событий в каналах 0 и 2 одновременно.

Для генерации информационного события необходимо вначале выполнить запись в регистр DATA, затем в STROBE. Фактическая генерация события произойдёт с задержкой на один цикл тактирования УВВ с момента загрузки регистра STROBE. При этом содержимое разрядов регистров будет интерпретироваться модулем-приёмником в соответствии с табл. 4. Например, если записать &В00000101 в регистр DATA, а затем значение &В00000001 в регистр STROBE, будет порождено информационное событие 03 в канале 0 и информационное событие 01 в канале 2.

Обратите внимание на то, что приёмник сигнальных событий получит таковое в канале 0, но в канале 2 событие этого типа порождено не будет.

После генерации событий регистры STROBE и DATA автоматически очищаются.

Итак, система событий предоставляет максимально возможную оперативность взаимодействия модулей. От момента события в модуле-источнике до момента начала действия модуля-приёмника проходит не более двух тактов синхронизации. Взаимодействие модулей микроконтроллера без участия процессора даёт ему возможность выполнять программу без разрывов во времени, что иногда бывает очень важно. Аппаратно реализованные функции цифровой фильтрации и квадратурной дешифрации позволяют дополнительно разгрузить процессор.

http://morepic.ru/images3/45754676746786786_2115_1722.jpg

Примеры использования системы событий в программах

Программы, реализующие приведённые примеры, подготовлены с помощью системы программирования BASCOM AVR версии 2.0.7.3.

Первый пример — использования сигнального события. Допустим, необходимо пересылать массив отсчётов состояний входных линий порта в ОЗУ, используя режим прямого доступа к памяти (ПДП), а затем отображать загруженную информации на индикаторе.

Исходные данные Частота системной синхронизации микроконтроллера, МГц 32

Входной порт F

Число отсчётов 7200

Начальный адрес буфера Н3000

Темп выдачи отсчётов, МГц 4

Номер используемого канала

ПДП 0

Номер используемого канала

событий 0

Суть задачи сводится в считыванию байтов из входного регистра порта F с темпом 4 МГц и их загрузке в ячейки ОЗУ с инкрементированием адреса после каждой операции записи.

Процесс пересылки с использованием ПДП организуется несложно. Он был подробно описан в [2]. Однако в рассмотренной там программе имелся явный сигнал запуска канала ПДП для передачи каждого байта — запрос прерывания от модуля АЦП, свидетельствующий о готовности очередного отсчёта. Но здесь картина иная. Источник информации (порт) не способен генерировать запросы прерываний или сигналы событий, каким-либо образом привязанные к шкале времени.
Следовательно, необходимо найти источник такого сигнала (в соответствии с темой статьи это должен быть сигнал события). Из табл. 1 следует, что такими источниками может быть модуль системной синхронизации или модуль таймера-счётчика. Используем второй вариант. Поскольку все таймеры-счётчики микроконтроллера имеют одинаковые характеристики, можно применить любой из них. Остановимся на таймере-счётчике 0 порта С.

Для решения задачи необходимо конфигурировать устройства микроконтроллера, участвующие в выполнении поставленной задачи: порт F, таймер-счётчик 0 порта С, систему событий и контроллер ПДП.

Конфигурирование порта сводится к переключению всех его линий на ввод Portf_di г=&в00000000 и установке на них низкого начального логического уровня. Например, чтобы установить такой уровень на входе PF3, нужно включить внутренний резистор, соединяющий этот вывод с общим проводом, выполнив операцию Portf_pi n3ctrl=&в00010000. Аналогично следовало бы поступить с каждой из восьми линий порта. Но можно выполнить те же действия всего двумя строками программы, воспользовавшись регистром маски одинаковой конфигурации нескольких линий порта (подробности описаны в [1]): Portcfg_mpcmask=&Bllllllll Portf_pi n3ctrl=&B00010000 По условиям задачи таймер-счётчик 0 порта С должен генерировать сигнальное событие каждые 0,25 мкс. Проще всего для этого перевести таймер-счётчик в режим нормального счёта (он будет считать импульсы тактовой частоты) и обеспечить его переполнение каждым восьмым импульсом:

config Tcc0=Normal, Prescale=l Тсс0_рег=7

Выполнив эти инструкции, таймер-счётчик начнёт работать и генерировать события с нужным периодом.

Конфигурирование системы событий сводится к загрузке в регистр мультиплексора нулевого канала событий кода их источника. Согласно табл. 1 и табл. 2, это выполнит следующая строка программы:

Evsys_ch0mux=&Bll000000. Контроллер ПДП конфигурируют аналогично примеру, приведённому в [2], с той лишь разницей, что источником запуска для него будет нулевой канал системы событий, а источником информации — регистр ввода порта F (имя этого регистра — Portfjn). Как следует из [2] (табл. 1 и табл. 5), код источника запуска канала ПДП должен быть равен 1.
Нужную конфигурацию обеспечит следующий фрагмент программы:

config Dma=Enabled,о Doublebuf=Disabled,o cpm=chOrrl23 Adr=&H3000

config DmachO=Enabled,o Burstlen=l,chanrpt=Disabled,o Tci=Hi,Ei1=Lo,o si ngleshot=Enabled,о sar=None,sam=Fi xed,о Dar=Transacti on,Dam=inc,o Trigger=l,Btc=7200,Repeat=l,o sadr=varptr(portf._in) ,Dadr=Adr

Здесь, как и в [2], значок 0 в конце строки означает, что она прервана условно и в следующей строке находится её продолжение. Вводить в компьютер их нужно одной строкой, опуская значки 0.

На этом конфигурирование устройств закончено. Основная часть программы представляет собой цикл, включающий в себя приём информации в буферную область ОЗУ и её отображение. Первой командой цикла целесообразно перезапустить таймер-счётчик, чтобы он начал отсчёт временных интервалов с нуля:

Tcc0_ctr1fset=&B00001000 После этого необходимо разрешить работу нулевого канала ПДП командой: set Dma_ch0_ctrla.7 и дождаться завершения транзакции ПДП

Bitwait Dma_intflags.0,set set Dma_intflags.l Процесс отображения для понимания работы системы событий не важен, поэтому просто предположим, что его выполняет процедура по имени Screen: Gosub Screen Задача решена.

http://morepic.ru/images3/6754786856787876_7327_1124.jpg

В следующем примере рассмотрим программу, использующую информационные события для обслуживания простейшего инкрементного энкодера ЕС12Е24204А, формирующего 24 импульса за каждый оборот вала. Так как микроконтроллер обрабатывает квадратурные сигналы аппаратно, вся программа сводится к конфигурированию двух линий любого порта, на которые поступают квадратурные сигналы с выходов энкодера, на ввод, а также одного канала системы событий (допустимо использование каналов 0, 2 или 4) и одного (любого) таймера-счётчика.

http://morepic.ru/images3/6765787587865745878_4616_8730.jpg

Если энкодер подключён к порту F микроконтроллера по схеме, показанной на рисунке, то линии PF3 (QDPFI0) и PF4 (QDPF190) необходимо сконфигурировать как входы, включить внутренние резисторы микроконтроллера, соединяющие эти линии с плюсом питания, и задать обнаружение низкого уровня:

config Portf.3=input config Portf.4=lnput Portf_pi n3ctr1=&B00011011 Portf_pin4ctr1=&B00011011

Чтобы использовать нулевой канал системы событий, необходимо выбрать линию PF3 (QDPHO) в качестве источника событий (см. табл. 1): Evsys_ch0mux=&B01111011

Затем следует разрешить в этом канале квадратурное декодирование и цифровую фильтрацию:

Evsys_chOctrl=&В00001001

Возможно, число отсчётоз сигнала, обрабатываемых цифровым фильтром, придётся подбирать опытным путём. Его оптимальное значение зависит от длительности "звона" контактов энкодера.

Переходим к настройке таймера счётчика. Выберем, как и в прошлом примере, таймер-счётчик 0 порта С. Настраивая его, необходимо указать, что источник события — канал 0 системы событий, реакция на событие — квадратурное декодирование, а источник синхронизации — также нулевой канал системы событий. Для конфигурирования таймера-счётчика в среде программирования BASCOM AVR предусмотрена директива Config ТСхх, описание которой имеется в разделе помощи среды. В нашем случае эта директива должна выглядеть так:

config TccO=Normal,prescalе=Е0,о Event_sou гсе=Е0,Event_acti on=Qdec В регистр периода таймера-счётчика следует записать число N-4-1, где N=24 — число импульсов, формируемых используемым энкодером за полный оборот вала: тсс0_рег=95

С этого момента аппаратура микроконтроллера начнёт отслеживать повороты вала энкодера, а в счётном регистре таймера-счётчика постоянно будет находиться значение, характеризующее текущее угловое положение вала. В момент запуска программы его значение можно установить равным 0.

ЛИТЕРАТУРА

1.8-bit Atmel XMEGA A Microcontroller. XMEGA A MANUAL — URL: http://www.atme!. com/lmages/doc8077.pdf (01.10.14).

2. Савченко А. Режим прямого доступа к памяти микроконтроллера ATxmega. — Радио, 2015, №2, с. 27—31.

Источник - http://scbist.com/mikrokontrollery/4363 … xmega.html

0

14

Вообще в хелпе баскома, есть в настройках "Config Event_system" тот самый "QDIRM".

+1

15

на эту тему антивирус ругается, мол, инфицирован
http://savepic.ru/12436883.jpg

0

16

Это антивирусу что-то показалось. https://www.virustotal.com/ru/url/a05b4 … 480239876/

0

17

Вообщем, из теорий, журнала Радио за 20015 год №2 и мануала на русском, вышло вот примерно так, осталось проверить на пригодность.
Если не сложно, дополните комментарии, не могу всё найти и возможно с регистром таймера PER мог ошибиться, вроде как в него заносится максимальное значение.
Хочу сказать интересную вещь, помните, писал, что выход в Xmega не удалось раскочегарить свыше 2-3х мГц, оказывается там всё типа настраивается. Я оставил комментарии в особым настройкам порта.
Кажись, я начал включать мозг, осеннее обострение начинает проходить:

Код:
$regfile = "xm256a3def.dat"
$crystal = 32000000

$hwstack = 64
$swstack = 64
$framesize = 64


$lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014

Config Osc = Disabled , 32mhzosc = Enabled                  '32MHz
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1

Config Portf.3 = Input
Config Portf.4 = Input

'==================================
Portf_pin3ctrl = &B00011011                                 'включение внутренних резисторов к плюсу (потдягивающие) и обнаружение по низкому уровню (стр.120)
Portf_pin4ctrl = &B00011011                                 'включение внутренних резисторов к плюсу (потдягивающие) и обнаружение по низкому уровню (стр.120)
'PINnCTRL - конфигурационный регистр линии N (стр.116)
'----------------------------------
'7.SRLEN - разрешение ограничения скорости фронтов
'----------------------------------
'6.INVEN - разрешение инвертирвоания ввода-вывода
'----------------------------------
'5-3.OPC - настройка выходов и подтяжки
'OPC(2:0)   | Груповая конфигурация | настройка выходов | Настрйока подтяжки
'000        | TOTEM                 | двухтактная линия | (нет)
'001        | BUSKEEPER             | двухтактная линия | адаптивная
'010        | PULLDOWN              | двухтактная линия | к минусу питания
'011        | PULLUP                | двухтактная линия | к плюсу питания
'100        | WIREDOR               | монтажное ИЛИ     | (нет)
'101        | WIREDAND              | можнтажное И      | (нет)
'110        | WIREDORPULL           | монтажное ИЛИ     | к минусу питания
'111        | WIREDANDULL           | монтажное И       | к плюсу питания
'----------------------------------
'2-0.ISC - настрйока функции контроля входа (в каком случае инициируются прерывания)
'000 | BOTHEDGES   | Обнаружение обоих фронтов
'001 | RISING      | Обнаружение нарастающего фронта
'010 | FALLING     | Обнаружение падающего фронта
'011 | LEVEL       | Обнаружение низкого уровня (низкий уровень не генерирует, но высокий будет непрерывно генерировать)
'100 |             | резерв
'101 |             | резерв
'110 |             | резерв
'111 |INPUT_DISABLE| отключение входного буфера (возможность отключения входного буфера предусмотрена у портов A...F)
'==================================



Evsys_ch0mux = &B01111011                                   'CHnMUX - регистр мультиплексора канала событий (стр.65)
'много информации.
'Выбрано:
'0111_1ххх- PORTF_PINn - Вывод n (n=0,1,2,3,4,5,6,7)

'==================================
Evsys_ch0ctrl = &B00001001                                  'CHnCTRL - регистр управления каналом события N. (стр.66-67) только для каналов 0,2,4
'Регистр CHnCTRL
'__________________________________
'7-резерв
'__________________________________
'6-5.QDIRM - режим распознования индекса квадратурной дешифрации:
'00 | [QDPH0,QDPH90]=00
'01 | [QDPH0,QDPH90]=01
'10 | [QDPH0,QDPH90]=10
'11 | [QDPH0,QDPH90]=11
'__________________________________
'4.QDIEN - разрешение индекса квадратурной дешифрации
'__________________________________
'3.QDEN - разрешение квадратурной дешифрации
'__________________________________
'2-0.DIGFILT - коэфициент цифрового фильтра:
'000 | 1SAMPLE | 1выборка
'001 | 2SAMPLE | 2выборки
'010 | 3SAMPLE | 3выборки
'011 | 4SAMPLE | 4выборки
'100 | 5SAMPLE | 5выборок
'101 | 6SAMPLE | 6выборок
'110 | 7SAMPLE | 7выборок
'111 | 8SAMPLE | 8выборок
'==================================


'================== Таймер энкодера
Config Tcc0 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec
'===================================
'event_action (стр.133)
'CTRLD = регистр управления D
'7-5 - EVACT - действия события
'000 | OFF     | нет
'001 | CAPT    | Выходной захват
'010 | UODOWN  | Внешне-управляемый прямой/обратный счёт
'011 | QDEC    | Квадратурная дешифрация
'100 | RESTART | Рестарт периода импульсов
'101 | FRQ     | Захват частоты
'110 | PW      | захват длительности импульса
'111 |         | резерв
'===================================
'
Tcc0_per = 95                                               'регистр периода (стр.138) походу верхнее значение импульсов.

Отредактировано Ev3658 (2016-11-28 18:23:48)

0

18

РАБОТАЕТ!!!! УРА!!! Всё отлично  :crazyfun:

Код:
$regfile = "xm256a3def.dat"
$crystal = 32000000

$hwstack = 64
$swstack = 64
$framesize = 64


$lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014
Config Osc = Disabled , 32mhzosc = Enabled                  '32MHz

'configure the systemclock
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1


'Config Osc = Disabled , 32mhzosc = Enabled                  '32MHz
'Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1

Config Com1 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8

 Config Portf.3 = Input
Config Portf.4 = Input

'==================================
Portf_pin3ctrl = &B00011011                                 'включение внутренних резисторов к плюсу (потдягивающие) и обнаружение по низкому уровню (стр.120)
Portf_pin4ctrl = &B00011011                                 'включение внутренних резисторов к плюсу (потдягивающие) и обнаружение по низкому уровню (стр.120)
'PINnCTRL - конфигурационный регистр линии N (стр.116)
'----------------------------------
'7.SRLEN - разрешение ограничения скорости фронтов
'----------------------------------
'6.INVEN - разрешение инвертирвоания ввода-вывода
'----------------------------------
'5-3.OPC - настройка выходов и подтяжки
'OPC(2:0)   | Груповая конфигурация | настройка выходов | Настрйока подтяжки
'000        | TOTEM                 | двухтактная линия | (нет)
'001        | BUSKEEPER             | двухтактная линия | адаптивная
'010        | PULLDOWN              | двухтактная линия | к минусу питания
'011        | PULLUP                | двухтактная линия | к плюсу питания
'100        | WIREDOR               | монтажное ИЛИ     | (нет)
'101        | WIREDAND              | можнтажное И      | (нет)
'110        | WIREDORPULL           | монтажное ИЛИ     | к минусу питания
'111        | WIREDANDULL           | монтажное И       | к плюсу питания
'----------------------------------
'2-0.ISC - настрйока функции контроля входа (в каком случае инициируются прерывания)
'000 | BOTHEDGES   | Обнаружение обоих фронтов
'001 | RISING      | Обнаружение нарастающего фронта
'010 | FALLING     | Обнаружение падающего фронта
'011 | LEVEL       | Обнаружение низкого уровня (низкий уровень не генерирует, но высокий будет непрерывно генерировать)
'100 |             | резерв
'101 |             | резерв
'110 |             | резерв
'111 |INPUT_DISABLE| отключение входного буфера (возможность отключения входного буфера предусмотрена у портов A...F)
'==================================



Evsys_ch0mux = &B01111011                                   'CHnMUX - регистр мультиплексора канала событий (стр.65)
'много информации.
'Выбрано:
'0111_1ххх - PORTF_PINn - Вывод n (n=0,1,2,3,4,5,6,7)

'==================================
Evsys_ch0ctrl = &B00001001                                  'CHnCTRL - регистр управления каналом события N. (стр.66-67) только для каналов 0,2,4
'Регистр CHnCTRL
'__________________________________
'7-резерв
'__________________________________
'6-5.QDIRM - режим распознования индекса квадратурной дешифрации:
'00 | [QDPH0,QDPH90]=00
'01 | [QDPH0,QDPH90]=01
'10 | [QDPH0,QDPH90]=10
'11 | [QDPH0,QDPH90]=11
'__________________________________
'4.QDIEN - разрешение индекса квадратурной дешифрации
'__________________________________
'3.QDEN - разрешение квадратурной дешифрации
'__________________________________
'2-0.DIGFILT - коэфициент цифрового фильтра:
'000 | 1SAMPLE | 1выборка
'001 | 2SAMPLE | 2выборки
'010 | 3SAMPLE | 3выборки
'011 | 4SAMPLE | 4выборки
'100 | 5SAMPLE | 5выборок
'101 | 6SAMPLE | 6выборок
'110 | 7SAMPLE | 7выборок
'111 | 8SAMPLE | 8выборок
'==================================


'================== Таймер энкодера
Config Tcc0 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec
'===================================
'event_action (стр.133)
'CTRLD = регистр управления D
'7-5 - EVACT - действия события
'000 | OFF     | нет
'001 | CAPT    | Выходной захват
'010 | UODOWN  | Внешне-управляемый прямой/обратный счёт
'011 | QDEC    | Квадратурная дешифрация
'100 | RESTART | Рестарт периода импульсов
'101 | FRQ     | Захват частоты
'110 | PW      | захват длительности импульса
'111 |         | резерв
'===================================
'
'Tcc0_per = 95                                               'регистр периода (стр.138) походу верхнее значение импульсов.





Open "COM1:" For Binary As #1




Dim B As Word

Dim Tel As Word
Dim S As String * 10



Do
B = Tcc0_cnt
S = Str(b)
Print #1 , S

  Wait 1

Loop



End

Работает как надо, причём из 2х сигналов аппаратно обрабатывает 4 прерывания. Подключил цифровую линейку с разрешением 0,005мм, длина 300мм. 16 битного таймера счётчика хватает. Скорость обработки приемлемая. Можно тему завершать, пойду курить опять VGA  :hobo:
http://s6.uploads.ru/t/l9w8v.png

0

19

У тебя вся скорость образно упирается в передачу данных 9600. :)
Так вообще всё аппаратно происходит, без участия МК.
Добрая часть регистров, которые ты задавал руками, можно конфигурировать через баском команды.

0

20

RDW написал(а):

У тебя вся скорость образно упирается в передачу данных 9600.
Так вообще всё аппаратно происходит, без участия МК.
Добрая часть регистров, которые ты задавал руками, можно конфигурировать через баском команды.

Ну не, я просто комментарии такие написал, всё конфигурируется через Баском команды, но, чтоб понять, что там конфигурируется, я написал комментарии, указывающие на регистры и страницу в описании. Не могу писать код, когда многое не известно, прям ком в голове, мешающий мыслить. Если комментарии убрать, получиться очень маленький код программы.

Код:
$regfile = "xm256a3def.dat"
$crystal = 32000000

$hwstack = 64
$swstack = 64
$framesize = 64


$lib "xmega.lib" : $external _xmegafix_clear : $external _xmegafix_rol_r1014
Config Osc = Disabled , 32mhzosc = Enabled                  '32MHz
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1

Config Com1 = 9600 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8

Config Portf.3 = Input
Config Portf.4 = Input


Portf_pin3ctrl = &B00011011 
Portf_pin4ctrl = &B00011011

Evsys_ch0mux = &B01111011                                   
Evsys_ch0ctrl = &B00001001                                
Config Tcc0 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Qdec

Open "COM1:" For Binary As #1

Dim B As Word

Dim Mm As Single
Dim S As String * 10

Do

If B <> Tcc0_cnt Then
B = Tcc0_cnt

Mm = B * 0.005
'S = Str(mm)
Print #1 , Mm ; "mm"
End If

Loop



End

Ну, а скорость поставил просто так, хватает, чтоб видеть изменения. Скорость обработки довольно большая, больше и не надо.
Вот только одна проблема, 16 бит счётчика маловато будет, хотелось бы больше.

0

21

Ev3658 написал(а):

Вот только одна проблема, 16 бит счётчика маловато будет, хотелось бы больше.

32-ух битные таймеры/счетчики встречаются не часто в МК. Не уверен есть ли они в Xmega. Поисковики не подтвердили это.
В некоторых МК можно выстраивать цепочку таймеров. Т. е. переполнение одного таймера служит тактовым сигналом для другого. Таким образом можно из двух 16-ти битных получить 32-ух битный.

0

22

Надо адекватно понимать, какая должна быть тактируемая частота МК, чтобы счетчик (скажем) на 32-разряда успевал выдавать отличную производительность. Всё что я встречал 32 разрядное, оно очень медленное (в несколько герц).
Ну или как-то начать извращаться сдвигом фаз и параллельной обработке (как в осциллографах).

Отредактировано RDW (2016-11-29 17:01:42)

0

23

RDW написал(а):

Всё что я встречал 32 разрядное, оно очень медленное (в несколько герц).

Скажем чтобы получить 32-ух битный ШИМ с частотой 2 герца, нужно на счетчик подать 8 ГГц! :D
Но сейчас речь не об этом.  :)

0

24

Одним из вариантов может быть использование такого МК в качестве драйвера энкодера. Несмотря на небольшую стоимость в нем есть 32-ух битный таймер/счетчик Tim2 (недокументированный) один из режимов работы которого - режим чтения энкодера. Т. к. таймер 32-ух битный, то переполнение произойдет после 4-ех миллиардов "щелчков" энкодера что на мой взгляд больше чем достаточно для этой задачи.
Этот МК связываем через USART, I2C, SPI и т. д. с основным контроллером (на ATmega или подобном) и получаем желаемый результат.

0

25

Скрытая реклама АРМ!  :D

0

26

Почему реклама? Среди ATmega или ATXmega есть МК с 32-ух битными таймерами поддерживающими энкодер?

0

27

Пётр написал(а):

Почему реклама

Потому, что это никому не надо, в разделе "ATMEL в BASCOM".

0

28

Если не надо вам, это не значит что не надо другим. Я отвечал на

Ev3658 написал(а):

Вот только одна проблема, 16 бит счётчика маловато будет, хотелось бы больше.

Насколько мне известно среди ATmega и ATXmega нет МК с 32-ух битными таймерами (если таковые есть, напишите).
Решение получится простое. На ARM только одна из составляющих схемы - контроллер энкодера, а все остальное на ATmega или ATXmega.

0

29

Мне-то надо 2500 импульсов энкодера (10000 прерываний) за 1 оборот со скоростью 3000 оборотов в минуту. Если справится, будет хорошо. По поводу оптической линейки, то вообще без проблем, за 1 сек. в лёгкую 60000 показаний / 4= 15000/<сек. Быстрей двигать руками не смог, сломать боялся.
Если один таймер как-то будет подсчитывать 10000 импульсов, а другой как-то будет считать кол-во оборотов (в обе стороны), этого будет достаточно, вот только бы аппаратно как сделать.

Тут на скорую руку надо сделать измерительный прибор, у нас листогиб есть, он гнёт с одной стороны больше, с другой меньше и никто настроить не может, каждый выдаёт свои безумные теории. Вот и решил сделать прибор на две оптические линейки, который на экране будет выводить нужную информацию об рассогласование и в виде графиков тоже.
Там таймера хватает, срок у меня до конца недели и очень-очень бы хотелось успеть с хорошим графическим LCD, но как назло, ничего под рукой нет, либо 127х64 обычный графический, либо вот такой - 3.2" TFT LCD

Отредактировано Ev3658 (2016-11-30 00:17:38)

0

30

Таймеры настраиваются на канал событий типа так:

Код:
Config Tcc0 = Normal , Prescale = E0 , Event_source = &B1000 , Event_action = Qdec
Config Tcc1 = Normal , Prescale = E0 , Event_source = &B1010 , Event_action = Qdec

Event_source = регистру CTRLA - описание есть на стр.132 (в книге про Xmega на русском - https://vk.com/doc5082961_439017711)

В регистре действую 3-0 биты, биты 7-4 резервные.
По DATASHEET, 1ххх - где xxx номер канала события.

P:S: Дома аваст не ругается, но в Win7 x64 он орёт на каждое открытие страницы )))

Отредактировано Ev3658 (2016-12-03 18:20:09)

+1

Похожие темы


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » atXmega - Quadrature Decoder Channels