EM928x工控主板IRIG-B码校时

   日期:2024-01-23     浏览:31    评论:0    
核心提示:在工控行业很多领域中,需要控制系统具有高精度的时间同步功能,IRIG就是美国靶场司令委员会制定的一种时间标准,英创在EM928x系列的Linux工控主板上实现了IRIG-B码校时功能。
在工控行业很多领域中,需要控制系统具有高精度的时间同步功能,IRIG就是美国靶场司令委员会制定的一种时间标准,英创在EM928x系列的Linux工控主板上实现了IRIG-B码校时功能。,

在工控行业很多领域中,需要控制系统具有高精度的时间同步功能,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这个结构体来进行获取时间的信息传递:

  struct tm

  {

    int tm_sec;          

    int tm_min;          

    int tm_hour;          

    int tm_mday;          

    int tm_mon;          

    int tm_year;          

    int tm_wday;          

    int tm_yday;          

    int tm_isdst;        

  #ifdef  __USE_BSD

    long int tm_gmtoff;      

    __const char *tm_zone;

  #else

    long int __tm_gmtoff;    

    __const char *__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中:

   #define SET_SYSTIME 0

   #define SET_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码进行解码,不需要增加任何硬件就能实现毫秒级精度的时间同步,大大降低了系统复杂程度,节约了成本,提高了系统稳定性。

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服