采集任务为什么容易出问题
采集任务看起来很简单:定时读取传感器,处理数据,发送出去。但在实际项目里,采集任务是最容易出问题的任务之一。
原因有几个:
第一,采集任务涉及的外设最多。 加速度计(SPI/I2C)、温度传感器(I2C/单总线)、ADC(如果测电池电压),每一个外设都有自己的时序、错误处理、初始化流程。
第二,采集任务的数据量最大。 三轴振动,3.2kHz 采样率,1 秒数据就是 9600 个采样点。这些数据要在 RAM 里缓冲、处理、压缩,容易出内存问题。
第三,采集任务对实时性有要求。 振动采集要求采样间隔精确(3.2kHz 意味着每 312.5μs 一个采样点),如果任务被高优先级任务抢占太久,采样就会丢失。
第四,采集任务的功耗敏感。 采集时间越长,功耗越高。要在“采集足够的数据”和“降低功耗”之间找平衡。
这篇文章,我要讲的是:怎么设计一个稳定、可靠、低功耗的采集任务,以及它背后的传感器驱动。
一、传感器驱动设计
加速度计的驱动
这个项目用的是 ADXL355(ADI 的三轴加速度计),SPI 接口,支持 3.2kHz 采样率。驱动设计如下:
// drv_adxl355.h #ifndef DRV_ADXL355_H #define DRV_ADXL355_H #include <stdint.h> #include <