Замер времени менее 1мкс.

vshurik
Offline
Зарегистрирован: 30.12.2017

Всем доброго времени суток!!! 

Есть два дискретных сигнала, по ним срабатываю прервания, в обратчике прерваний использую t1=micros() и t2=micros() соответсвенно и определяю задержку второго сиганла от первого. Точность измерений получется 1мкс. 

Воапрс: можно ли замерить с точностью, хотябы 0,1мкс? 

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

Ответ зависит от того, есть ли какие-то сведения о длительности измеряемых интервалов времени? Минимальная? Максимальная? И, да, чуть не забыл, что у Вас за контроллер и какова его тактовая частота?

vshurik
Offline
Зарегистрирован: 30.12.2017

Длительность от 0,5мкс до 100 мкс.

на микроконтроллере написано  Atmel atsam3x8e

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

Это DUE что-ли? Тогда не знаю, я с этим кортексом не не работал толком.

vshurik
Offline
Зарегистрирован: 30.12.2017

а с каким работали, может что посоветуете?

vshurik
Offline
Зарегистрирован: 30.12.2017

на Arduino proMini можно такого добится? я от него откзался только потому что дискретность micros() состовляла 4мкс.

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

Вы говорили от 0,5 до 100 мкс. На про мини это сделать можно. Но 0.5 - это почти на пределе возможностей. Меньше уже почти никак. Ну, можно от 0.4375 - но это уже полный предел. Если бы удалось понизить верхнюю планку со 100 до 64 - было бы чуть легче. Точность будет 0,0625 мкс.

Вы пока не сказали как часто надо измерать эти интервалы. Какова пауза между измерениями? Например, между имеренным интервалом и следующим должно проходить не менее полмикросекунды. На самом деле больше, т.к. если пауза между интервалами будеи именно 0.5 - то измерить то мы их успеем, а вот времени как-то воспользоваться результатом уже не останется.

В общем, это делается, но про микрос надо забыть, а работать "руками" на низком уровне. Микрос (со всем его барахлом) при этом необходимо вообще выключить, чтобы не мешался.

vshurik
Offline
Зарегистрирован: 30.12.2017

Интервал измерение сколько надо столько и сделаем. "Тыкните носом", пожалуста, как работать "руками" на низком уровне. 

ssss
Offline
Зарегистрирован: 01.07.2016

Смотрите в сторону хардварных решений... Захват таймера... например... Если есть режим измерения периода... то уже хорошо...

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

vshurik пишет:

"Тыкните носом", пожалуста, как работать "руками" на низком уровне. 

Ну, а что тыкать-то, всё просто.

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 мкс.

Собственно, всё.

И да, все это верно с точностью до погрешности Вашего кварца. Но это всегда так. 

 

vshurik
Offline
Зарегистрирован: 30.12.2017

конечно ничего пока непонял, но буду разбиратся в TCNT1H и TCNT1L. Спасибо.

nik182
Offline
Зарегистрирован: 04.05.2015

Поставить снаружи тригер так, чтобы получить 1 во время между первым и вторым сигналом. Подать на вход разрешения таймера в режиме счёта тактовой частоты. Соответственно будем иметь точность заведомо лучше 0.1 мкс. 

Green
Offline
Зарегистрирован: 01.10.2015

Возьмите Леонардо или Микро. С ними можно считать от 62,5 наносекунд!

vshurik
Offline
Зарегистрирован: 30.12.2017

Green пишет:

Возьмите Леонардо или Микро. С ними можно считать от 62,5 наносекунд!

Как? Можете привести кусок скетча?

Green
Offline
Зарегистрирован: 01.10.2015

Книжку найдите по AVR контроллерам и читайте.

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

nik182 пишет:

Поставить снаружи тригер так, чтобы получить 1 во время между первым и вторым сигналом. Подать на вход разрешения таймера в режиме счёта тактовой частоты. Соответственно будем иметь точность заведомо лучше 0.1 мкс. 

Годно. Только пока незнаем параметров входных сигналов ниче толком не понятно. Может там измеряемый интервал 0,5мксек повторяется каждую 1мксек. Так и таймер считать неуспеем. Вобщем как обычно, ТС просит помощи не раскрыв задачу.

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

.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Logik пишет:
Только пока незнаем параметров входных сигналов ниче толком не понятно. Может там измеряемый интервал 0,5мксек повторяется каждую 1мксек. Так и таймер считать неуспеем. Вобщем как обычно, ТС просит помощи не раскрыв задачу.

Почему не раскрыв? Тему не читал? Евгений всё из него уже вытянул, чёрным по белому написано,

vshurik пишет:

Интервал измерение сколько надо столько и сделаем. 

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

Ворота пишет:

Logik пишет:
Только пока незнаем параметров входных сигналов ниче толком не понятно. Может там измеряемый интервал 0,5мксек повторяется каждую 1мксек. Так и таймер считать неуспеем. Вобщем как обычно, ТС просит помощи не раскрыв задачу.

