Нестабильный результат измерения интервала времени
- Войдите на сайт для отправки комментариев
Пт, 23/06/2017 - 10:24
Как можно измерить интервал времени достовернее и точнее, чем с помощью 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); } }
А какая точность нужна?
5-6 мкс (считаем, что тактовая частота МК идеально стабильная) заведомо удовлетворит, а какая точность достижима и каким методом?
Не понимаю почему с micros так сильно дрожит результат до 50...60 мкс при периоде 2000 мкс.
Достижимо примерно до 1 мкс. Но если Вас устраивает 5-6, то думаю, что и micros Вас вполне удовлетоврит, ошибку из-за прерывания можно скомпенсировать, т.к. она известна. А делать надо всё аккуратнее и не злоупотреблять закрытием прерываний.
Я бы просто завёл таймер, который тикает раз в микросекунду, а всё ардуиновское добро (на таймере 0) выключил бы, т.к. оно вносит заметные искажения.
Для замены ардуиновской функции микрос() ? на каком номере таймера это сделать?
Да, на том же нулевом. Настроить его под себя, чтобы раз в микросекунду тикал и ладно.
А добро - смотрите в файле wiring.c
Что до вопроса, насколько она там влияет, посмотрите осциллограмму вот в этом посте. Впечатляет?
до 50...60 мкс при периоде 2000 мкс.
Если не превышать период 4095 µS, то можно в начале измерения запускать таймер1, и в конце из счётного регистра забирать что натикало. Точность будет +/- 0,0625µS Прескалером можно увеличить период с пропорциональным уменьшением точности.
Иногда может превышать, но такое измерения я уже не буду принимать во внимание. В этом случае можно зафиксировать переполнение счетчика установкой флага через прерывание по переполнению, чтобы отбросить недостоверный результат?
А запуск таймера тоже отнимает какое-то время. Принципиально ли его учитывать?
PS: всех "пользователей" таймеров 0 и 1 можно выявить анализом wiring.c ?
Иногда может превышать, но такое измерения я уже не буду принимать во внимание. В этом случае можно зафиксировать переполнение счетчика установкой флага через прерывание по переполнению, чтобы отбросить недостоверный результат?
Можно, но прерывание не требуется, флаг TOV1 выставится в любом случае, когда счётчик досчитает до конца. Соответссно после считывания TCNT1 сразу же следующей командой останавливаете таймер и следующей командой считываете TIFR1&1, если единица -то результат недостоверный. Если ноль -достоверный. Потом нужно сбросить флаг записью единицы.
А запуск таймера тоже отнимает какое-то время. Принципиально ли его учитывать?
С вашими требованиями к точности -однозначно нет.
PS: всех "пользователей" таймеров 0 и 1 можно выявить анализом wiring.c ?
Нет, основные пользователи -сторонние библиотеки.
1) считать показания сколько набежало на таймере 1 2) проверить TOV1 для корректности результата 3) перезапустить таймер 1
или я что-то неправильно понял ?
как Вы рассчитали точность +/- 0,0625 мкс ?
У меня получается при счетчике 4096, делителе 8 (точнее нет) , тактовой 16 МГц частота прерывания 244,14 Гц , а ее период 0,004096 сек. Тогда 1 отсчет таймера = период/4096=0,000001 с =1 мкс
И почему ограничение 4096, ведь таймер 16 битный?
потому что (1/16МГц)*2^16=4096мксек.
Все что выше писалось про точности правильно при отсутствии или запрете остальных прерываний - системного таймера, uart, что еще может Вы включили. Иначе про "+/- 0,0625 мкс" можете забыть сразу.
Вы бы лучше изложили как выглядит задача изначально, толку было бы больше и советы полезней.
Logik, случайно стёр ваш ответ для http , приношу извинения.
http, углублятся в дебаты лениво. Просто сделайте, если что то не получится то спрашивайте.
Logik, случайно стёр ваш ответ для http , приношу извинения.
http, углублятся в дебаты лениво. Просто сделайте, если что то не получится то спрашивайте.
Вот дела интересные.
Администратор!! Ау!!
Ув. Админ!
Будте добры, внесите ясность. Почему некоторые участники дискусии имеют возможность удалять посты других?
Я считаю что это слишком важный момент, чтоб его замалчивать. Внесите ясность, кто из участников форума "белей" других и на основании каких соображений. Где можна ознакомится со списком привелигированых пользователей?
Я совершенно не против модерации, но против того что это производится не понятно кем и по каким соображениям. Кроме того, хорошей практикоя является не участие модератора в дисскусии, иначе её участники оказываются заведомо в неравных и совершенно не справедливых условиях.
ПС. dimax , без обид. В опрос не в вашей ошибке а в организации форума.
Мне вот еще интересно: куда это так перемещают "удаляемые" сообщения пользователей, что их потом нельзя оттуда восстановить?
Я считаю что это слишком важный момент, чтоб его замалчивать.
щитаю, что Логик - латентный белоленточник.
сегодня к ответу атмина призывает, а завтра - Кремль спалит.