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

英創主板上的RTC選擇滿足普通應用的無溫度補償的低成本方案。在對本地RTC有更高時間精度要求的場合,可以外接RX-8025T高精度時鐘芯片,以獲得更穩定的時間,如上圖所示。
嵌入式系統時間同步的典型流程如下圖所示:

英創工控主板提供了一系列保障系統時間精度的方法,最高可實現系統時間與基準時間誤差小于1ms。實現高精度時間的前提是具備可靠的基準時間信號源,如PPS、IRIG-B、NTP或GPS信號。
下面以ESM7400為例,說明保持系統時間精度的基本軟件流程:
1、 系統啟動后,從ESM7400板載RTC讀取時間,初始化操作系統時間
2、 應用程序啟動后,從高精度時間信號源(IRIG-B、NTP、GPS)獲取標準時間,校正系統時間。此步驟只需在軟件啟動后執行一次有效校準即可。
3、 開啟PPS秒同步線程,持續進行時間微調,可將精度提升至50μs以內。該線程需持續運行,以實現每秒一次的高精度校正。
4、 定期(如每日1-2次)將校準后的系統時間回寫至板載RTC,保持RTC時間準確性。
5、 執行其它應用任務。
分步說明:
一、使用IRIG-B獲取標準時間
ESM7400內核已集成IRIG-B解碼驅動,使用時需將IRIG-B信號連接到ESM7400的GPIO15,相關示例代碼如下:
#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); //打開IRIG-B數據解碼設備
i1=IRIG_B_SET_SYSTIME; //獲取IRIG-B時間數據,并設置到系統時間
write(fd, &i1, sizeof(int));
i1=IRIG_B_SET_RTCTIME; //獲取IRIG-B時間數據,并設置到獨立時鐘芯片rtc0
write(fd, &i1, sizeof(int));
ret = read(fd, &t, sizeof(struct tm)); //只讀取IRIG-B時間數據
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");
對于NTP與GPS的時間獲取,內核末提供專用驅動,需在應用程序中實現協議解析。常用NTP服務器可參考:
l 中國國家授時中心:114.118.7.161
l 阿里云: 118.31.3.89
二、使用PPS實現秒同步
ESM7400內核已內置GPIO-PPS驅動,支持通過PPS信號進行高精度秒同步,精度可達到30us以內。PPS信號需要接入ESM7400的GPIO8。GPIO-PPS驅動本身不直接進行時間校準,核心功能是提供精確的時間戳與上報,時間校正需由上層應用調用adjtimex()完成。基本應用流程如下:
1、打開pps0設備: open("/dev/pps0", O_RDWR);
2、設置捕捉模式: ioctl(fd, PPS_SETPARAMS, ¶ms);
3、獲取pps時間戳: ioctl(fd, PPS_FETCH, &fdata)
4、檢驗數據并計算時間偏差
5、校正系統時間: adjtimex(&tx);
步驟3~5需在獨立線程中循環執行,以實現持續同步。在我們的例子中可實現30us以內的時間誤差。

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

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