Почему не раскрыв? Тему не читал? Евгений всё из него уже вытянул, чёрным по белому написано,

vshurik пишет:

Интервал измерение сколько надо столько и сделаем. 

Как и чем сделаем? Если запуск от ардуины - одно, если со стороны другое. Напрашивается вобще счетчик тактируемый хоть 100500МГц и запуск от измеряемых сигналов, А ардуиной только считать с счетчика что насчиталось. Чистая схемотехника. Или таймер ардуинны в режиме счета внешнего сигнала, а сигнал от генератора через логику. 

Если ардуиной можна запускать и точность 3/16мкс устроит, то запускаем вводим с порта и сохраняем по быстрому, напимер в стек если ассемблер знаеш. Так 400 раз повторяем без цикла при запрещенных прерываниях. Потом неспеша разбираем что насохраняли. Так можна сразу много разных интервалов намерять т.к. сразу 8 сигнпалов вводим.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Logik пишет:

Как и чем сделаем?

Какая разница? Мы ж не знаем что там за интервады и откуда они берутся. Сказано, что время между измереними может быть любым - достаточным, из этого и исходим.

Внешний счётчик - здорово, но так вообще можно дойти до внешнего девайса с цифровым выходом. Пусть типа измеряет, а у ардуина у него по SPI спрашивает :)

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

Ворота пишет:

Пусть типа измеряет, а у ардуина у него по SPI спрашивает :)

Кстати, наиболее универсальный выход. И, главное, не лимитирован по частоте.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

vshurik пишет:

Всем доброго времени суток!!! 

Есть два дискретных сигнала, по ним срабатываю прервания, в обратчике прерваний использую 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, что в теории может дать около тех самых семи тактов, насчитанных тут выше ЕвгениемП.

Green
Offline
Зарегистрирован: 01.10.2015

ТС о точности измерения не говорит. Поэтому можно и без прерываний, и без ICP - ловить изменения входного сигнала, сохраняя в буфер значения Таймера1.  Получится простой программный ICP, безо всякого железа.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Зачем делать "программный", если есть железный не подскажите? Хотя .. впрочем тут много кто решает ногодрыгами задачи, которые вполне нормально решены аппаратно. Не удивляет уже. :)

Green
Offline
Зарегистрирован: 01.10.2015

Минимум телодвижений.) А для начинающего чем проще, тем лучше! Чем лучше аппаратно?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Не, ну ежели мозгоклюйство с программной эмуляцией того, что уже сделано аппаратно - это "миниум телодвижений" .. то, не - не мазохист как-бэ. :)

Аппаратно оно ДЛЯ ТОГО и реализовано, чтобы ОСВОБОДИТЬ вычислительные ресурсы микроконтроллера для .. этих, как его, а! ВЫЧИСЛЕНИЙ. А вовсе не для того, чтобы занимать камень изысками мозгоклюйства .. не? :)

Green
Offline
Зарегистрирован: 01.10.2015

Да какой там КАМЕНЬ. Человеку может один раз нужно имзмерить и забыть! 

ssss
Offline
Зарегистрирован: 01.07.2016

А чё вы тут... 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.

Нус... кто даташит читать начнёт??? ))))))))

Green
Offline
Зарегистрирован: 01.10.2015

Так вроде ж, "на Arduino proMini можно такого добится?"

ssss
Offline
Зарегистрирован: 01.07.2016

Green пишет:

Да какой там КАМЕНЬ. Человеку может один раз нужно имзмерить и забыть! 

Ну и напишите всё ему... и на блюдечке... под SAM3X... программно... пусть померяет и забудет... ))))))

Green
Offline
Зарегистрирован: 01.10.2015

Я и на 328 писать не буду...))))))

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

Green пишет:

 ICP - ловить изменения входного сигнала, сохраняя в буфер значения Таймера1.  Получится простой программный ICP, безо всякого железа.

Фигню Вы напару с Arhat109-2 обсуждаете. У ардуино есть свои прерывания, как минимум таймера и сириала. Они там десятки микросекунд обрабатываются. И если измерение начнется/закончится какраз во время этой обработки (а с чего бы ему так не попасть?) то интервал получится с ошибкой "тудысюды" десяток микросекунд. Если есть последовательность интервалов, то с этим можна боротся статистически. Если старт происходит по инициативе ардуины - то тоже решаемо, перед стартом на 100мсек можна позапрещать мешающие прерывания.

Можна конечно по рабочекрестянски запретить прерывания системного таймера на все время ожидания  начала интервала, правда тогда половина стандартного функционала ардуины отвалится. Ну а не начнется событие вобще - ресетом можна рубануть, есть и такие писятели ;)

Green
Offline
Зарегистрирован: 01.10.2015

