Замер времени менее 1мкс.
- Войдите на сайт для отправки комментариев
Сб, 05/05/2018 - 21:19
Всем доброго времени суток!!!
Есть два дискретных сигнала, по ним срабатываю прервания, в обратчике прерваний использую t1=micros() и t2=micros() соответсвенно и определяю задержку второго сиганла от первого. Точность измерений получется 1мкс.
Воапрс: можно ли замерить с точностью, хотябы 0,1мкс?
Ответ зависит от того, есть ли какие-то сведения о длительности измеряемых интервалов времени? Минимальная? Максимальная? И, да, чуть не забыл, что у Вас за контроллер и какова его тактовая частота?
Длительность от 0,5мкс до 100 мкс.
на микроконтроллере написано Atmel atsam3x8e
Это DUE что-ли? Тогда не знаю, я с этим кортексом не не работал толком.
а с каким работали, может что посоветуете?
на Arduino proMini можно такого добится? я от него откзался только потому что дискретность micros() состовляла 4мкс.
Вы говорили от 0,5 до 100 мкс. На про мини это сделать можно. Но 0.5 - это почти на пределе возможностей. Меньше уже почти никак. Ну, можно от 0.4375 - но это уже полный предел. Если бы удалось понизить верхнюю планку со 100 до 64 - было бы чуть легче. Точность будет 0,0625 мкс.
Вы пока не сказали как часто надо измерать эти интервалы. Какова пауза между измерениями? Например, между имеренным интервалом и следующим должно проходить не менее полмикросекунды. На самом деле больше, т.к. если пауза между интервалами будеи именно 0.5 - то измерить то мы их успеем, а вот времени как-то воспользоваться результатом уже не останется.
В общем, это делается, но про микрос надо забыть, а работать "руками" на низком уровне. Микрос (со всем его барахлом) при этом необходимо вообще выключить, чтобы не мешался.
Интервал измерение сколько надо столько и сделаем. "Тыкните носом", пожалуста, как работать "руками" на низком уровне.
Смотрите в сторону хардварных решений... Захват таймера... например... Если есть режим измерения периода... то уже хорошо...
"Тыкните носом", пожалуста, как работать "руками" на низком уровне.
Ну, а что тыкать-то, всё просто.
1. В коде резервируете 2 регистра, чтобы компилятор их не использовал
2. Выключаете нулевой таймер, чтобы всякие миллисы с микросами под ногами не путались.
3. Настраиваете прерывание от Вашего пина. Срабатывание прерывания требует 4 тактов. Т.е. от моменте прихода сигналат до начала обработки пройдёт 0.25 мкс.
4. В обработчике прерывания первым делом записываете значения TCNT1H и TCNT1L в зарезервированные регистры (2 такта)
5. Разрешаете прерывания (1 такт).
Всё в этот момент контроллер готов ловить прерывание по концу интервала. С момента начала интервала прошло 7 тактов - это как раз 7/16 = 0,4375 мкс (это абсолютный минимум времени, которое Вы можете измерить.
6. При поступлении прерывания "конец интервала" записываете TCNT1H и TCNT1L в два любых регистра.
7. Вычитаете из числа, что в регистрах п.6, число, что сидит в зарезервированных регистрах - это и есть результат измерений. Полученное время равно или меньше, чем реальное. Если меньше, то не более чем на один такт, т.е. на 1/16 = 0,0625 мкс.
Собственно, всё.
И да, все это верно с точностью до погрешности Вашего кварца. Но это всегда так.
конечно ничего пока непонял, но буду разбиратся в TCNT1H и TCNT1L. Спасибо.
Поставить снаружи тригер так, чтобы получить 1 во время между первым и вторым сигналом. Подать на вход разрешения таймера в режиме счёта тактовой частоты. Соответственно будем иметь точность заведомо лучше 0.1 мкс.
Возьмите Леонардо или Микро. С ними можно считать от 62,5 наносекунд!
Возьмите Леонардо или Микро. С ними можно считать от 62,5 наносекунд!
Как? Можете привести кусок скетча?
Книжку найдите по AVR контроллерам и читайте.
Специально для вас. http://microsin.net/programming/avr/atmega-ct1-pulse-counting.html
Поставить снаружи тригер так, чтобы получить 1 во время между первым и вторым сигналом. Подать на вход разрешения таймера в режиме счёта тактовой частоты. Соответственно будем иметь точность заведомо лучше 0.1 мкс.
Годно. Только пока незнаем параметров входных сигналов ниче толком не понятно. Может там измеряемый интервал 0,5мксек повторяется каждую 1мксек. Так и таймер считать неуспеем. Вобщем как обычно, ТС просит помощи не раскрыв задачу.
.
Почему не раскрыв? Тему не читал? Евгений всё из него уже вытянул, чёрным по белому написано,
Интервал измерение сколько надо столько и сделаем.
Почему не раскрыв? Тему не читал? Евгений всё из него уже вытянул, чёрным по белому написано,
Интервал измерение сколько надо столько и сделаем.
Как и чем сделаем? Если запуск от ардуины - одно, если со стороны другое. Напрашивается вобще счетчик тактируемый хоть 100500МГц и запуск от измеряемых сигналов, А ардуиной только считать с счетчика что насчиталось. Чистая схемотехника. Или таймер ардуинны в режиме счета внешнего сигнала, а сигнал от генератора через логику.
Если ардуиной можна запускать и точность 3/16мкс устроит, то запускаем вводим с порта и сохраняем по быстрому, напимер в стек если ассемблер знаеш. Так 400 раз повторяем без цикла при запрещенных прерываниях. Потом неспеша разбираем что насохраняли. Так можна сразу много разных интервалов намерять т.к. сразу 8 сигнпалов вводим.
Как и чем сделаем?
Какая разница? Мы ж не знаем что там за интервады и откуда они берутся. Сказано, что время между измереними может быть любым - достаточным, из этого и исходим.
Внешний счётчик - здорово, но так вообще можно дойти до внешнего девайса с цифровым выходом. Пусть типа измеряет, а у ардуина у него по SPI спрашивает :)
Пусть типа измеряет, а у ардуина у него по SPI спрашивает :)
Кстати, наиболее универсальный выход. И, главное, не лимитирован по частоте.
Всем доброго времени суток!!!
Есть два дискретных сигнала, по ним срабатываю прервания, в обратчике прерваний использую t1=micros() и t2=micros() соответсвенно и определяю задержку второго сиганла от первого. Точность измерений получется 1мкс.
Воапрс: можно ли замерить с точностью, хотябы 0,1мкс?
Если сигналы раздельны, т.е. нужно измерить интервал между ними на разных проводах, то ещё как вариант: заводим оба сигнала на входы прерывания, обработчик первого делает типо digitalWrite(pinT1icp, HIGH) а второй делает тупо digitalWrite(pinT1icp, LOW) и всё, больше они не делают ничего. Где pinT1icp -- нога "захвата таймера Т1". Таймер Т1 настраивается в соответствующий режим счета длительности импульса на этой ноге, и его прерывание даст в регистре ICP количество тактовых импульсов той частоты, с которой он настроен.
В пределе можно считать вчистую тактовую камня (16мГц, есть версии и 20Мгц), что и даст требуемую точность измерения 62.5нсек или 50нсек. Есть камни, которые вполне гонятся для 32Мгц, соответственно повысится точность до около 32нсек. Минимальная длительность импульса будет скорее всего определяться скоростью выгребания значений из регистра ICP, что в теории может дать около тех самых семи тактов, насчитанных тут выше ЕвгениемП.
ТС о точности измерения не говорит. Поэтому можно и без прерываний, и без ICP - ловить изменения входного сигнала, сохраняя в буфер значения Таймера1. Получится простой программный ICP, безо всякого железа.
Зачем делать "программный", если есть железный не подскажите? Хотя .. впрочем тут много кто решает ногодрыгами задачи, которые вполне нормально решены аппаратно. Не удивляет уже. :)
Минимум телодвижений.) А для начинающего чем проще, тем лучше! Чем лучше аппаратно?
Не, ну ежели мозгоклюйство с программной эмуляцией того, что уже сделано аппаратно - это "миниум телодвижений" .. то, не - не мазохист как-бэ. :)
Аппаратно оно ДЛЯ ТОГО и реализовано, чтобы ОСВОБОДИТЬ вычислительные ресурсы микроконтроллера для .. этих, как его, а! ВЫЧИСЛЕНИЙ. А вовсе не для того, чтобы занимать камень изысками мозгоклюйства .. не? :)
Да какой там КАМЕНЬ. Человеку может один раз нужно имзмерить и забыть!
А чё вы тут... SAM3X... It operates at a maximum speed of 84 MHz... Может и до 100МГц разогнать можно будет... Не знаю как там с джиттером ПЛЛ... а так - вполне себе ничего...
Each TC channel can be independently programmed to perform a wide range of functions including frequency
measurement, event counting, interval measurement, pulse generation, delay timing and pulse width modulation.
Each channel has three external clock inputs, five internal clock inputs and two multi-purpose input/output signals
which can be configured by the user. Each channel drives an internal interrupt signal which can be programmed to
generate processor interrupts.
Нус... кто даташит читать начнёт??? ))))))))
Так вроде ж, "на Arduino proMini можно такого добится?"
Да какой там КАМЕНЬ. Человеку может один раз нужно имзмерить и забыть!
Ну и напишите всё ему... и на блюдечке... под SAM3X... программно... пусть померяет и забудет... ))))))
Я и на 328 писать не буду...))))))
ICP - ловить изменения входного сигнала, сохраняя в буфер значения Таймера1. Получится простой программный ICP, безо всякого железа.
Фигню Вы напару с Arhat109-2 обсуждаете. У ардуино есть свои прерывания, как минимум таймера и сириала. Они там десятки микросекунд обрабатываются. И если измерение начнется/закончится какраз во время этой обработки (а с чего бы ему так не попасть?) то интервал получится с ошибкой "тудысюды" десяток микросекунд. Если есть последовательность интервалов, то с этим можна боротся статистически. Если старт происходит по инициативе ардуины - то тоже решаемо, перед стартом на 100мсек можна позапрещать мешающие прерывания.
Можна конечно по рабочекрестянски запретить прерывания системного таймера на все время ожидания начала интервала, правда тогда половина стандартного функционала ардуины отвалится. Ну а не начнется событие вобще - ресетом можна рубануть, есть и такие писятели ;)
Logik, ну вот вы вроде как грамотный мужик, ну какие 10-ки мс, если мы меряем 0,5 мкс! Устественно все прерывания запрещаются, и на кой тут стандартный функционал, если мне нужны только эти измерения! Измерил, включил всё, и выводи результат. Неужто так сложно!(
Отвечаю. 10-ки мкс - типичные времена обработки прерываний системного таймера, все прерывания поступившие в это время будут отложены до завершения его обработки, т.е на время до 10-ки мс. Несогласны? На эти же 10-ки мкс будет приостановлено предлагаемое Вами програмное ожидание начала/конца интервала. А это и есть фигня в точности измерения. Стандартный функционал - тот который присутствует из коробки, миллис например, обмен с сириалом. Запретите все прерывания, попробуйте работать- поймете.
//Измерил, включил всё, и выводи результат. Неужто так сложно!(
Вам похоже сложно. Разясняю. От момента включения и до завершения измерений ардуина - дрова, ничего делать не может, только ждет начала ( а может зависла, не ждет уже ХЗ, ничего не работает, не видно). Вы это предлагаете? Вы я надеюсь видели измерительные приборы. Ну хоть тестер например. Представте что он так работает. Понравится?
Пусть типа измеряет, а у ардуина у него по SPI спрашивает :)
Кстати, наиболее универсальный выход. И, главное, не лимитирован по частоте.
По частоте - да. А вот с унивирсальностю какраз ниразу нет. Стоит поменять в схеме опыта хоть что - полярности импульсов их порядок и т.д. и аппаратное решение сразу проигрывает програмным извращениям.
А вот с унивирсальностю какраз ниразу нет. Стоит поменять в схеме опыта хоть что - полярности импульсов их порядок и т.д. и аппаратное решение сразу проигрывает програмным извращениям.
Это с какой стати программное решение универсальней аппаратного?
Arhat109-2 Прав, посмотрите в сторону захвата таймера по прерыванию Input Capture Register (ICR1). На 328 он есть. Учтите, что есть возможность для ICR менять по какому фронту захватывать сигнал, что значительно упрощает все
Точность на 16 Мгц - 0,0625 мкС
1) Запускаете таймер (Timer1). Настраиваете на захвыать 0->1
2) по прерыванию ICR по переходу с 0->1 на ноге ICR, обнуляете счетчик или запоминаете ICR1
3) переключаете прерывание ICR c 1->0.
4) ждете прерывание, смотрите сколько натикало
посмотрите http://avr-start.ru/?p=1997 (тока тут переключение уровня прерывани нет)
Стоит поменять в схеме опыта хоть что - полярности импульсов их порядок и т.д. и аппаратное решение сразу проигрывает програмным извращениям.
Это что за бред голимый??? Лишь бы что писануть???
По САМ3 ничего не скажу... да и мало кто, похоже, скажет... крайне не популярный чип... 328-я ваще голь голимая...
Ну так ардуина же типа платку с СТМ32Ф103Ц8 поддерживает... чего изголяться то??? Там измерение периода хардварно прямо в даташите расписано... Чтобы поменять полярность или порядок импульсов... всего лишь поменять пару бит в регистрах таймера...
3) переключаете прерывание ICR c 1->0.
ТС нигде не писал, что он измеряет: время между двумя фронтами или длительность сигнала. Этот твой пункт нужен только если второе.
Вообще, алгоритм подробно расписан в посте №9. Если надо именно длительность сигнала, тогда - можно поменять параметр прерывания, как ты ипшешь, там как раз есть запасной такт, а одного такта на это хватит. Но это всё. Больше ничего нельзя, т.к. уже нет ни одного такта в запасе.
А вот с унивирсальностю какраз ниразу нет. Стоит поменять в схеме опыта хоть что - полярности импульсов их порядок и т.д. и аппаратное решение сразу проигрывает програмным извращениям.
Это с какой стати программное решение универсальней аппаратного?
С той что изменения в программе или настройках произвести проще и дешевле чем в схеме и разводке платы. Особенно в готовом изделии.
Arhat109-2 Прав, посмотрите в сторону захвата таймера по прерыванию Input Capture Register (ICR1). На 328 он есть. Учтите, что есть возможность для ICR менять по какому фронту захватывать сигнал, что значительно упрощает все
Точность на 16 Мгц - 0,0625 мкС
1) Запускаете таймер (Timer1). Настраиваете на захвыать 0->1
2) по прерыванию ICR по переходу с 0->1 на ноге ICR, обнуляете счетчик или запоминаете ICR1
3) переключаете прерывание ICR c 1->0.
4) ждете прерывание, смотрите сколько натикало
посмотрите http://avr-start.ru/?p=1997 (тока тут переключение уровня прерывани нет)
А почитать тему? Хоть самое начало. "Есть два дискретных сигнала", какой нафиг "переключаете прерывание ICR c 1->0". Почему нельзя делать старт/стоп измерений на прерывани без запрета прерываний таймера я писал выше. Что будет если запретить все прерывания кроме ICR в режиме ожидания начала тоже писал - будет каличная поделка.
Что будет если запретить все прерывания кроме ICR в режиме ожидания начала тоже писал - будет каличная поделка.
Вот поэтому самое правильное... это хардварное решение... Там вообще ничего ждать не надо... даже если импульсы появятся через сутки...
изменения в программе или настройках произвести проще и дешевле чем в схеме и разводке платы. Особенно в готовом изделии.
Бред... Никто, в здравом уме, такие вещи на конечной стадии не делает... ну кроме даунов и откровенно упоротых... Да и точность программных извращений... всегда печальна... увы...
Физику программно - всегда извращение... )))))))))
Те кто в теме... такими извратами не маятся...
Те кто в теме... такими извратами не маятся...
Это правильно. Те, кто понимает, что не умеет программировать, те и не лезут. Хуже когда не умеют, но не понимают этого.
Ну так... поймите... и успокойтесь... ))))))))))))
.del.
Да, мне сетить не надо, я сам себе солнце. .del.
.del.
.del.