在工控行業很多領域中,需要控制系統具有高精度的時間同步功能,IRIG就是美國靶場司令委員會制定的一種時間標準,英創在EM928x系列的Linux工控主板上實現了IRIG-B碼校時功能。
IRIG是美國靶場司令委員會制定的一種時間標準,其中的串行時鐘編碼共有6種格式,即A、B、D、E、G、H。它們的主要差別是時間碼的幀速率不同,廣泛應用的IRIG-B即其中的B型編碼,B型碼的時幀速率為1幀/s,可傳遞100位信息。圖1是IGIG-B碼示意圖,其時幀周期是1s,每秒100個碼元,使用脈寬編碼方式,每個碼元脈寬10ms,共三種碼元,其中高電平5ms和2ms分別表示二進制 “1”,“0”,高電平8ms為位置標識,分別為P0,P1,…P9。連續兩個8ms寬度脈沖的第二個8ms脈沖的前沿為秒準點標志,也是一個時間格式的幀參考標志。一個時間格式幀包含了秒,時,分,天數,年份,控制位等豐富的信息。
IRIG-B碼標準
首先在硬件連接上,我們使用GPIO23復用為接收IRIG-B碼脈沖信號的管腳,所以只需要將時鐘源發出的IRIG-B碼脈沖接到GPIO23,需要注意的是,GPIO管腳的輸入電壓不能超過3.3V,否則會引起CPU的異常或是損壞。如果時鐘源發出的脈沖為5V,就需要將電平轉換為3.3V才可以接入。硬件連接好后,我們來看看應用程序的實現方法:
首先需要打開IRIG-B這個設備節點:
fd = open("/dev/irig-b", O_RDWR);
if(fd < 0)
printf("open faile\n");
接下來使用標準的調用接口read和write就可以獲取和設置時間了,程序中使用了struct tm這個結構體來進行獲取時間的信息傳遞:
structtm
{
inttm_sec; /* 秒. [0-60] (1 leap second) */
inttm_min; /* 分. [0-59] */
inttm_hour; /* 時. [0-23] */
inttm_mday; /* 日. [1-31] */
inttm_mon; /* 月. [0-11] */
inttm_year; /* 年 - 1900. */
inttm_wday; /* 一周中的第幾天. [0-6] */
inttm_yday; /* 一年中的第幾天.[0-365] */
inttm_isdst; /* 時令. [-1/0/1]*/
#ifdef __USE_BSD
longinttm_gmtoff;
__constchar*tm_zone; /* 時區 */
#else
longint__tm_gmtoff;
__constchar*__tm_zone;
#endif
};
因為是直接從時鐘源中獲取的時間,所以我們只需要關注tm結構體中的年月日時分秒這六個成員。接下來我們進行讀取時間的操作:
struct tm t;
ret = read(fd, &t,sizeof(struct tm));
if(ret < 0)
printf("read failed!\n");
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);
讀取時間是通過阻塞的方式實現的,板卡會等到一次完整的時間脈沖信息才會返回本次時間,如果沒有獲取到完整的信息,會在5秒后返回系統時間并且打印提示信息。
為了方便客戶將時鐘源提供的時間設置到板卡中,英創公司提供了專用接口在驅動中獲取時間并寫入到系統或是RTC中,即write()函數,當調用write時,板卡會阻塞等待從時鐘源獲取一次完整的時間信息,然后根據寫入的參數,將時間直接設置到系統中或者RTC中:
#defineSET_SYSTIME 0
#defineSET_RTCTIME 1
i1 = SET_SYSTIME;
ret = write(fd, &i1,sizeof(int));
if(ret < 0)
printf("write failed!\n");
i1 = SET_RTCTIME;
ret = write(fd, &i1,sizeof(int));
if(ret < 0)
printf("write failed!\n");
按照上面的例子調用write就可以將從時鐘源獲取的時間寫入到板卡中,當輸入的數據為0時,驅動會阻塞等待一次完整的時間信息,獲得時間后將時間設置到系統中,阻塞等待的時間同樣為5s,否則返回不能獲取時間的信息。
如果輸入的數據為1時,驅動會同樣阻塞等待一次完整的時間信息,獲得時間后將時間同時設置到硬件實時時鐘和系統中,阻塞等待的時間同樣為5s,否則返回不能獲取時間的信息。
傳統的工控板卡在對IRIG-B碼處理時,通常需要增加額外的硬件(如單片機,FPGA)對B碼進行解碼,然后再通過串口、總線或其它形式將數據交給主控板卡處理,增加了系統成本和操作難度,英創Linux工控主板EM928x系列可直接對B碼進行解碼,不需要增加任何硬件就能實現毫秒級精度的時間同步,大大降低了系統復雜程度,節約了成本,提高了系統穩定性。
-
Linux
+關注
關注
87文章
11229瀏覽量
208927 -
嵌入式主板
+關注
關注
7文章
6085瀏覽量
35216
發布評論請先 登錄
相關推薦
評論