реклама на сайте
подробности

 
 
> Реверсивный счетчик на таймере
Erv&Sed
сообщение Dec 10 2007, 16:27
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 11-09-05
Пользователь №: 8 451



Добры день, нужна ваша помощ. Задача состоит в том - что бы создать реверсивный счетчик на одном из таймеров AVR (ATMega8(16) или другие). 0-й таймер - не подходит, т.к. он считает только в одну сторону (по даташиту). Остальные таймеры, в частности 1-й - имеет вход направления, но это направление меняется только внутренным контроллером таймера и только в в режиме Phase-correct и Frequency - Phase Correct PWM.

У кого какие соображения нужна максимальная частота которую он может выдать (~ 3.3 МГц на максимуме), при реверсе частота нужно небольшая.

Эту задачу нужно решить для стыковки AVR-ки с энкодером (16-бит - на оборот), в качестве сигнала направления используется выход синронного D-триггера, на D-вход которого подается один из квадратурных выходов, а на вход синронизации - другой.

У кого какие идеи, или может кто-то нашел другой способ стыковки енкодера с AVR-кой.

В поиск - не посылать, AVRFreak - не посылать, к АппНоутам - не посылать, я там везде уже был.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Erv&Sed
сообщение Dec 10 2007, 21:22
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 11-09-05
Пользователь №: 8 451



У ATMega8 1-ый и 2-ой таймеры - реверсивны, просто мы не можем програмно указать направление счета, если таймер работает в режиме "Phase correct PWM" - то счетчик увеличивается до значения TOP, потом уменьшается до значения BOTTOM (0), после опять увеличивается до значения TOP и т.д.

Мне на ум приходит единственное решение моей проблемы - в момент реверса (двигателя -> энкодера) - сделать что-то на подобие:

In Tmp,TCNT1A
Inc Tmp
Out OCR1A,Tmp

А в обработчике OC1A

In Tmp,TCNT1A
Dec Tmp
Out TCNT1A

В первом случае добавляем чтобы точно не пропустить момент "Compare Match" (т.е. одинаковые значения TCNT1A и OCR1A), а в обработчике - чтобы исключить погрешность.

Саму тему я создал для того чтобы узнать ваще видене решения проблемы (при такой частоте импульсов).

Реализация нужна програмная, просто мне сказали что мол есть такие контроллеры в которых есть так называемый квадратурный счетчик, на что я ответил что и AVR`ка тоже будет считать просто надо добавить небольшую аппаратную часть, но не сам счетчик!!!

Принцип работы D-тригера такова: по фронту (спаду) одного из сигналов устанавливаем значение второго, т.е. если двигатель вращается в одну сторону - первый сигнал опережает второй и к переднему фронту первого - на втором будет "0", а при вращении в другую - "1".

Прикрепил модель в Proteus`е.

Сообщение отредактировал Erv&Sed - Dec 10 2007, 21:27
Прикрепленные файлы
Прикрепленный файл  Encoder.rar ( 14.43 килобайт ) Кол-во скачиваний: 42
 
Go to the top of the page
 
+Quote Post
vpv
сообщение Dec 11 2007, 09:57
Сообщение #3





Группа: Новичок
Сообщений: 1
Регистрация: 15-11-07
Пользователь №: 32 371



Цитата(Erv&Sed @ Dec 11 2007, 01:22) *
Реализация нужна програмная, просто мне сказали что мол есть такие контроллеры в которых есть так называемый квадратурный счетчик, на что я ответил что и AVR`ка тоже будет считать просто надо добавить небольшую аппаратную часть, но не сам счетчик!!!


Когда-то, очень давно, я такое делал, цепляя енкодер к счетчику Т2 i8052. Уже точно и не помню, кажется входы T2 и T2EX. Один вход - импульсы счета, второй - направление. Т.к. счетчик 16-ти разрядный, приходилось его расширять программно. Потом такие поделки перевел на программируемую логику (Альтера) + AVR. Альтера, в отличие от i8052, дала одновременно скорость + синхронность + разрядность.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 20:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01385 секунд с 7
ELECTRONIX ©2004-2016