Я думаю, что этот вид едва вписывается в правила, но это достаточно интересно, что я думаю, что я все равно опубликую это.
Высокоточный генератор GPS-синхронизированных меток времени для сбора данных.
Это довольно интересный проект, который предназначен для обеспечения простого способа синхронизации нескольких независимых систем сбора данных.
По сути, я работаю в исследовательской лаборатории, и у нас часто есть инструменты, которые имеют несколько независимых систем сбора данных, которые могут быть физически разделены на целых 50 футов. Нам нужно уметь соотносить время, в которое были взяты пробы из каждой системы, что может быть затруднительно, если вы хотите разрешить время выборки с большой степенью точности. Используя что-то вроде системы сбора данных USB, просто задержка USB может вводить несколько сотен миллисекунд неизвестной задержки, которая может варьироваться от приобретения к приобретению.
Предыдущее решение представляло собой 24-разрядный параллельный счетчик, который был просто подключен повсюду, требовал огромного жгута проводов, и это было своего рода болью в прикладе.
В этой системе используется специальный модуль GPS синхронизации, который может синтезировать произвольные тактовые частоты, которые синхронизированы по фазе и частоте с атомными часами в спутниках GPS.
MCU отвечает за связывание сообщений данных GPS (мне пришлось значительно расширить и оптимизировать существующий синтаксический анализатор протокола для данных GPS). GPS настроен на использование проприетарного двоичного протокола, и все это анализируется парсером, который я написал.
Проект прошел ряд ревизий (на фото ниже).
дизайн
Ревизия!
Ред. 1: никогда не работал, потому что я первоначально надеялся использовать программное обеспечение dPLL для гораздо менее дорогого GPS, чтобы синтезировать высокочастотные тактовые импульсы только с выходом 1 PPS. Возможно, можно заставить это работать, но временные вложения просто сделали его не стоящим. (а я слишком хреновый кодер)
Используется параллаксный винт MCU. Отсутствие достойных скомпилированных языков также было серьезной проблемой.
Ред. 2: Перешел на ATmega2560. Работал, имел много прикольных дизайнерских аспектов, унаследованных от первой версии. Прежде всего, продолжающееся использование сдвиговых регистров для 32-битного выхода, несмотря на более чем достаточное количество операций ввода-вывода на ATmega2560.
Первая плата, на которой работал Optiboot, и которая была полностью запрограммирована с использованием стандартного набора инструментов Arduino, до того, как меня это раздражало, и я начал модифицировать набор инструментов, чтобы лучше соответствовать моим целям.
Рев 3: тоже сработало. Заземление проводки связано с тем, что эта плата имеет встроенный USB-концентратор для уменьшения количества необходимых USB-портов (для интерфейса FTDI требуется 1 USB, а у GPS также есть USB-интерфейс). К сожалению, GPS не будет правильно перечислять, хотя устройство FTDI работало нормально, и я использовал этот концентратор в другом месте без проблем. Weird.
У меня нет подходящего USB-отладчика, поэтому я просто полностью отключил USB-концентратор, а не пытался решить проблему. USB GPS не действительно используется много вне множества-вверх в любом случае.
Версия 4: Полуфинал версии ATmega2560. Добавлен жидкокристаллический индикатор состояния GPS, со светодиодами и т. Д. Кроме того, лучшие следы для возможных суперконденсаторов для поддержания статуса GPS, когда не включен.
Это последняя версия Optiboot.
MStime
является MSTOW
или миллисекундным временем недели, которое является именем значения данных GPS, которое выводится на временной отметке out. Это 32-битная переменная, которая увеличивается один раз в миллисекунду и переворачивается каждую неделю. Это более неясная часть стандарта GPS.
ITOW
является другим значением, связанным с GPS, и является значением, которое соответствует сигналу 1PPS. Корреляция между ними не отображается должным образом на ЖК-дисплее, так как у меня нет времени ЦП для обновления ЖК-дисплея со скоростью, которую я хотел бы. Это было на самом деле одной из главных вещей, которые улучшились при обновлении до устройств Xmega.
Версия 5: полная архитектура переключения. Теперь используется процессор ATxmega128A1U. Больше не совсем Arduino, но возможность иметь несколько уровней прерываний в серии процессоров xmega позволила мне значительно улучшить структуру кода.
Два жгута проводов от меня делают некоторые эксперименты, плата отлично работала и без них.
Жду с нетерпением:
Ред 6
Добавьте возможность использования ЖК-дисплеев разных размеров, дополнительную защиту от электростатического разряда при подключении антенны GPS (это было проблемой), возможность использовать батарею CR2032 для поддержания часов GPS вместо суперконденсаторов.
Также значительно улучшена маркировка светодиодов отладки и состояния.
И бонус Nyan-Cat!
(Эти доски уже готовы к изготовлению. Когда я их получу, я добавлю фотографии настоящей доски.)
Я провел длительное тестирование между двумя платами ATmega2560, и в течение 72 часов среднеквадратичная ошибка времени между двумя устройствами составляла ~ 20 мкс. Это было с двумя совершенно независимыми антеннами тоже. Моя цель разработки была <1 мс, поэтому я чертовски доволен этим.
В целом, я думаю, что это хорошо показывает, как Arduino может быть полезным инструментом для раннего создания прототипов для «реальных» продуктов / систем. Я использую его для запуска начальной тестовой версии с минимальными усилиями, и когда я уверен, что идея сработает, я фактически перенес всю работу на переход к полностью индивидуальной, специфичной для конкретной реализации реализации.
Файлы дизайна:
https://fake-server.no-ip.org/svn/FPGAStuff/DAQ%20systems/
(из серии каталогов «GPS Timestamp»).
(Примечание: файлы взяты из Altium Designer. Это не файлы Eagle).
Исходный код:
https://fake-server.no-ip.org/svn/Programming/Code/AVR/
Опять же, в серии каталогов "gpsTimeStamp".
Извините за дерьмовые картинки на телефон.