在工業(yè)設(shè)備中,嵌入式控制系統(tǒng)對(duì)時(shí)間精度通常有嚴(yán)格要求,尤其在電力自動(dòng)化、軌道交通等領(lǐng)域,系統(tǒng)時(shí)間誤差常需控制在1ms以內(nèi)。為滿足這一要求,本地設(shè)備必須具備可靠的對(duì)時(shí)機(jī)制,并確保本地時(shí)鐘系統(tǒng)自身具有良好的精度,因此校時(shí)機(jī)制不可或缺。
常見(jiàn)的時(shí)間數(shù)據(jù)源包括NTP服務(wù)器、IRIG-B信號(hào)、GPS模塊以及本地RTC時(shí)鐘。實(shí)際應(yīng)用中需選擇一種既滿足精度要求又便于獲取的時(shí)間源。
l NTP服務(wù)器:通過(guò)網(wǎng)絡(luò)NTP協(xié)議獲取時(shí)間數(shù)據(jù)
l IRIG-B信號(hào):通過(guò)專用接口從時(shí)間服務(wù)器接收IRIG-B時(shí)間碼
l GPS:通過(guò)串口從GPS模塊接收時(shí)間信息
l RTC:從板載RTC芯片讀取時(shí)間
基本的的構(gòu)成框圖如下:

英創(chuàng)主板上的RTC選擇滿足普通應(yīng)用的無(wú)溫度補(bǔ)償?shù)牡统杀痉桨浮T趯?duì)本地RTC有更高時(shí)間精度要求的場(chǎng)合,可以外接RX-8025T高精度時(shí)鐘芯片,以獲得更穩(wěn)定的時(shí)間,如上圖所示。
嵌入式系統(tǒng)時(shí)間同步的典型流程如下圖所示:

