Подсчитайте циклы от часов генератора, чтобы получить время

впервые на stackexchange, надеюсь, я в правильном месте. Я работаю над проектом, в котором мне нужно поставить метку времени события (которое будет обнаружено по электрическому импульсу) до нескольких десятков наносекунд и синхронизировать с GPS (потому что будет несколько таких модулей, которые необходимо синхронизировать вместе). ). Я искал простое решение arduino/raspberry, но, похоже, оно не будет лучше, чем 1-2 нас, далеко от ~ 30 нс.

Я думал использовать выход 1PPS (1 Гц) GPS, чтобы получить очень точное время, а затем найти временной интервал между этим импульсом и импульсом датчика, подсчитывая циклы внешних высокоточных часов. Я нашел часы, которые обеспечат погрешность менее 30 нс по сравнению с 1 с PPS (40 МГц, 10ppb, джиттер 1 пс).

Теперь проблема в том, как мне подсчитать эти тактовые циклы? Мой опыт по этому вопросу очень близок к 0, как и у моего товарища по команде. Любая помощь очень ценится.

РЕДАКТИРОВАТЬ: кажется, что это очень сложно для тех, кто имеет только опыт работы с микроконтроллером, отправляет данные через последовательный порт. Идеальным продуктом для моего приложения было бы что-то вроде этого: http://www.ti.com/product/TDC7201/description Просто подключите два импульса к контактам START и STOP, и он вернет временной интервал. Единственная разница в том, что мне нужно измерение 1 с (против 8 мс), но с точностью 10-50 нс (против 50 пс). В основном измерение в 1000 раз дольше с точностью в 1000 раз меньше.

