Нестабильный результат измерения интервала времени

http
Offline
Зарегистрирован: 23.06.2017

Как можно  измерить интервал времени  достовернее и точнее, чем с помощью micros() ? Читал про него он квантует время не точнее  4 мкс и плюс  системная ошибка из-за использования прерывания ...

Измеряется интервал времени между  входами в обработчик внешнего прерывания, импульсы для него генерируются по таймеру другой ардуиной (ради теста это ее единственная  задача). Результат измерения периода на основе micros() не стабилен и  дрожит :-((

void Irq_Function(void);
volatile unsigned long  T1=0, T2=0;
#define MAXINDEX  20
volatile unsigned long Period[MAXINDEX];
volatile int j=0;


void setup(void) 
{ Serial.begin(115200);
  attachInterrupt(0, Irq_Function,FALLING); 
}

void Irq_Function(void) 
{ 
T1=micros(); 
if (j>= MAXINDEX)return;
Period[j]=T2-T1; 
T2=T1;
j++;
}

int i;
unsigned long Period_copy;
void loop (void)
{ 
if (j< MAXINDEX)return; else;
for (i=0; i<MAXINDEX; i++)
 {
  noInterrupts(); Period_copy=Period[i]; interrupts();
  Serial.println(Period_copy);
 }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А какая точность нужна?

http
Offline
Зарегистрирован: 23.06.2017

5-6 мкс (считаем, что тактовая частота МК идеально стабильная) заведомо удовлетворит, а какая точность достижима и каким методом? 

Не понимаю почему с micros так сильно дрожит результат  до 50...60 мкс при периоде 2000 мкс.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Достижимо примерно до 1 мкс. Но если Вас устраивает 5-6, то думаю, что и micros Вас вполне удовлетоврит, ошибку из-за прерывания можно скомпенсировать, т.к. она известна. А делать надо всё аккуратнее и не злоупотреблять закрытием прерываний.

Я бы просто завёл таймер, который тикает раз в микросекунду, а всё ардуиновское добро (на таймере 0) выключил бы, т.к. оно вносит заметные искажения.

http
Offline
Зарегистрирован: 23.06.2017

ЕвгенийП пишет:
Я бы просто завёл таймер, который тикает раз в микросекунду,

Для замены ардуиновской функции микрос()  ?  на каком номере таймера это сделать?

ЕвгенийП пишет:
а всё ардуиновское добро (на таймере 0) выключил бы, т.к. оно вносит заметные искажения.
Что там за добро можно подробнее, как это добро выключить (знаю только как переключить вектор на свою программу макросом ISR  или остановить таймер 0 ) и какого рода искажения оно  вносит?

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Да, на том же нулевом. Настроить его под себя, чтобы раз в микросекунду тикал и ладно.

А добро - смотрите в файле wiring.c

Что до вопроса, насколько она там влияет, посмотрите осциллограмму вот в этом посте. Впечатляет?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

http пишет:

до 50...60 мкс при периоде 2000 мкс.

Если не превышать период 4095 µS, то можно в начале измерения запускать таймер1, и в конце из счётного регистра забирать что натикало. Точность будет +/- 0,0625µS Прескалером можно увеличить период с пропорциональным уменьшением точности.

http
Offline
Зарегистрирован: 23.06.2017

dimax пишет:
Если не превышать период 4095 µS, то можно в начале измерения запускать таймер1, и в конце из счётного регистра забирать что натикало. Точность будет +/- 0,0625µS Прескалером можно увеличить период с пропорциональным уменьшением точности.

Иногда может превышать, но такое измерения я уже не буду принимать во внимание. В этом случае можно зафиксировать переполнение счетчика установкой флага через прерывание по переполнению, чтобы отбросить недостоверный результат?

А запуск таймера тоже отнимает какое-то время. Принципиально ли его учитывать?

PS: всех "пользователей" таймеров 0 и 1 можно выявить анализом  wiring.c ?

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

http пишет:

Иногда может превышать, но такое измерения я уже не буду принимать во внимание. В этом случае можно зафиксировать переполнение счетчика установкой флага через прерывание по переполнению, чтобы отбросить недостоверный результат?

Можно, но прерывание не требуется, флаг TOV1 выставится в любом случае, когда счётчик досчитает до конца. Соответссно после считывания TCNT1 сразу же следующей командой останавливаете таймер и следующей командой считываете TIFR1&1, если единица -то результат недостоверный. Если ноль -достоверный. Потом нужно сбросить флаг записью единицы.

http пишет:

А запуск таймера тоже отнимает какое-то время. Принципиально ли его учитывать?

С вашими требованиями к точности -однозначно нет.

http пишет:

PS: всех "пользователей" таймеров 0 и 1 можно выявить анализом  wiring.c ?

Нет, основные пользователи -сторонние библиотеки.

http
Offline
Зарегистрирован: 23.06.2017

dimax пишет:
Можно, но прерывание не требуется, флаг TOV1 выставится в любом случае, когда счётчик досчитает до конца. Соответссно после считывания TCNT1 сразу же следующей командой останавливаете таймер и следующей командой считываете TIFR1&1, если единица -то результат недостоверный. Если ноль -достоверный. Потом нужно сбросить флаг записью единицы.
Он переполнился, зачем его останавливать? При входе в обработчик фронта сигнала, как я понял надо

1) считать показания сколько набежало на таймере 1 2) проверить TOV1 для  корректности  результата 3) перезапустить таймер 1