英創(chuàng)工控主板提供了一系列保障系統(tǒng)時(shí)間精度的方法,最高可實(shí)現(xiàn)系統(tǒng)時(shí)間與基準(zhǔn)時(shí)間誤差小于1ms。實(shí)現(xiàn)高精度時(shí)間的前提是具備可靠的基準(zhǔn)時(shí)間信號(hào)源,如PPS、IRIG-B、NTP或GPS信號(hào)。
下面以ESM7400為例,說(shuō)明保持系統(tǒng)時(shí)間精度的基本軟件流程:
1、 系統(tǒng)啟動(dòng)后,從ESM7400板載RTC讀取時(shí)間,初始化操作系統(tǒng)時(shí)間
2、 應(yīng)用程序啟動(dòng)后,從高精度時(shí)間信號(hào)源(IRIG-B、NTP、GPS)獲取標(biāo)準(zhǔn)時(shí)間,校正系統(tǒng)時(shí)間。此步驟只需在軟件啟動(dòng)后執(zhí)行一次有效校準(zhǔn)即可。
3、 開(kāi)啟PPS秒同步線程,持續(xù)進(jìn)行時(shí)間微調(diào),可將精度提升至50μs以內(nèi)。該線程需持續(xù)運(yùn)行,以實(shí)現(xiàn)每秒一次的高精度校正。
4、 定期(如每日1-2次)將校準(zhǔn)后的系統(tǒng)時(shí)間回寫(xiě)至板載RTC,保持RTC時(shí)間準(zhǔn)確性。
5、 執(zhí)行其它應(yīng)用任務(wù)。
分步說(shuō)明:
一、使用IRIG-B獲取標(biāo)準(zhǔn)時(shí)間
ESM7400內(nèi)核已集成IRIG-B解碼驅(qū)動(dòng),使用時(shí)需將IRIG-B信號(hào)連接到ESM7400的GPIO15,相關(guān)示例代碼如下:
#define IRIG_B_SET_SYSTIME 0x00
#define IRIG_B_SET_RTCTIME 0x01
int ret, i1, fd;
struct tm t;
fd = open("/dev/irig-b", O_RDWR); //打開(kāi)IRIG-B數(shù)據(jù)解碼設(shè)備
i1=IRIG_B_SET_SYSTIME; //獲取IRIG-B時(shí)間數(shù)據(jù),并設(shè)置到系統(tǒng)時(shí)間
write(fd, &i1, sizeof(int));
i1=IRIG_B_SET_RTCTIME; //獲取IRIG-B時(shí)間數(shù)據(jù),并設(shè)置到獨(dú)立時(shí)鐘芯片rtc0
write(fd, &i1, sizeof(int));
ret = read(fd, &t, sizeof(struct tm)); //只讀取IRIG-B時(shí)間數(shù)據(jù)
if(ret == 0)
printf("time:%d-%d-%d %d:%d:%d\n",t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
else
printf("irig-b get time failed!\n");
對(duì)于NTP與GPS的時(shí)間獲取,內(nèi)核末提供專用驅(qū)動(dòng),需在應(yīng)用程序中實(shí)現(xiàn)協(xié)議解析。常用NTP服務(wù)器可參考:
l 中國(guó)國(guó)家授時(shí)中心:114.118.7.161
l 阿里云: 118.31.3.89
二、使用PPS實(shí)現(xiàn)秒同步
ESM7400內(nèi)核已內(nèi)置GPIO-PPS驅(qū)動(dòng),支持通過(guò)PPS信號(hào)進(jìn)行高精度秒同步,精度可達(dá)到30us以內(nèi)。PPS信號(hào)需要接入ESM7400的GPIO8。GPIO-PPS驅(qū)動(dòng)本身不直接進(jìn)行時(shí)間校準(zhǔn),核心功能是提供精確的時(shí)間戳與上報(bào),時(shí)間校正需由上層應(yīng)用調(diào)用adjtimex()完成。基本應(yīng)用流程如下:
1、打開(kāi)pps0設(shè)備: open("/dev/pps0", O_RDWR);
2、設(shè)置捕捉模式: ioctl(fd, PPS_SETPARAMS, ¶ms);
3、獲取pps時(shí)間戳: ioctl(fd, PPS_FETCH, &fdata)
4、檢驗(yàn)數(shù)據(jù)并計(jì)算時(shí)間偏差
5、校正系統(tǒng)時(shí)間: adjtimex(&tx);
步驟3~5需在獨(dú)立線程中循環(huán)執(zhí)行,以實(shí)現(xiàn)持續(xù)同步。在我們的例子中可實(shí)現(xiàn)30us以內(nèi)的時(shí)間誤差。

例程輸出信息解釋:
l 序列:PPS脈沖計(jì)數(shù),連續(xù)表示信號(hào)捕獲穩(wěn)定。
l 系統(tǒng)時(shí)間:系統(tǒng)當(dāng)前時(shí)間(秒 + 納秒)
l PPS時(shí)刻:PPS脈沖在當(dāng)前秒內(nèi)的精確到達(dá)時(shí)間
l 偏移:系統(tǒng)時(shí)間相對(duì)于PPS脈沖的快/慢程度(微秒),上圖所示的數(shù)據(jù)表示系統(tǒng)時(shí)間比pps脈沖慢19us
l 調(diào)整:累計(jì)已調(diào)整的時(shí)間量,上圖所示已累計(jì)調(diào)整了2us
三、無(wú)外部基準(zhǔn)源時(shí)的RTC增強(qiáng)方案
在沒(méi)有IRIG-B或NTP或GPS等外部高精度時(shí)間源是,只能依靠板載的RTC來(lái)保證操作系統(tǒng)時(shí)間的準(zhǔn)確性性。為了保障更高時(shí)間精度,可依靠外接RX-8025T高精度時(shí)間芯片來(lái)提升時(shí)間可靠性。在硬件方面,通過(guò)I2C連接RX-8025T致ESM7400,并將RX-8025T的中斷輸出(秒邊沿對(duì)齊)接入ESM7400的GPIO25引腳,驅(qū)動(dòng)支持定期將RTC時(shí)間同步至ESM7400系統(tǒng)時(shí)間,每10秒同步一次,在晶振20ppm誤差下,可保證系統(tǒng)時(shí)間與RTC偏差小于300μs。
啟用該功能的代碼如下:
#define RTC_TIMER_IRQ_CTRL_ON 0x5170
#define RTC_TIMER_IRQ_CTRL_OFF 0x5171
// 打開(kāi) RTC 設(shè)備
rtc_fd = open("/dev/rtc0", O_RDONLY);
// 使能RTC中斷并同步系統(tǒng)時(shí)間
ioctl(rtc_fd, RTC_TIMER_IRQ_CTRL_ON, 1);
// 關(guān)閉同步功能
ioctl(rtc_fd, RTC_TIMER_IRQ_CTRL_OFF, 1);硬件參考電路如下圖所示:

該方案中所需的資源與用途:
l GPIO8: PPS信號(hào)輸入
l GPIO15:IRIG-B信號(hào)輸入
l GPIO25:RX-8025T時(shí)鐘芯片中斷信號(hào),需外接約10K上拉電阻
l GPIO26/GPIO27:RX-8025T I2C通訊,需要外接約4.7K上拉電阻
l 串口:GPS數(shù)據(jù)接收
l 網(wǎng)口:NTP通訊
由于代碼較多,在本文所述示例代碼并不完整,如需獲取全部源碼,歡迎聯(lián)系英創(chuàng)公司技術(shù)支持。
成都英創(chuàng)信息技術(shù)有限公司 028-8618 0660