在基于嵌入式主板的工業智能設備中,通常都要求設備具有校時的功能。對像電力自動化這樣的行業,對校時的精度都有很高的要求,通常要求達到ms精度。為了實現這樣精度的校時,一般需要GPS的支持,即由GPS模塊向主板提供(1)包含絕對時間信息的串口數據,串口可以是RS232或RS485;(2)整分或整秒的脈沖,也稱為PPS脈沖。在有了以上硬件支持的前提下,應用程序還需要按一定策略操作,才能實現高精度的校時。本文以英創公司的ARM9主板(其上運行Windows CE操作系統)為例,來介紹一種高精度對時方案,供客戶在實際應用中參考。
硬件連接上,把作為時間基準的GPS輸出的串口信號接到英創ARM9主板的一個串口上,比方“COM3:”;把PPS信號作為中斷信號,接到英創ARM9主板的ISA_IRQ管腳,注意ISA_IRQ是上升沿有效,因此有可能需要對PPS脈沖進行反相處理。校時的軟件操作包括以下步驟:
第1步,從“COM3:”串口讀取GPS信息串,并解析出當前的時間參數,只需要保留到秒的精度,同時就可推算出下一個PPS脈沖所代表的整分或整秒時間,應用程序可方便的計算出這個時間,在CE中通常把時間表示為SYSTEMTIME格式。
SYSTEMTIME SysTime; // CE通常用該變量表示時間
第2步,當應用線程接收到ISA_IRQ中斷事件時,把預先計算好的時間設置到系統中:
SetSystemTime(&SysTime);
由于設置時間,涉及到系統內核的節拍數的調整,所以會占用一定的時間,一般會超過1ms。所以第2步的設置,只實現了粗校時。
第3步,當后續的ISA_IRQ中斷事件來到時,此時讀出的時間:
GetLocalTime(&SysTime);
應當是整秒的,即SysTime.wMilliseconds應為0,但實際情況不會為0。這時可計算出偏差的毫秒數:
int nDeltaMilliseconds;
if(SysTime.wMilliseconds > 500)
nDeltaMilliseconds = 1000 - SysTime.wMilliseconds;
else
nDeltaMilliseconds = -SysTime.wMilliseconds;
第4步,應用程序在讀取時間時,需要根據當前的nDeltaMilliseconds值進行校正:
FILETIME FileTime; // 時間單位= 100ns
GetLocalTime(&SysTime); // 讀取當前時間
SystemTimeToFileTime( &SysTime, &FileTime ); // 轉換成FILETIME格式
// 做精確的ms校正
FileTime = (__int64)FileTime +(__int64)(nDeltaMilliseconds * 10);
FileTimeToSystemTime( &FileTime, &SysTime ); // 轉換回系統時間格式
由此得到的時間應當具有ms精度。
第5步,通常nDeltaMilliseconds的絕對值都應當在幾個ms的范圍,若絕對值超過100ms,通常意味著需要重新進行標定,即從第一步重新開始。另外需要注意的是,在進行粗校時時,最好關閉所有的TCP連接,因為粗校時,可能會使系統的Tick值變小,而系統Tick值一般會作為TCP數據的時間標簽,若TCP應答的時間標簽小于數據發送的時間標簽時,會造成TCP連接始終掛起。
有關ISA_IRQ中斷響應的相關編程可參考英創產品資料中的相關軟件范例。建議客戶在ISA_IRQ的范例代碼的基礎上,構建帶精確校時功能的時間類class GPSTime;把ISA_IRQ接收線程發展成完成上述時間校正的有限狀態機,最后為其他應用程序提供一個讀取時間的API函數即可。
-
WINDOWS
+關注
關注
4文章
3556瀏覽量
89055 -
嵌入式主板
+關注
關注
7文章
6086瀏覽量
35505
發布評論請先 登錄
相關推薦
評論