roboforum.ru

Технический форум по робототехнике.

Таймер в режиме счетчика

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Таймер в режиме счетчика

Сообщение -= Александр =- » 22 окт 2005, 22:37

Народ, если кто делал, расскажите на пальцах как проще всего таймером длину импульса измерить? Как работают входы Т0 и Т1 и вообще че это такое. Цель - ШИМ в цифру преобразовать. Кстати есть ли такие хардовые конвертеры? Нао на хорошей скорости это делать...
В даташит не отправляйте, разбираться некогда...  :roll:
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение AlphA » 23 окт 2005, 10:49

Если измерить длину импульса, то это как раз режим таймера, а не счётчика.
T0 и T1 - это счётные входы т/с. Работают как такие же входы у обычных счётчиков, типа ИЕхх. Надо только установить соответствующий режим работы. Но в данной задаче они скорее всего не понадобятся.
А длину импульса меряем так:
* Т/с - в режиме таймера с тактированием от основогоно ТГ (предделитель - по вкусу);
* Измеряемый сигнал на вход Exernal Int;
* По приходу этого самого ExtInt смотрим чё в TCNTx - это и будет длина импульса (точнее - периода между приходами прерываний). Сбрасываем TCNTx - начиаем новый отсчёт;
* Ждём слудующего ExtInt...

Первый период скорее всего будет подсчитан не корректно. Все следующие - правильно.

Именно так я мерял периоды оборота колеса в велокомпьюере.

Теперь модификация для данной задачи. Сброс TCNTx делаем по переднему фронту прерывания, а по  спаду - берём значение из него (TCNTx).
Такое можно сделать двумя путями:
1) установить режим срабатывания ExtInt на передний фронт, а по приходу его сразу переставить на срабатывание по спаду; а по приходу спада - обратно на передний фронт.
2) установить ExtInt на срабатывание по обеим фронтам (any logical change) и различать их программно (нога INTx должна читаться как PinX даже в режиме внешнего прерывания).
AlphA
 
Сообщения: 111
Зарегистрирован: 21 апр 2005, 01:19
Откуда: Екб

Сообщение -= Александр =- » 23 окт 2005, 11:10

Пасибо. А я полез в даташит и вычитал что-то про ICP вход и прочий геморрой...
А такая система работает надежно? Задача - система навигации на акселерометрах. У них на выходе ШИМ... Чтоб ошибки не было - надо чтоб все очень четко работало... Надеюсь прерывания обрабатываются с равной задержкой? Иначе черт знает что получится...  :roll:
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение AlphA » 23 окт 2005, 17:24

А это какие акселерометры? Я видел такие, что у них простой аналоговый выход - напряжение пропорциональное ускорению.
Такая система работает довольно точно, только если МК сильно не нагружен обработчиками других прерываний. А то задержка будет действительно варьироваться.
AlphA
 
Сообщения: 111
Зарегистрирован: 21 апр 2005, 01:19
Откуда: Екб

Сообщение -= Александр =- » 23 окт 2005, 23:28

У меня на этом будет отдельный МК. Кроме того будет две системы, для дублрования... Акселерометр для опытов - ADXL202E. А вообще жду от Freescale какой-то модный, трехосевой, специально для навигации... Кстати нахаляву.  :wink:
Аватара пользователя
-= Александр =-
Мастер Самоделкин
 
Сообщения: 3678
Зарегистрирован: 11 окт 2004, 19:20
Откуда: Россия, СПб
прог. языки: C/C++, Python, asm
ФИО: Курмис Александр Андреевич

Сообщение North » 24 окт 2005, 10:04

Вообще-то специально для этих целей был создан input capture. Т. е. она позиционируется как фича, способная померять частоту, длительность импульса или вести лог событий. Работает она приблизительно так как описал Альфа. При наступлении события (изменения сигнала на входе input capture или на аналоговом компараторе) значение таймера записывается в регистр ICR1, что гарантирует синхронность полученного времени с пришествием события в отличие от программного метода. Также  в этом режиме доступен шумодав. Если input capture используеся для измерения длины импульса, то в подпрограмме обработки прерывания необходимо изменить фронт срабатывания на противоположный.
Аватара пользователя
North
 
Сообщения: 197
Зарегистрирован: 27 июл 2005, 14:12
Откуда: Дмитров, Москва
прог. языки: С, asm


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 27