ATmega328 (микроконтроллер в Arduino Uno) может синхронизировать события с разрешением до 62,5 нс, а не «1 или 2 микросекунды».
Я думаю, что вам нужно запустить процессор с тактовой частотой 40 МГц и использовать внутренний таймер для измерения интервала. Сигнал 1PPS может быть неточным, если GPS не синхронизирован со спутниками. Кроме того, сигнал 1pps может иметь медленное время нарастания или спада, и это может привести к некоторой временной неопределенности, если ваш порог напряжения переключения не очень стабилен. Если я правильно помню, 1pps стабилен в долгосрочной перспективе, но может иметь джиттер от цикла к циклу. Таким образом, идеальным решением может быть какая-нибудь цифровая PLL.
У GPS есть джиттер (11 нс для того, который я имею в виду). GPS является обязательным, так как нам нужно 5 синхронизированных модулей, разделенных примерно 10 км. Можете ли вы уточнить «запустите процессор с тактовой частотой 40 МГц и используйте внутренний таймер для измерения интервала»? Я читал о разрешении 62,5 нс ATmega по подсчету циклов процессора, но мне не удалось найти, как его посчитать. Даже в этом случае встроенные часы не обладают необходимой точностью (будут терять / опережать гораздо больше, чем 30 нс за 1 с).
@jms, OP означает абсолютную ошибку 30 нс за интервал времени 1 с. Неправильные часы arduino, вероятно, 50ppm, что даст вам ошибку 50us.
Во-первых, вам нужен «дисциплинированный генератор GPS», если только вы не собираетесь пытаться эмулировать его в программном обеспечении, применяя поправки на количество измеренных вами часов на GPS Гц. Ваши требования к временному разрешению могут нарушать типичные ограничения тактовой частоты периферийного счетчика/таймера MCU - как из-за того, что высокие внутренние часы умножаются внутри от более низкого входа, так и из-за того, что часто периферийные устройства не могут работать на полной скорости. Но посмотрите на различные современные детали ARM Cortex M4, чтобы понять, что будет проще. Чтобы работать быстрее, вы можете рассмотреть возможность использования FPGA для временных меток и MCU для отчетов.
Я имею в виду, что если процессор работает от высокоточного генератора, такого как ваш тактовый генератор 40 МГц, то другие тактовые генераторы внутри процессора будут иметь такую ​​же точность, даже если частота отличается из-за PLL и преобразования вверх / вниз с использованием делители/умножители и т. д. Многие процессоры имеют встроенные функции захвата времени, когда определенное событие запускает таймер, а другое событие останавливает его. Тогда это просто вопрос чтения регистра после того, как событие произошло. Не уверен, что он сможет поразить вашу цель, но если нет, то вам может понадобиться FPGA.
@ChrisStratton «попробуйте эмулировать это в программном обеспечении, применяя поправки на количество измеренных вами часов на GPS Гц». Если я правильно понимаю, это то, что я пытаюсь сделать. Остается вопрос, как посчитать количество тактов между двумя событиями (или электрическими импульсами)?
Вы используете периферийный счетчик/таймер в лучшем микроконтроллере, чем ATmega, или, если вам нужно работать быстрее, вы используете небольшую FPGA или специальный чип синхронизации - похоже, вы хотите, чтобы таймер событий работал на частоте 100 МГц или около того. Идея программных поправок заключалась бы в том, чтобы также измерять интервал 1pps GPS и применять любые отклонения от измеренной секунды к измеренному времени интересующих событий в соответствии с некоторой простой моделью погрешности быстрых местных часов. Это будет грубо, но дешевле, чем использование лабораторного источника с частотой 100 МГц или около того.
Если вы используете код, вы получаете счетчик из автономного таймера, частота которого известна. Если вы используете регистры захвата, вы правильно их настроили, а затем просто считываете прошедшее время из соответствующего регистра после того, как событие произошло. Я не программист, но иногда сталкиваюсь с такими вещами.
Некоторые наборы микросхем GPS имеют контакт импульсного входа, модуль сообщает вам время, когда он меняет состояние. Изучите ассортимент продукции uBlox. Для надежного достижения GPS менее 100 нс потребуется длительное время измерения или модный ионосферный приемник. Для калибровки вам потребуется доступ к более качественному эталонному устройству и счетчику временных интервалов. Возможно, вам повезет с несколькими устройствами одной и той же модели, которые легко проверить.
@tomnexus GPS, который я имел в виду, был на самом деле от uBlox ( u-blox.com/sites/default/files/products/documents/… ). Вы заставили меня заметить, что в нем есть «Временная метка входов внешних событий». Будет ли это надежным? Они заявляют, что точность RMS составляет 30 нс, должно ли это быть действительным для маркировки события на входе?
@user126881 user126881 это функция, о которой я говорил. Я думаю, что вы не сделаете лучше, чем это. Что касается точности, 30 нс — это предел того, что может сделать простой GPS, так как синхронизация на этом уровне определяется ионосферой. И это избавляет от всех проблем, связанных с проектированием схем.
@user126881 user126881 у вас все еще будет много проблем с таким быстрым вводом. Например, у меня есть Raspberry Pi, измеряющий что-то, используя в качестве триггера вывод GPS PPS. Я обнаружил, что это часто ложно срабатывает из-за электрических помех. Итак, я нахожу 11 или 12 импульсов каждые 10 секунд. Мне понадобится гораздо лучшее заземление и защита, чтобы остановить это.
@tomnexus Сегодня я связался с u-blox, и каждый из их модулей может это сделать, даже если это не всегда упоминается как функция. Для людей, которым может быть интересно, модули u-blox могут отмечать время события один раз в эпоху, то есть один раз в секунду для частоты обновления 1 Гц. Если в эпоху происходят два события, хронометраж будет присвоен только последнему.
@tomnexus Этот ublox может работать с частотой 5 Гц, поэтому вы получаете 1 событие каждые 200 мс. Другой вариант, если вам нужны более частые события, — запустить PPS с более высокой скоростью. Все ublox могут работать на частоте не менее 1 кГц на PPS. Это уменьшает максимальное время, необходимое для подсчета на разных часах, до 1 мс, что должно уменьшить количество ошибок. Знание абсолютного времени для каждого импульса PPS требует некоторой игры во время инициализации, но это выполнимо.

