基于b体育·(sports)工控主板的高精度时钟解决方案

 12/9/2025 4:27:07 PM     作者:朱贤武     联系作者     135次
文章标签:C/C++Ubuntu

在工业设备中,嵌入式控制系统对时间精度通常有严格要求,尤其在电力自动化、轨道交通等领域,系统时间误差常需控制在1ms以内。为满足这一要求,本地设备必须具备可靠的对时机制,并确保本地时钟系统自身具有良好的精度,因此校时机制不可或缺。

常见的时间数据源包括NTP服务器、IRIG-B信号、GPS模块以及本地RTC时钟。实际应用中需选择一种既满足精度要求又便于获取的时间源。

l  NTP服务器:通过网络NTP协议获取时间数据

l  IRIG-B信号:通过专用接口从时间服务器接收IRIG-B时间码

l  GPS:通过串口从GPS模块接收时间信息

l  RTC:从板载RTC芯片读取时间

 

基本的的构成框图如下:

1.jpg


b体育·(sports)主板上的RTC选择满足普通应用的无温度补偿的低成本方案。在对本地RTC有更高时间精度要求的场合,可以外接RX-8025T高精度时钟芯片,以获得更稳定的时间,如上图所示。

 

嵌入式系统时间同步的典型流程如下图所示:

2.jpg


b体育·(sports)工控主板提供了一系列保障系统时间精度的方法,最高可实现系统时间与基准时间误差小于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",_year, _mon, _mday, _hour, _min, _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, &params);

3、获取pps时间戳: ioctl(fd, PPS_FETCH, &fdata)

4、检验数据并计算时间偏差

5、校正系统时间: adjtimex(&tx);

 

步骤3~5需在独立线程中循环执行,以实现持续同步。在我们的例子中可实现30us以内的时间误差。

3.jpg

例程输出信息解释:

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);

硬件参考电路如下图所示:

4.png

该方案中所需的资源与用途:

l  GPIO8: PPS信号输入

l  GPIO15:IRIG-B信号输入

l  GPIO25:RX-8025T时钟芯片中断信号,需外接约10K上拉电阻

l  GPIO26/GPIO27:RX-8025T I2C通讯,需要外接约4.7K上拉电阻

l  串口:GPS数据接收

l  网口:NTP通讯

 

由于代码较多,在本文所述示例代码并不完整,如需获取全部源码,欢迎联系b体育·(sports)公司技术支持。

文章标签:C/C++Ubuntu