SENT协议大多用于车载行程传感器上,具体协议规范这里不讲,不了解的朋友可以看一下其他人的帖子。我这里只讲如何使用LabVIEW及NI硬件采集并解析SENT协议。
硬件采集方案
SENT协议的解析,物理本质是测量连续方波信号的周期。
目前市面上常用的硬件方案有三种:
NI FPGA 直接处理数字信号
NI AI采集数字波形并解码
NI CI 用计数器测量脉冲周期并解码
以上三种方案均可实现SENT协议的硬件采集,本人强烈推荐使用CI方案。原因如下:
1、FPGA虽然灵活,但是太贵。
2、AI采集要求AI的采样率至少达到1MHz,且如果要降低误码率采样率要更高。无论是价格还是CPU处理效率,都没有优势。
3、CI的解决方案,价格便宜,虽然抗干扰能力较差,但通过补偿解码算法将误码率降为≈0%。这个“补偿解码算法”是本文的重点。
硬件选型
由于CI的运行模式需要使用“CI脉冲时钟滴答”模式,此模式并非所有NI采集卡的CI资源均支持。
本人使用的型号是PCIe-6361,据我所知NI 多功能采集卡中X系列的卡应该都支持这种模式。
SENT解码干扰
SENT信号的时基一般是3us,像这种频率的信号频率相对来说比较高。CI是数字信号,只要你的电压值满足其高低电平阈值范围,均会触发其逻辑。这种敏感性会导致通讯信号上的一些高频干扰会误触发CI的测量。
下图是一组实测的SENT数据,我们可以看到,画圆圈的部分就是由于高频干扰产生的误触发。
对于这种误触发,我先列举几个错误的处理方式(都是我走过的弯路)
1、加滤波
此方案不可行,因为SENT协议是一个用方波周期表达数据的协议,滤波电路会导致方波的上升下降沿发生变化,影响方波周期的测量,增大误码率。
2、使用NI CI自带的数字滤波器硬件功能实现
NI的CI资源有一个数字滤波器功能,可以靠硬件将脉宽小于设定时间的脉冲忽略掉。这个功能理论上能解决这个问题,但我没研究明白这玩意到底怎么用。也不清楚它只是单纯的去除了小脉冲,还是将小脉冲补偿到了大脉冲里,如果是前者会造成误码。
3、不处理,用CRC校验去除校验失败的数据。
这种方案会造成很高的误码率,因为SENT协议的CRC校验只有4个bit,即使错误的数据,也有可能通过CRC校验。
4、直接删掉这些高/低滴答明显小的数据
也不行,因为这些数据也是有效数据周期的一部分,去掉他们会影响到SENT的周期测量。
解码算法
正确的方式是将这些高/低滴答数据明显小的数据,补偿到上一帧或者下一帧。下图是经过补偿算法后解析到的数据。这个数据后面3个Nibble是一个累加器,大家可以看到所有数据都是连续的,说明没有出现误码。
还有一点要额外说一下,SENT协议每帧的第一个脉冲是同步用的,固定56个时基。这个时基虽然理论上是3us,但是实际上会有上下浮动。如果要做到100%的解码率,需要对每个帧根据这个56求实际的时基时间,然后用这个时间去解析后面的数据。不能使用常量。
本人实测下来,此方法可以做到100%的解码成功率。
程序层面
硬件初始化部分:
数据读取部分:
解码函数
解码函数比较复杂,我直接贴VI吧。LabVIEW2020版本的。