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

 
 
> Точное измерение длительности импульса таймером
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
Ответов
smac
сообщение Nov 12 2008, 21:22
Сообщение #2


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

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Цитата(MosVit @ Nov 12 2008, 23:05) *
...
Может кто подскажет как можно уменьшить ошибку до 1 МЦ?

Мне приходит в голову использование устройства захвата таймера, но для этого нужно выполнить как минимум 1 "аппаратное условие" - завести сигнал на пин icp (вроде 1).
Далее мне видится такое решение (опишу псевдоалгоритмом ибо в С не силен)

Код
запретить прерывания при переполнении таймера;
настроить тактирование таймера (без предделителя);
настроить устройство захвата по фронту импульса;
flag=0
izmerenie_provedeno=0
ovfl=0

main ()
{
     if (izmerenie_provedeno)
     {
         T_imp=t_end + ovfl*0x10000 - t_start;
         izmerenie_provedeno=0;
         ovfl=0;
     }


Прерывание от устройства захвата
{
               if (flag)
           {
                         t_end=icr1w; // вожможно не так называется в общем я имею ввиду пару ICR1H:ICR1L
                         flag=0;
                 izmerenie_provedeno=1;
                 настроить устройство захвата по фронту импульса;
                                 запретить прерывания по переполнению таймера;
           }
                  else
           {
                 t_start=icr1w;
                 flag=1;
                 настроить устройство захвата по спаду импульса;
                                разрешить прерывания по переполнению таймера;
          }
}

прерывание по переполнению таймера
{
            ovfl++;
}

конечно это не отлаженый код, поэтому дополню описанием на словах:
0)нужно сначала настроить устройство захвата по фронту имульса (естественно если мы измеряем имульс начиная от перехода из 0 в 1 и заканчивая переходом из 1 в 0) и запустить таймер, не разрешая при этом прерывания по переполнению;
1)по прерыванию от устройства захвата в регистре icr1 появится текущее значение таймера ("тайм стамп") соответствующее началу (фронту) импульса, в это время мы перенастраиваем устройство сравнения на спад импульса, разрешаем прерывания по переполнению таймера и запоминаем icr1 в t_start (ветка else);
2)по след прерыванию от устройства сравнения в регистре icr1 появится новое значение соответствующее концу (спаду) импульса, в это время мы перенастраиваем устройство на фронт импульса, запрещаем прерывания по переполнению таймера и запоминаем icr1 в t_end (ветка if(fag));
3) по окончанию измерения вычисляем длительность импульса в тиках таймера1 (при делителе 1 как раз будет равна МЦ).

З. Ы. Прошу прощения за кривость оформления и изложения, также надо подумать о граничном условии (если захват и переполнение произойдут одновременно, то что будет?)
З. З. Ы. По моему на этом форуме пользователем =GM= (прошу извинить если неправильно привел ник) предлагалось использование устройства захвата при измерении частоты. Нужно поискать по форуму - тема заметная была, т. е. я никаких претензий на оригинальность не имею.

Сообщение отредактировал smac - Nov 12 2008, 22:19
Go to the top of the page
 
+Quote Post



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

 


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


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