FSR 多通道阵列在 MCU 端用 DMA 采样,最容易出的问题不是采不到数,而是采样间隔不均匀——抖动长期累积后,直接污染触觉感知的精度。
一轮优化下来,采样间隔从0.95~1.05 ms(±5%)压到0.99~1.01 ms(±1%),测量精度从±10% 提到 ±2~3%。下面把抖动源和对应手段拆开讲。
一、三个抖动源,先定位再优化
1. DMA 通道冲突。多通道同时工作时,优先级倒置或总线争用会让某个通道延迟,采样间隔出现±5~10%偏差。这是最常见的头号原因。
2. 定时器中断抢占。定时器周期 1ms、采样率 1kHz,若定时器中断执行超过100μs,就会直接阻塞采样。
3. ADC 转换完成中断延迟。ADC 转换本身只要 1~10μs,但中断嵌套配置不当时,完成中断会被推迟10~50μs——这一条最容易被忽略,因为它不报错,只是默默抖动。
二、对应手段
DMA 优先级:把 FSR 采样 DMA 通道设到最高(0~1),其他通道让位。这一项改动成本最低,收益最直接。
中断瘦身:定时器中断执行时间控制在50μs 以内,关键代码放 RAM 执行,避开 Flash 等待周期。
ADC 中断优先级:设为最高或次高,保证转换完成立刻触发 DMA。
通道切换的建立时间:模拟开关切换后信号需要1~5μs稳定,过早采样读到的是切换瞬态。做法是切换后延迟 12μs 再启动 ADC,或者多采 12 次丢弃前几个值。多通道系统里,这一条经常是"数据偶尔跳一下"的真凶。
三、缓冲区与触发方式
双缓冲更稳。单 ping-pong 在切换瞬间可能丢点;双 ping-pong 占用更多 RAM,但换来的是不丢点。32 通道、每缓冲 32 点,RAM 占用约2KB,一般 MCU 都能接受。
触发方式必须用定时器。定时器触发精度可达1μs,软件触发受代码执行时间影响,精度只有5~50μs。定时器触发 + DMA,是 1kHz 采样下唯一能同时保住精度和抖动的组合。
四、滤波:中值先削尖刺,均值再平滑
中值滤波3~5 点消除短期尖刺,均值滤波10~50 点平滑噪声,两者串联。顺序别反:先中值后均值,否则尖刺会被均值"摊"进整段数据,反而更难处理。
五、功耗与 CPU 的账
1kHz 采样下,ADC + DMA + 定时器总功耗约1~2mA;降到 100Hz,功耗可压到0.1~0.2mA。穿戴项目 100Hz 完全够用,没必要一直跑 1kHz。
CPU 时间分配大致是:DMA 采样 510%、信号处理 2030%、其他任务 50~70%。FSR 任务优先级给到最高,避免被低优先级任务阻塞——这是抖动之外,另一个容易被忽视的稳定性问题。
六、顺带两个精度项
- 温度补偿:查表 ±5%、分段线性插值 ±3%、神经网络回归 ±1~2%。穿戴和医疗项目建议至少上分段线性。
- 通道自检:每通道加空闲期周期性自检,短路、开路、漂移及时报警,别等数据明显错了才发现。
结论
抖动抑制的顺序应该是:先定位源(DMA 冲突 > 中断延迟 > 建立时间),再改配置,最后才是算法补。
把滤波当第一手段是本末倒置——采样间隔本身不稳,后面滤得再干净,数据也是歪的。