или я что-то неправильно понял ?

как Вы рассчитали точность +/- 0,0625 мкс ?

У меня получается при счетчике 4096, делителе 8 (точнее нет) ,  тактовой 16 МГц  частота  прерывания 244,14 Гц ,  а ее период 0,004096 сек.  Тогда 1 отсчет  таймера = период/4096=0,000001 с =1 мкс 

И почему ограничение 4096, ведь таймер 16 битный?

Logik
Offline
Зарегистрирован: 05.08.2014

потому что (1/16МГц)*2^16=4096мксек.

Все что выше писалось про точности правильно при отсутствии или запрете остальных прерываний - системного таймера, uart, что еще может Вы включили. Иначе про "+/- 0,0625 мкс" можете забыть сразу. 

Вы бы лучше изложили как выглядит задача изначально, толку было бы больше и советы полезней.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Logik, случайно стёр ваш ответ для http , приношу извинения.

http, углублятся в дебаты лениво. Просто сделайте, если что то не получится то спрашивайте.

Logik
Offline
Зарегистрирован: 05.08.2014

dimax пишет:

Logik, случайно стёр ваш ответ для http , приношу извинения.

http, углублятся в дебаты лениво. Просто сделайте, если что то не получится то спрашивайте.

Вот дела интересные.

Администратор!! Ау!!

Ув. Админ!

Будте добры, внесите ясность. Почему некоторые участники дискусии имеют возможность удалять посты других? 

Я считаю что это слишком важный момент, чтоб его замалчивать. Внесите ясность, кто из участников форума "белей" других и на основании каких соображений. Где можна ознакомится со списком привелигированых пользователей?

Я совершенно не против модерации, но против того что это производится не понятно кем и по каким соображениям. Кроме того, хорошей практикоя является не участие модератора в дисскусии, иначе её участники оказываются заведомо в неравных и совершенно не справедливых условиях.

ПС. dimax , без обид. В опрос не в вашей ошибке а в организации форума.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Мне вот еще интересно: куда это так перемещают "удаляемые" сообщения пользователей, что их потом нельзя оттуда восстановить?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Logik пишет:
 

Я считаю что это слишком важный момент, чтоб его замалчивать. 

щитаю, что Логик - латентный белоленточник.

сегодня к ответу атмина призывает, а завтра - Кремль спалит.