ESM335x是英創公司推出的基于TI AM335x Cortex-A8 CPU的高性能工控主板,板載了豐富的應用通訊接口,如LVDS/TTL標準顯示接口,4USB、6串口、雙CAN、雙網口等。除此之外,ESM335x還引出了一組精簡ISA總線,我們基于ESM335x的ISA總線設計了一系列擴展模塊,比如8串口擴展模塊ETA508、雙網口擴展模塊ETA728和4路CAN總線擴展模塊ETA704,使得ESM335x能夠滿足更多復雜的工業應用,比如通訊管理機。當然用戶也可以利用ESM335x 的ISA總線擴展自己的專有應用模塊,以適應特定的現場應用需求。
在電力、交通、電信等行業,一般要求設備具有高精度的時鐘,通常由時鐘源提供高精度的時鐘信息輸出,而設備需要有自動校時和時鐘同步的能力,IRIG-B是目前廣泛應用的較時方案之一,本文就將介紹ESM335x通過GPS時鐘源產生的IRIG-B(DC)碼實現時間同步的方法。
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脈沖的前沿為秒準點標志,也是一個時間格式的幀參考標志。一個時間格式幀包含了秒,時,分,天數,年份,控制位等豐富的信息。
圖1:IRIG-B碼標準
上面是對IRIG-B碼的簡單介紹,在實際使用IRIG-B碼時鐘源與ESM335x進行時間同步時,用戶并不需要關心IRIG-B碼的具體含義和實現方法,僅需要將B碼脈連接到ESM335x的較時引腳就可以了,ESM335x的驅動程序將完成B碼解碼、同步等工作。
ESM335x(EM335x)使用GPIO6作為B碼脈沖輸入管腳。
由于GPIO6還復用了PWM功能,所以當使用較時功能時,系統的“PWM1:”則不可用。另外需要特別注意的是:ESM335x(EM335x)所有GIPO的最高輸入電壓不能超3.3V,否則將損壞主CPU,所以在連接B碼信號時應該根據實際情況增加相應的電平轉換電路。
應用程序打開設備"IGB1:"后,對應的驅動程序就會根據注冊表的設備,自動進行時間同步,下面是IRIG-B碼校時的例子代碼:
#include"stdafx.h"
#include
#include"bsp_drivers.h"
#defineIOCTL_IRIG_B_GET_TIME
CTL_CODE(FILE_DEVICE_BUS_EXTENDER, 4055, METHOD_BUFFERED, FILE_ANY_ACCESS)
#defineIOCTL_IRIG_B_SYNC_NOW
CTL_CODE(FILE_DEVICE_BUS_EXTENDER, 4056, METHOD_BUFFERED,FILE_ANY_ACCESS)
int_tmain(intargc, _TCHAR* argv[])
{
HANDLE hIrigb;
SYSTEMTIME systime;
DWORD dwTimeoues;
// 打開系統較時功能,驅動程序會根據注冊表的設置自動較時
hIrigb = CreateFile(TEXT("IGB1:"),
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_RANDOM_ACCESS,
NULL);
if(hIrigb == INVALID_HANDLE_VALUE)
return-1;
// 立刻進行一次時間同步,超時時間設置為3000ms
dwTimeoues = 3000;
if(DeviceIoControl(hIrigb,
IOCTL_IRIG_B_SYNC_NOW,
&dwTimeoues,
sizeof(DWORD),
&systime, // 如果時間同步成功,返回當時系統時間
sizeof(SYSTEMTIME),
NULL,NULL))
{
RETAILMSG(1, (TEXT("Time: %04d-%02d-%02d.%02d:%02d:%02d\r\n"),
systime.wYear, systime.wMonth, systime.wDay,
systime.wHour, systime.wMinute, systime.wSecond));
}
else
{
RETAILMSG(1, (TEXT("Tiem sync faild!!!\r\n")));
}
// 查看最近一次同步的時間,如果返回失敗表示時間未同步
if(DeviceIoControl(hIrigb,
IOCTL_IRIG_B_GET_TIME,
NULL,
0,
&systime,
sizeof(SYSTEMTIME),
NULL, NULL))
{
RETAILMSG(1, (TEXT("Sync time: %04d-%02d-%02d.%02d:%02d:%02d\r\n"),
systime.wYear, systime.wMonth, systime.wDay,
systime.wHour, systime.wMinute, systime.wSecond));
}
// 關閉較時功能
CloseHandle(hIrigb);
return0;
}
用戶可以通過修改系統注冊表來配置靈活的校時方案,通過注冊表的設置,驅動程序可自動實現時間秒同步、分鐘同步、小時同步或日同步,對應的注冊表項如下:(下面的注冊表鍵值為系統默認值)
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\IGB1]
"Prefix"="IGB"
"Dll"="irig_b.dll"
"Priority256"=dword:88
; AutoSync =0: 禁止校時功能; =1: 秒同步; =2: 分同步; = 3: 小時同步; = 4: 日同步
"AutoSync"=dword:2 ; minute sync
; SyncMinute:當AutoSync為小時同步時,在SyncMinute分鐘進行同步
"SyncMinute"=dword:3b ; 0x3b = 59 -> minute on sync
; SyncHour: 當AutoSync為日同步時,在SyncHour小時進行同步
"SyncHour"=dword:17 ; 0x17= 23 -> hour on sync
傳統的工控板卡在對IRIG-B碼處理時,通常需要增加額外的硬件(如單片機,FPGA)對B碼進行解碼,然后再通過串口、總線或其它形式將數據交給主控板卡處理,增加了系統成本和操作難度,ESM335x可直接對B碼進行解碼,不需要增加任何硬件就能實現毫秒級精度的時間同步,大大降低了系統復雜程度,節約了成本,提高了系統穩定性。
-
嵌入式主板
+關注
關注
7文章
6097瀏覽量
36140
發布評論請先 登錄
必看!基于復旦微FMQL20S400M國產平臺的B碼對時,破解電力授時難題

芯盛智能榮獲2024年信息技術應用創新工作委員會卓越貢獻成員單位
飛騰助力首屆教育信息技術應用創新大賽圓滿落幕
中科創達榮獲2024年軟件和信息技術服務優秀企業
在TMS320DM335 DMSoC上實現DDR2/mDDR PCB布局

評論