跳到主要内容

连续采样与DMA

补充内容,配合主课阅读。

先让一帧数据正确,再考虑连续运行。数组能更新,不代表采样时间就是均匀的。

谁决定采样率​

定时器安排触发,ADC完成转换,DMA把结果搬进数组。ADC转换时间是“采样周期数加12.5,再除以ADC时钟”;两次触发的间隔才决定采样率。

先用已知直流电压检查ADC,再接麦克风。波形长期贴着0或4095,先处理偏置、量程或接线,别急着做FFT。

数组什么时候能读​

Normal模式填满后停止,适合一帧一帧验证。Circular模式会回到开头继续写,CPU不能无限期占着旧数据。

F103可将一个数组分成两半:半传输时处理前半,全传输时处理后半。DMA写哪一半,CPU就避开哪一半。C8T6没有能直接配置两个内存地址的硬件双缓冲,别照搬其他系列接口。

算一下处理期限​

8 kHz采样、每半块128点,处理一半的时间预算是16 ms。滤波、复制和发送加起来都得赶在覆盖之前结束,还应留余量。

用GPIO在处理开始置高、结束置低,示波器量最宽的脉冲。增加丢块计数,比“看起来一直在跑”更能说明问题。

FFT和滤波各检查什么​

FFT先核对实际采样率、点数和数据格式。256点、5 kHz的频点间隔是19.53125 Hz;换采样率后横轴也要换。

FIR、IIR分块计算时保留历史状态,别每块都重新初始化。IIR还要核对系数符号、排列和输出是否发散。先用已知信号验证,再接实时数据。

输出也有带宽​

8 kHz、16位单通道原始数据已有16000 byte/s,115200串口按8N1连二进制都装不下,文本更大。

MCP4725一次地址加两字节数据至少占27个IIC时钟。100 kHz仅传输就约270 μs,不能承诺8 kHz更新。采集、计算、显示或播放,每一段都要算时间。

这篇针对F103。换到带数据缓存的芯片,还要核对DMA能访问的内存和缓存一致性,不能只换芯片型号。