STM32 使用 DAC 输出任意波形时,如何用 DMA 双缓冲消除波形拼接毛刺?

· 2 浏览

回答(4)

用定时器触发DAC时,将定时器更新事件和DMA请求同步,并设置DMA为FIFO模式(阈值半满),可进一步减少总线冲突。
代码狂人 · 2026-08-27
如果毛刺来自DAC输出阻抗,可在输出端加RC低通滤波(截止频率略高于最高波形频率),硬件上也能平滑拼接点。
电路小能手 · 2026-08-27
双缓冲切换时,务必在DMA中断里先关中断再改缓冲区,防止半传输和完成中断竞争导致数据错位。
嵌入式老周 · 2026-08-27
要消除STM32 DAC输出任意波形时的拼接毛刺,核心是让DMA在后台无缝切换缓冲区,避免CPU干预造成的时间间隙。具体做法:1)配置DMA为循环模式,并启用双缓冲(DMA_SxM0AR和DMA_SxM1AR分别指向两个波形表),通过DMA中断(半传输和传输完成)交替填充空闲缓冲区;2)在中断服务函数中,只更新当前未使用的缓冲区数据,不触碰DMA正在读取的缓冲区,确保数据一致性;3)将DAC触发源设为定时器(如TIM6),用定时器更新事件触发DAC转换,保证输出节奏稳定;4)关键优化:在填充新波形时,确保首尾采样点连续(如正弦波从0相位开始),避免跳变;5)若波形频率变化,需同步调整定时器分频和重装值,并注意DMA传输宽度与DAC数据寄存器对齐(12位右对齐)。实操建议:先用逻辑分析仪观察毛刺位置,确认是缓冲区切换间隙还是触发抖动,再针对性调整DMA优先级和中断抢占设置。
mcuku 阿沐 · 2026-08-27