Logik, ну вот вы вроде как грамотный мужик, ну какие 10-ки мс, если мы меряем 0,5 мкс! Устественно все прерывания запрещаются, и на кой тут стандартный функционал, если мне нужны только эти измерения! Измерил, включил всё, и выводи результат. Неужто так сложно!(

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

Отвечаю. 10-ки мкс - типичные времена обработки прерываний системного таймера, все прерывания поступившие в это время будут отложены до завершения его обработки, т.е на время до 10-ки мс. Несогласны? На эти же 10-ки мкс будет приостановлено предлагаемое Вами програмное ожидание начала/конца интервала. А это и есть фигня в точности измерения. Стандартный функционал - тот который присутствует из коробки, миллис например, обмен с сириалом. Запретите все прерывания, попробуйте работать- поймете.

//Измерил, включил всё, и выводи результат. Неужто так сложно!(

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

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

andriano пишет:

Ворота пишет:

Пусть типа измеряет, а у ардуина у него по SPI спрашивает :)

Кстати, наиболее универсальный выход. И, главное, не лимитирован по частоте.

По частоте - да. А вот с унивирсальностю какраз ниразу нет. Стоит поменять в схеме опыта хоть что - полярности импульсов их порядок и т.д. и аппаратное решение сразу проигрывает програмным извращениям.

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

Logik пишет:

А вот с унивирсальностю какраз ниразу нет. Стоит поменять в схеме опыта хоть что - полярности импульсов их порядок и т.д. и аппаратное решение сразу проигрывает програмным извращениям.

Это с какой стати программное решение универсальней аппаратного?

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

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 (тока тут переключение уровня прерывани нет)

 

ssss
Offline
Зарегистрирован: 01.07.2016

Logik пишет:

Стоит поменять в схеме опыта хоть что - полярности импульсов их порядок и т.д. и аппаратное решение сразу проигрывает програмным извращениям.

Это что за бред голимый??? Лишь бы что писануть???

По САМ3 ничего не скажу... да и мало кто, похоже, скажет... крайне не популярный чип... 328-я ваще голь голимая...

Ну так ардуина же типа платку с СТМ32Ф103Ц8 поддерживает... чего изголяться то??? Там измерение периода хардварно прямо в даташите расписано... Чтобы поменять полярность или порядок импульсов... всего лишь поменять пару бит в регистрах таймера...

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

roman2712@mail.ru пишет:

3) переключаете прерывание ICR c 1->0.

ТС нигде не писал, что он измеряет: время между двумя фронтами или длительность сигнала. Этот твой пункт нужен только если второе.

Вообще, алгоритм подробно расписан в посте №9. Если надо именно длительность сигнала, тогда - можно поменять параметр прерывания, как ты ипшешь, там как раз есть запасной такт, а одного такта на это хватит. Но это всё. Больше ничего нельзя, т.к. уже нет ни одного такта в запасе.

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

andriano пишет:

Logik пишет:

А вот с унивирсальностю какраз ниразу нет. Стоит поменять в схеме опыта хоть что - полярности импульсов их порядок и т.д. и аппаратное решение сразу проигрывает програмным извращениям.

Это с какой стати программное решение универсальней аппаратного?

С той что изменения в программе или настройках произвести проще и дешевле чем в схеме и разводке платы. Особенно в готовом изделии.

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

roman2712@mail.ru пишет:

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  в режиме ожидания начала тоже писал - будет каличная поделка.

ssss
Offline
Зарегистрирован: 01.07.2016

Logik пишет:

Что будет если запретить все прерывания кроме  ICR  в режиме ожидания начала тоже писал - будет каличная поделка.

Вот поэтому самое правильное... это хардварное решение... Там вообще ничего ждать не надо... даже если импульсы появятся через сутки...

ssss
Offline
Зарегистрирован: 01.07.2016

Logik пишет:

изменения в программе или настройках произвести проще и дешевле чем в схеме и разводке платы. Особенно в готовом изделии.

Бред... Никто, в здравом уме, такие вещи на конечной стадии не делает... ну кроме даунов и откровенно упоротых... Да и точность программных извращений... всегда печальна... увы...

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ssss пишет:
Да и точность программных извращений... всегда печальна...
Это если извращенцы программируют.

ssss
Offline
Зарегистрирован: 01.07.2016

Физику программно - всегда извращение... )))))))))

Те кто в теме... такими извратами не маятся...

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

ssss пишет:

Те кто в теме... такими извратами не маятся...

Это правильно. Те, кто понимает, что не умеет программировать, те и не лезут. Хуже когда не умеют, но не понимают этого.

ssss
Offline
Зарегистрирован: 01.07.2016

Ну так... поймите... и успокойтесь... ))))))))))))

.del.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Да, мне сетить не надо, я сам себе солнце. .del.

ssss
Offline
Зарегистрирован: 01.07.2016

.del.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

.del.