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