Просьба подсказать по коррекции времени от GPS приемника. Как вообще мы работаем. У нас два устройства: первое - микроконтроллер с АЦП с жесткой привязкой с сигналам 1 PPS от GPS приемника (алгоритм использует пакеты TSIP и прерывание по 1PPS) - устройство работает отлично! (Т.е. ранесенный в пространстве приборы работают одинаково). Второе устройство - микроЭВМ с ОС Windows XP Embedded которое по порту COM1 принимает значений от микроконтроллера (1 пакет в секунды содержащий ровно 150 значений) и по порту COM2 принимает TSIP пакеты от GPS приемника для точной установки системного времени (используем пакеты 46 (для контроля количества спутников) и 41 (берем время если спутников не менее 4) - сигнал 1 PPS не используем - не имеем возможности).
Контроль осуществляем по часовым файлам (файл с данными: в одном файле ровно 180000 значений - или 1 час) и вот здесь возникает ошибка: допустим первый файл (от запуска) 09.24.12, то следующий файл 10.24.12, следующий 11.24.12 и так далее - если работаем без корректировки времени (системное время от внутренних кварцев) - то все верно: и время и количество значений в 1 файле.
Если работаем с корректировкой времени (т.е. время постоянно корректируем в течении часа): то каждый последующий файл отличается от самого первого примерно +- 1 с, примерно так: 09.24.12, 10.24.11, 10.24.13, 11.24.12...( количество значений в файле ровно 180000). Алгоритм вычисления времени:
if(GMT[0]==0x41) // если пришел 41 пакет - содержащий время (после проверки 46 пакета - о количестве спутников) { GetLocalTime(&st); dt = 0; dt|=GMT[7]; dt<<=8; dt|=GMT[8]; dt<<=8; dt|=GMT[9]; dt<<=8; dt|=GMT[10]; if(dt!=0) { T = *(float*)&dt; tcorr = T; // GSP поправка - для перевода в UTS dbg1->Lines->Add("Time correction = "+IntToStr(tcorr)+" sec."); } dt = 0; dt|=GMT[1]; dt<<=8; dt|=GMT[2]; dt<<=8; dt|=GMT[3]; dt<<=8; dt|=GMT[4]; if(dt!=0) { T = *(float*)&dt; dt = T; dt%=86400; int dth=dt; dth/=3600; st.wHour = dth; dt%=3600; int dtm=dt; dtm/=60; st.wMinute = dtm; dt%=60; st.wSecond = dt-tcorr; if(st.wSecond>65000) { st.wSecond+=60; st.wMinute-=1; if(st.wMinute>65000) { st.wMinute=59; st.wHour-=1; if(st.wHour>65000) st.wHour=23; } } } sTime = IntToStr(st.wHour)+" : "+IntToStr(st.wMinute)+" : "+IntToStr(st.wSecond); SetLocalTime(&st); // установка нового времени }
Где может быть ошибка и как правильно округлять значения времени: мы получаем (по RS232) в 41 посылки по протоколу TSIP от Lassen LP GSP время в виде 4 байт, после преобразования которых получаем число плавающего типа float и видим что всегда есть числа после запятой - как с ними поступать: округлять до минимального целого, до максимального целого или по закону математики (т.е. до 0,4 к 0; 0,5 и больше к 1)? Сейчас мы определяем время на микроЭВМ только из посылок TSIP (не используем сигнал PPS, т.к. он у нас занять на синхронизацию микроконтроллеров и АЦП) - на какую точность можно рассчитывать при установке времени только по посылкам?
|