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

 
 
> Точное измерение длительности импульса таймером
MosVit
сообщение Nov 12 2008, 20:05
Сообщение #1





Группа: Новичок
Сообщений: 8
Регистрация: 7-10-08
Пользователь №: 40 755



Сканирую вход микроконтролера (ATTiny2313) для измерения длительности импульса (переход от лог 1 к лог 0) 16 разрядным таймером (TIMER1).

Код на С (IAR WB)

while (PINB &= (1 << PB2));
TCCR1B = 0x00; // Stop timer

Дает ошибку в 5 МЦ (машинных циклов)
Пример: Разница между измеряными числами кратна 5
06564
06249
06529
06724
06484
06519

асемблерная вставка:
asm("nop");
asm("loop: sbic $16, 2");
asm("rjmp loop");
TCCR1B = 0x00; // Stop timer

Ошибка - 3 МЦ

По даташиту это вроде бы как предел точности, из-за того что команда "sbic" выполняется 3 МЦ при выполнении условия и 1 МЦ в противном случае.

Пример: Разница между измеряными числами кратна 3
00425
00425
00425
00434
00425
00428

Может кто подскажет как можно уменьшить ошибку до 1 МЦ?

Сообщение отредактировал MosVit - Nov 12 2008, 20:08
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Artem_Petrik
сообщение Nov 12 2008, 21:27
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



В tiny2313 на таймере 1 есть вход захвата (input capture). C его помощью можно мерять с точностью до такта. Он (вход захвата) вообщем-то для этого и предназначен.

Упс, опоздал smile.gif.
Go to the top of the page
 
+Quote Post
VAHOO
сообщение Nov 13 2008, 09:42
Сообщение #3


Частый гость
**

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



Цитата(Artem_Petrik @ Nov 13 2008, 01:27) *
В tiny2313 на таймере 1 есть вход захвата (input capture). C его помощью можно мерять с точностью до такта. Он (вход захвата) вообщем-то для этого и предназначен.

Упс, опоздал smile.gif.


скажите пожалуйста а как правилно настроить?


--------------------
Прошивка это душа микроконтроллера!
Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение Nov 13 2008, 10:15
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



Цитата(VAHOO @ Nov 13 2008, 13:42) *
скажите пожалуйста а как правилно настроить?

Сам таймер настроить можно в принципе как угодно, но если он используется только для захвата - то пусть себе считает от 0 до 0xFFFF без всяких прерываний.
В TCCR1B бит ICES1 отвечает за то, какой именно фронт будет захватываться. Как только таймер засечет этот самый фронт на ICP1 он скопирует содержимое TCCR в ICR. Так у нас появилась временнАя метка. По прерыванию ICIE мы ее считываем. Если мы меряем период, т.е. расстояние, например, между передними фронтами, то мы ждем следующее прерывание от захвата, вычитаем из новой метки предыдущую (по модулю 65536, т.е. 0x0001 - 0xFFFF = 2) и получаем точную длительность периода. Если нужно мерять длительность "еденички", то в каждом прерывании нужно менять значение ICES1 на противоположное, чтоб ловить и передние фронты и задние(срезы).
А вообще, читайте datasheet, там много всего интересного smile.gif.
Go to the top of the page
 
+Quote Post



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

 


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


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