来源 | 汽车ECU开发
对于自动驾驶而言,通常需要摄像头、毫米波雷达、超声波雷达、激光雷达等传感器,而这些传感器的精确的数据采集时间是及其重要的,因为这些数据是感知和决策规划的输入。如果输入数据的时间不同步,可能会引起决策规划出错误的动作,导致车辆做出危险的动作。
时间同步技术就是为了解决精确获取传感器采样时间的,在以太网、CAN、Flexray总线上都有相应的实现。时间同步信息以广播的形式从Master(TM)节点发送至各Slave节点(TS),或者通过时间网关将时间同步信息同步至其他子网络(如图1所示),用于解决各ECU因硬件时钟信号偏差、总线仲裁、总线传输、软件处理等原因带来的时间延迟。
下面我们主要来梳理基于CAN总线的时间同步。从AUTOSAR规范来看,其主要分为两步,第一步是TM发送SYNC信息,第二步是发送FUP(Timeadjustment message (Follow-Up),时间调整信息),如图2所示。
1、TM节点在t0r时刻调用接口发送SYNC信号,SYNC信号中包含的时间信息为t0r,在t1r时刻SYNC信号发送完成,此时的时间为t1r。TS节点在t2r时刻接收到了SYNC信号。
2、TM节点再次发送FUP信号,信号中包含的时间信息为t4r=t1r-(st0r),其中st0r=t1r-t0r,TS节点在t3r时刻接收到了FUP信号。
根据上面两步的时间信息,TS节点可以计算本地的时间同步值为t3r-t2r+t1r。
CAN时间同步中使用到的SYNC和FUP帧的帧格式如图3所示。
1,Byte0用于表示CRC是否起作用,其中Byte0=0x10表示不采用CRC,Byte0=0x20表示采用CRC;
2、当Byte0=0x20时,表示采用CRC,则Byte1用于存储CRC的值,当Byte0=0x10时,Byte1的默认值为0;
3、Byte2的高4位表示时间同步域,低4位为Sequence Counter,有点类似与应用报文的rolling counter;
Byte4~Byte7为同步时间,长度为32bits,单位为秒;
1、Byte0同样用于表示是否使用CRC,其中Byte0=0x18表示不适用CRC,Byte0=0x28表示使用CRC;
2、当Byte0=0x28时,表示采用CRC,则Byte1用于存储CRC的值,当Byte0=0x18时,Byte1的默认值为0;
3、Byte2与SYNC帧一样,高4位表示时间同步域,低4位为Sequence Counter;
4、Byte3的高5位为保留位,, bit2为SGW,表示时间同步状态(0:SyncToGTM, 1:SyncToSubDomain),bit1-bit0为OVS,表示时间同步溢出时间(overflow of seconds);
5、Byte4~Byte7中的高2位为0,低30位表示同步时间,单位为ns。
在AUTOSAR中要实现CAN时间同步,其涉及到的模块有3个,分别为STdM、CanIf、CanTSyn,各模块之间的关系如图4所示。
图4 AUTOSAR中实现CAN时间同步涉及到的模块
其中StdM用于同步各软件模块,并提供绝对时间值。涉及到的配置Timebase、时钟源等,主要几个如下所示。
对于CanTSyn模块而言,其涉及到的配置如下所示。
而在CanIf模块而言,需要将报文设置为时间同步报文,如下所示。
以上就是CAN时间同步的一个简单介绍,主要是梳理了时间同步技术的缘由、CAN时间同步机制、CAN时间同步在AUTOSAR架构下的实现。
参考:部分图片来自CSDN,https://blog.csdn.net/RichardsZ_/article/details/116714179