Технические форумы > Технический форум
GPSDO - стандарт частоты и времени
(1/1)
R8ACZ:
GPSDO (GPS disciplined oscillator) - высокочастотный генератор частоты (термостабилизированный кварцевый резонатор или рубидиевый генератор) стабилизированный по атомным часам спутниковой системы навигации. Конструктивно представляет GPS приёмник с внешней антенной, который на выходе выдаёт высокоточные сигналы с определённой периодичностью (1Гц - 15МГц), с использованием которых микроконтроллер корректирует частоту локального источника частоты (например OCXO). Преимуществом такого метода является то, что компоненты такой системы не очень дорогие, а стабильность частоты получается очень высокой (1*10^-12 - 1*10^-14), сравнимый с Цезиевым эталоном частоты. Недостатком является необходимость подключения внешней антенны GPS, и расположение её под открытым небом.
GPSDO широко используется в различной телекоммуникационной аппаратуре, по этой причине можно относительно недорого купить списанные модули от старой аппаратуры. На ebay можно найти наверняка рабочие модули, упакованные в красивые корпуса, с уже выведенными разъёмами питания, 10МГц и 1PPS, ценой от $90-100 и выше. Подобные модули, но без красивой коробочки можно приобрести на taobao за 200-500 юаней, но кроме того, что прямой доставки с данной площадки по разумным ценам до России нет, так ещё и большинство модулей маркировано как "не рабочий, под разбор на запчасти" или "не тестировался, но кристалл работает", в общем лотерея.
Я решил сыграть в лотерею, и приобрёл несколько, и часть оказались рабочими, хотя и с нюансами. Привыкнув к тому, что современный телефон при холодном старте находит местоположение за считанные минуты, решил поначалу что все модули не рабочие. Но оказалось, что в условиях не совсем открытого неба (антенна на балконе), старым GPS приёмникам из двухтысячных годов требуется значительно больше времени, чем современным. Из-за того, что у меня в зоне видимости оказалось всего 4 спутника, определение местоположения и синхронизация частоты заняла примерно час.
Trimble 57963-d GPSDO module
Для питания модуля требуется источник питания 5.5V 2A (6V также допустимо). По UART модуль молчит, на выходе 10MHz так же тишина. Возможно модуль не рабочий, отложил его пока. Именно такие модули устанавливают в GPSDO, продаваемые на ebay. Как и в остальных модулях, GPS антенна требуется активная, на неё подаётся питание 5В. Подробнее про данный модуль можно прочитать по ссылке.
Symmetricom UCCM GPSDO module
Для питания модуля требуется источник питания 5.5V 2A (6V также допустимо). Для управления наружу выведен RS232 интерфейс, но удалив чип RS232-UART конвертера и запаяв пару перемычек (как показано на фото) можно получить доступ напрямую к UART. После подачи питания модуль сразу запускается и начинает искать спутники. UART работает на стандартных настройках и скорости 57600. Для получения справки по доступным командам можно отправить знак вопроса в порт:
--- Цитировать ---UCCM-P > ?
*IDN?
ALARm:HARDware?
ALARm:OPERation?
DIAGnostic:OUTPut ON|OFF
OUTPut:ACTive:ENABle
OUTPut:ACTive:DISable
OUTPut:ACTive:HOLDover:DURation:THReshold <seconds>
OUTPut:ACTive:HOLDover:DURation:THReshold?
OUTPut:INACTive
OUTPut:INACTive?
OUTPut:STATe?
SYNChronization:HOLDover:DURation:STATus:THReshold <seconds>
SYSTem:PRESet
SYNChronization:TFOMerit?
LED:GPSLock?
SYNChronization:FFOMerit?
GPS:POSition N or S,<deg>,<min>,<sec>,E or W,<deg>,<min>,<sec>,<height>
GPS:POSition?
GPS:POSition:HOLD:LAST?
GPS:REFerence:ADELay <numeric value>
GPS:REFerence:ADELay?
GPS:SATellite:TRACking:COUNt?
GPS:SATellite:TRACking?
DIAGnostic:ROSCillator:EFControl:RELative?
SYNChronization:TINTerval?
DIAGnostic:LOG:READ:ALL?
DIAGnostic:LOG:CLEar
SYSTem:PON
OUTPut:MODE?
SYSTem:STATus?
SYSTem:COMMunication:SERial1:BAUD 9600|19200|38400|57600
SYSTem:COMMunication:SERial1:BAUD?
SYSTem:COMMunication:SERial1:PRESet
SYSTem:COMMunication:SERial2:BAUD 9600|19200|38400|57600
SYSTem:COMMunication:SERial2:BAUD?
SYSTem:COMMunication:SERial2:PRESet
OUTPut:STANby:THReshold <seconds>
changeSN
SYNChronization:REFerence:ENABLE LINK|GPS
SYNChronization:REFerence:DISABLE LINK|GPS
SYNChronization:REFerence:ENABLE?
STATus
POSSTATus
TOD EN|DI
TIME:STRing?
REFerence:TYPE GPS|LINK
REFerence:TYPE?
PULLINRANGE 0|1|2|...|254|255
PULLINRNAGE?
DIAGnostic:LOOP?
DIAGnostic:ROSCillator:EFControl:DATA GPS|<value>
DIAGnostic:ROSCillator:EFControl:DATA?
OUTPut:TP:SELection PP1S|PP2S
OUTPut:TP:SELection?
GPSystem:SATellite:TRACking:EMANgle <degrees>
GPSystem:SATellite:TRACking:EMANgle?
DIAGnostic:TCODe:STATus:AMASk
DIAGnostic:TCODe:STATus:OMASk
DIAGnostic:TCODe:ERRor:AMASk
DIAGnostic:TCODe:ERRor:OMASk
DIAGnostic:HOLDover:DELay
DIAGnostic:HOLDover:DELay?
GPS:SATellite:TRACking:IGNore <PRN>, ...,<PRN>
GPS:SATellite:TRACking:IGNore?
GPS:SATellite:TRACking:INCLude <PRN>, ...,<PRN>
GPS:SATellite:TRACking:INCLude?
GPS:SATellite:TRACking:<select>:ALL
Command Complete
--- Конец цитаты ---
Для получения информации о текущем состоянии модуля и качестве приёма GPS используются команды "POSSTATus", "SYST:STAT?". Также будет полезной команда "DIAGnostic:LOG:READ:ALL?" - она отображает лог статусов модуля, по которому можно узнать об ошибках. Например у меня в нём часто фигурирует запись "PDOP too high", что означает плохое качество сигнала GPS, из-за чего позиция определяется менее точно.
--- Цитировать ---UCCM-P > STATus
- UCCM Slot STATE -
1-1. #Now ACTIVE STATUS ---------------- [Master]
1-2. #Before ACTIVE STATUS ------------- [OCXO Warm]
2-1. #Reference Clock Operation -------- [Not Used]
2-2. #Current Reference Type ----------- [GPS]
2-3. #Current Select Reference --------- [GPS 1PPS]
2-4. #Current Reference Status --------- [Good Accuracy & Stable]
#GPS STATUS ----------------------- [Available]
#Priority Level ------------------- [GPS > LINK]
#ALARM STATUS
#H/W FAIL ---------- [ LINK ]
3-1. PLL STATUS ------------------------ [Enable]
3-2. Current: PLL MODE ----------------- [NORMAL 2 MODE]
Command Complete
--- Конец цитаты ---
По команде "DIAGnostic:LOOP?" можно увидеть отладочную информацию по корректировочным коэффициентам для опорного генератора:
--- Цитировать ---UCCM-P > DIAGnostic:LOOP?
-------------------------------------------------------------------------------
4/5/2018 17:14:33
-------------------------------------------------------------------------------
LOS MEAS NCO STATUS WEIGHT PBUC FBUC DBUC LBUC IBUC G M TC
-------------------------------------------------------------------------------
0: 1 0.000e+00 0.000e+00 0x07AC 0 700 700 0 0 2 2 4 29
1: 1 0.000e+00 0.000e+00 0x068C 0 700 700 0 0 0 2 14 226
GPS: 0 -2.818e-08 -2.439e-08 0x0000 1 ---- 1000 1000 ---- ---- 3 6 31
-------------------------------------------------------------------------------
freq cor = -2.439396e-08
phase cor = -8.000000e-10
gps phase = 7.366667e-08
temp cor = 2.053135e-11
Command Complete
--- Конец цитаты ---
GPS антенна так же используется активная, с подачей питания 5В по фидеру. В выводе команды "POSSTATus" можно увидеть ток, потребляемый GPS антенной. Подробнее о модуле можно прочитать на форуме eevblog.
True Position GPSDO module
В отличии от предыдущих двух, для питания данного модуля используется источник напряжением 12В (допустимо 9-15В) с током 2А. Данный модуль имеет выведенные на колодки интерфейсы RS232 и UART (скорость 9600, настройки по умолчанию). После подачи питания модуль не начинает работу и требует наличие внешнего контроллера. Для загрузки модуля и начала работы требуется отправить в UART порт сообщение "$PROCEED", если этого не сделать, то модуль будет раз в секунду отправлять в порт сообщение вида:
--- Цитировать ---$GETVER 12.0.1 BOOT 10 fbde 7437 06162200C2000A2007090BF8
--- Конец цитаты ---
Ключевое слово в данном сообщении "BOOT". После отправки команды модуль загрузится, загрузит из памяти предыдущие координаты места установки и начнёт поиск спутников. Раз в секунду в порт отправляется сообщение "$CLOCK" с текущей меткой времени. Раз в пять секунд отправляется сообщение "$STATUS", в котором содержится информация о состоянии (статус выхода 10МГц, статус выхода 1PPS, статус GPS антенны, время с момента фиксации текущей позиции в секундах, количество спутников, идентификатор состояния). Также раз в пять секунд отправляется сообщение "$EXTSTATUS", в котором последнее число означает температуру (платы, в районе OCXO, скорее всего):
--- Цитировать --->$PROCEED
$SETPOS
$SETPOS
$SETDELAY
$CLOCK 693878408 0 7
$EXTSTATUS 0 0 00.00 0.00
$STATUS 0 0 0 0 0 11
$CLOCK 693878409 0 7
$CLOCK 693878410 0 7
$CLOCK 693878411 0 7
$CLOCK 693878412 0 7
$CLOCK 693878413 0 7
$EXTSTATUS 0 0 00.00 44.13
$STATUS 0 0 0 0 0 19
$CLOCK 693878414 0 7
$CLOCK 693878415 0 7
$CLOCK 693878416 0 7
$CLOCK 693878417 0 7
$CLOCK 693878418 0 7
$EXTSTATUS 0 0 00.00 44.13
$STATUS 0 0 0 0 0 19
--- Конец цитаты ---
Так как раньше модуль стоят на другой стороне земного шара, то для ускорения поиск текущей позиции можно указать примерное местоположение вручную с использованием команды "$SETPOS" (формат можно посмотреть отправив команду "$GETPOS").
Описание команд и статусных сообщений, полученное путём реверс-инженеринга прошивки модуля:
--- Цитировать --- // Based on FW 12.0.1
// Commands:
//
// $PROCEED [Send at startup to get past the bootloader]
//
// $FACT [Factory preset]
// $GETBDELAY [returns board delay, nanoseconds]
// $GETDELAY [returns cable delay, nanoseconds]
// $GETPOS [return position ]
// $GETSCALEFACTOR [Returns a float, such as 3.742106e-3]
// $GETVER [returns version info]
// $KALDBG <0|1> [Enable reporting of Kalman filter parameters]
// $PPSDBG <0|1> [Enable or disable timing information every second]
// $RESET [Unit software reset]
// $SETBDELAY <n> [-32 <= n <= 32, Set board delay, PPS4 units (roughly 5 or 6 ns). PPS4 is controlled to equal this value]
// $SETDELAY <n> [-32768 <= n <= 32767Set cable delay, nanoseconds]
// $SETPOS <n> <n> <n> [set position to Lat/Long/Elevation_MSL, send value returned by survey]
// $SURVEY <n> [survey for n hours, default is 8]
// $TRAINOXCO [Start OXCO Training. This restarts the board ($PROCEED needed), and measures freq
// change with 500 ADC count]
// $UPDATE FLASH [update flash memory settings]
//
// Other unknown commands:
// $GETA [returns -1; Attenuator?]
// $GETP [returns -1 255; Potentiometer?]
// $SET1PPS ["$SET1PPS 0"/"$SET1PPS 1"] seems to go to a manual holdover mode, and status changes to 3]
// [Seems to return to normal a few minutes after "$SET1PPS 1 1"??? (Status goes 8,16,17,18,0]
//
// Messages:
// $STATUS
// 1: (Maybe 10 MHz bad, based on packrat docs)
// 2: (Maybe PPS bad, based on packrat docs)
// 3: Antenna is bad? 0=good
// 4: Holdover duration (secs)
// 5: Number of sats tracked (different than, but within 2 of $EXTSTATUS, perhaps only counts channels 0-7???, range is 0-8)
// Status [Locked = 0, Recovery = 1, (Forced holdover?)=3, Train OXCO=7, Holdover = 8,
// [Startup A/B/C/D = 10/11/2/19 ]
// [ (transition from 1 to 0) = (14,15,16,17,18) ] Wait states when transitioning
// [ (transition from 0 to 1) = (20,21,22) ] Wait states when transitioning
// (6 = locked, but unknown location????)
//
// $PPSDBG 1187153266 3 25.28081e3 -253 -6 2 2 0.0
// 1: same as clock (GPS Time)
// 2: Same as $STATUS status, but updates much more often (and seems to skip states less often)
// 3: Floating point number. Output voltage. Tends towards 29e3 on my board. Proportional to the DAC voltage
// On my RevC CTS board, Vbias ~= 6.25e-5*PPS3. This may make sense for a 4.096 V reference: 4.096/2^16=6.25e-5
// During startup, it is not put in the result string (this field is blank, so two sequential space characters are in the string)
// 4: Measured phase offset? Units seem something like 6.5*ns
// 5: Looks like a saw-tooth between -15 and 15 (or so). Perhaps the quantization error reported by the GPS module?
// 6: Normally 0, but sometimes 2 (related to holdover/startup?)
// 7: Normally 0, but sometimes 1 or 2 (related to holdover/startup?)
// 8: Always 0.0?
//
// $EXTSTATUS
// 1: SurveyStatus [0=normal, 1=surveying]
// 2: Number of sats (different than, but within 2 of $STATUS, perhaps only counts channels 0-9, range is 0-10)
// 3: DOP (maybe TDOP?)
// 4: Temperature (close to FPGA? close to oven?) (my board reads about 45C)
//
// $GETPOS (sent after setting position, or requesting position
// Latitude
// Longitude
// Elevation_MSL
// Correction to MSL to get WGS elevation (add this value to MSL to get WGS ellipsoid)
// Status flag [(Normal?)=0 on 196 board or =2 on Bliley board, Surveying=3], or maybe a FOM?
//
// $SURVEY 40448488 -86915296 225 -34 7129
// [sent during a survey]
// 1: Latitude
// 2: Longitude
// 3: Elevation_MSL
// 4: Correction to MSL to get WGS elevation (add this value to MSL to get WGS ellipsoid)
// 5: Number of seconds remaining
//
// $SAT
// Channel # (0-based, seems to only return channel 0 through 7)
// GPS Sattelite number
// Elevation (degree)
// Azimuth (degree)
// SNR (dB*Hz)
//
// $CLOCK 1187156731 18 3
// GPS UNIX-timestamp (secs since 1970), but my board is off by 10 years (reporting 2007 while it is 2017)
// Count of leap-seconds
// Time figure-of-merit (1=good, 7=bad)
//
// $GETVER 12.0.1 BOOT 10 fbde 7437 06162200B0000A2004183ACC
// $GETVER 12.0.1 0.4850266.0.1 19 fbde 7437 06162200B0000A2004183ACC
// [version information, I used this to know if I need to send the PROCEED command, String contains BOOT when in bootloader mode]
// [During boot, only terminated with LF but not CR(or maybe other-way around?)]
// 1: Bootloader version?
// 2: ("BOOT" during boot) or (software or perhaps GPS version info????)
// 3: Status code (same as $STATUS)
// 4: CRC of something?
// 5: Always 7437?
// 6: (Part number: 06162200)(Board Rev: B)(Assembly version: 0000)(Delimeter: A)(Year: 2004)(Week?: 18)(SN?: 3ACC)
//
// $WSAT 4 138 209 38 0
// [WAAS Satellite info, same format as $SAT]
//
// $SET1PPS
// [Sent at boot, but also in response to a $SET1PPS command. Sent every 20 seconds.]
//
// $KALDBG 1187203779 0.08 29.59241e3 0.120e-3 0.568 0 0
// [Only be sent when reference is locked (state=0)]
// 1: GPS UNIX-timestamp (secs since 1970), but my board is off by 10 years (reporting 2007 while it is 2017)
// 2: Floating point number.
// Resets to 0 at time of lock (and at end of holdover).
// 3: Floating point number. Magnitude is similar to PPS3, but does not track it so well.
// 4: Floating point.
// Resets to 0 at time of lock (and at end of holdover).
// 5: Floating point. Smoothed version of PPS3, seems like ~6.5*(PPS phase in ns)?
// Resets to 0 at time of lock (and at end of holdover).
// 6: Flag, always zero?
// 7: Flag, always zero?
--- Конец цитаты ---
Подробнее о модуле, а также пример контроллера для запуска модуля можно найти на github.
Навигация
Перейти к полной версии