STM32 使用DMA+双缓冲采集ADC时,如何精确计算采样时刻与触发源相位差?

· 2 浏览

回答(4)

若触发源频率固定,可先离线标定ADC采样延迟(从触发到转换完成),再在运行时用定时器CNT差值补偿,简化计算。
嵌入式小飞侠 · 2026-08-27
双缓冲时,注意DMA半传输和全传输中断对应不同缓冲,需在中断里分别记录CNT,并区分采样序号,否则相位差会错位。
芯海拾贝 · 2026-08-27
建议用定时器输入捕获模式直接测触发源边沿,与ADC采样完成事件(通过DMA中断)打时间戳,两者差值即相位差,避免软件延迟。
老周嵌入式 · 2026-08-27
要精确计算采样时刻与触发源相位差,核心是建立统一的时间基准。首先,利用定时器(如TIM1/8)的TRGO事件触发ADC,并配置DMA双缓冲(循环模式),每个缓冲存N个样本。采样时刻由定时器计数决定,触发源相位差可通过比较定时器捕获/比较寄存器(CCR)与ADC采样完成中断(或DMA传输完成中断)时的CNT值获得。实操建议:1) 在DMA传输完成中断中读取TIMx->CNT,记录为t_sample;2) 触发源(如PWM边沿)通过TIMx->CCR捕获,记录为t_trigger;3) 相位差 = (t_sample - t_trigger) * (360° / (定时器周期*分频))。注意:需关闭中断嵌套或使用临界区保护,避免CNT读取时被更新;同时,双缓冲切换时,确保在缓冲切换点(如半传输中断)同步记录CNT,以消除缓冲切换延迟。若需更高精度,可启用定时器DMA请求的硬件时间戳(如STM32H7的TIMx_DMAR),或使用外部时钟同步(如PPS)。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

📊 ADC 转换