在基于嵌入式主板的工业智能设备中,通常都要求设备具有校时的功能。对像电力自动化这样的行业,对校时的精度都有很高的要求,通常要求达到ms精度。为了实现这样精度的校时,一般需要GPS的支持,即由GPS模块向主板提供(1)包含绝对时间信息的串口数据,串口可以是RS232或RS485;(2)整分或整秒的脉冲,也称为PPS脉冲。在有了以上硬件支持的前提下,应用程序还需要按一定策略操作,才能实现高精度的校时。本文以英创公司的ARM9主板(其上运行Windows CE操作系统)为例,来介绍一种高精度对时方案,供客户在实际应用中参考。
硬件连接上,把作为时间基准的GPS输出的串口信号接到英创ARM9主板的一个串口上,比方“COM3:”;把PPS信号作为中断信号,接到英创ARM9主板的ISA_IRQ管脚,注意ISA_IRQ是上升沿有效,因此有可能需要对PPS脉冲进行反相处理。校时的软件操作包括以下步骤:
第1步,从“COM3:”串口读取GPS信息串,并解析出当前的时间参数,只需要保留到秒的精度,同时就可推算出下一个PPS脉冲所代表的整分或整秒时间,应用程序可方便的计算出这个时间,在CE中通常把时间表示为SYSTEMTIME格式。
SYSTEMTIME SysTime; // CE通常用该变量表示时间
第2步,当应用线程接收到ISA_IRQ中断事件时,把预先计算好的时间设置到系统中:
SetSystemTime(&SysTime);
由于设置时间,涉及到系统内核的节拍数的调整,所以会占用一定的时间,一般会超过1ms。所以第2步的设置,只实现了粗校时。
第3步,当后续的ISA_IRQ中断事件来到时,此时读出的时间:
GetLocalTime(&SysTime);
应当是整秒的,即SysTime.wMilliseconds应为0,但实际情况不会为0。这时可计算出偏差的毫秒数:
int nDeltaMilliseconds;
if(SysTime.wMilliseconds > 500)
nDeltaMilliseconds = 1000 - SysTime.wMilliseconds;
else
nDeltaMilliseconds = -SysTime.wMilliseconds;
第4步,应用程序在读取时间时,需要根据当前的nDeltaMilliseconds值进行校正:
FILETIME FileTime; // 时间单位= 100ns
GetLocalTime(&SysTime); // 读取当前时间
SystemTimeToFileTime( &SysTime, &FileTime ); // 转换成FILETIME格式
// 做精确的ms校正
FileTime = (__int64)FileTime +(__int64)(nDeltaMilliseconds * 10);
FileTimeToSystemTime( &FileTime, &SysTime ); // 转换回系统时间格式
由此得到的时间应当具有ms精度。
第5步,通常nDeltaMilliseconds的绝对值都应当在几个ms的范围,若绝对值超过100ms,通常意味着需要重新进行标定,即从第一步重新开始。另外需要注意的是,在进行粗校时时,最好关闭所有的TCP连接,因为粗校时,可能会使系统的Tick值变小,而系统Tick值一般会作为TCP数据的时间标签,若TCP应答的时间标签小于数据发送的时间标签时,会造成TCP连接始终挂起。
有关ISA_IRQ中断响应的相关编程可参考英创产品资料中的相关软件范例。建议客户在ISA_IRQ的范例代码的基础上,构建带精确校时功能的时间类class GPSTime;把ISA_IRQ接收线程发展成完成上述时间校正的有限状态机,最后为其他应用程序提供一个读取时间的API函数即可。
-
WINDOWS
+关注
关注
3文章
3523浏览量
88343 -
嵌入式主板
+关注
关注
7文章
6084浏览量
35164
发布评论请先 登录
相关推荐
评论