Ответы (3)

Подсчет циклов между импульсами PPS не является хорошим подходом. Даже при использовании часов со стабильностью 10 частей на миллиард вам все равно необходимо оценивать рассогласование между различными единицами измерения.

Использование встроенного GPS-приемника с отметкой времени является хорошим подходом. Обратите внимание, однако, что будет нелегко получить среднеквадратичную точность 30 нс в реальных условиях. 30 нс соответствуют точности позиционирования всего 9 м. В то время как большинство приемников легко достигают этого для положения с фильтром Калмана, вы увидите больше нарушений ваших временных меток (когда получатель не может использовать скрытую марковскую модель ), если вы также не усредните несколько событий.

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

Калибровка групповой задержки обычно не требуется для 30 нс, если все ваши модули используют одинаковую настройку (имеет значение длина кабеля антенны, а также усилители и т.п.).

Гораздо более высокая точность может быть достигнута, если вы сможете измерить событие в диапазоне сигналов GPS, то есть через радиочастотный интерфейс ресивера . Это свяжет синхронизацию непосредственно с полученными сигналами и даст возможность устранить несколько источников ошибок. Если вам не нужен результат в близком к реальному времени, вы можете записать сигналы GPS вместе с триггером и выполнить их постобработку. Это даст высокую точность относительного положения и времени (дифференциальный GPS).

Я не знаком с Arduino Uno, но, вероятно, у него есть модуль счетчика, который может измерять временные интервалы. Но это будет ограничено тактовой частотой, которая, вероятно, слишком мала для того, что вы хотите. Вам лучше переключиться на Arduino Due, у него наверняка есть такая возможность и он может работать на частоте 96 МГц. Изучите периферийное устройство счетчика/таймера (техническое описание). Используйте его для захвата

  • интервал между 1-секундными импульсами
  • интервал между последним 1-секундным импульсом и событием

По этим цифрам можно рассчитать точный интервал между последним импульсом и событием.

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

Я работал с R&D co. у которого когда-то была сеть с аналогичными требованиями для синхронного TDM в общей сети. Восходящий мультиплексор измерил фазовую ошибку узкого импульса от каждого «отправителя», так что нисходящие цели могли быть не только синхронизированы по фазе с общим потоком битов в их собственном временном интервале, но и синхронизированы по фазе из-за «расширения линии» или задержки или любая другая фазовая ошибка. Затем ретранслятор отправлял команды фазовой коррекции каждому отправителю, когда это необходимо, чтобы обеспечить идеальную синхронизацию центральной точки.

Чтобы выполнить что-либо подобное, ваш детектор фазовой ошибки должен иметь большее разрешение, чем требуемая ошибка, а дрейф во времени любого несинхронизированного отправителя должен преобразовываться во временной интервал, который можно скорректировать в пределах диапазона фазового детектора +/- xx нс. Использование обнаружения фазы ULF/VLF, например, дает больший фазовый диапазон, но при умножении до разрешения частоты, которое дает фазовую синхронизацию в районе 10 нс, требуется либо очень стабильный тактовый генератор с низким фазовым шумом, либо широкая полоса пропускания канала.

WWVB очень стабилен <1e-12 в f, но неадекватная полоса пропускания для коррекции лучше, чем несколько мс, из-за несущей 60 кГц с полосой пропускания в несколько кГц. Переведите это значение в ns, и пропускная способность вашей сети для исправления фазовых ошибок должна быть на 1e6 выше по частоте.

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

Я разработал множество различных доплеровских приборов от ОНЧ до УВЧ, поэтому здесь я говорю только об общих чертах.

Я согласен, что о наносекундах не может быть и речи (для этого потребуются часы с частотой ~ 1 ГГц), но Due с частотой 96 МГц должен достигать десятков наносекунд.
Я думаю, что Cortex с частотой 500 МГц может подойти лучше.
Может быть, проще, но это может быть излишним, и не так легко доступно. (У Due стоит Cortex-M3).