[STM32F4] 如何使用硬件定时器触发一定数量的 ADC 转换?

[复制链接]
1665|13
 楼主| 铁头电子player 发表于 2025-5-27 22:50 | 显示全部楼层 |阅读模式
使用 HAL 对 STM32F407进行开发。
  • 我将 TIM2设置为 CH1 和 CH2上的 PWM,周期为 200us,CH1 的占空比为 25%,CH2的占空比约为 30%。
  • 我将 ADC1配置为1.8 Msps。
  • 我想要的是,在 PWM CH2的上升沿上、以便 ADC 触发、DMA 读取50个采样数据。然后让 ADC/DMA 等待到 PWM CH2的下一个上升沿触发 ADC/DMA 另外 50 个数据。
也就是每次 PWM CH2上升时填充大小为50的 ADC 缓冲器。现在,已经用中断和轮询实现了这个功能,但我想使用ADC的DMA实现。
我目前的问题是:一旦 PWM CH2 的第一个上升沿后立即激活 ADC,它就会一直跑下去,转换信号,DMA 更新缓冲区。我希望是 PWM 不断触发 ADC 或 DMA,而不是只触发 ADC 一次,然后***运行。

公羊子丹 发表于 2025-5-28 07:27 | 显示全部楼层
看你描述像是 ADC 设置成了连续转换模式?试试看把 continuous mode 关掉,只启用 external trigger。
周半梅 发表于 2025-5-28 07:28 | 显示全部楼层
要让 TIM2_CH2 每次触发 ADC 启动 DMA 的话,ADC 外部触发得设成 "rising edge",触发源选 TIM2_CH2。
帛灿灿 发表于 2025-5-28 07:29 | 显示全部楼层
DMA 记得要用 normal 模式不是 circular,不然它会自动重启填满你 buffer。
童雨竹 发表于 2025-5-28 07:30 | 显示全部楼层
你是不是在 HAL_ADC_Start_DMA() 之后没等 ADC 触发源?它可能一上来就跑了。
万图 发表于 2025-5-28 07:31 | 显示全部楼层
也可以考虑用双缓冲 DMA,用 DMA 完成中断来切换 buffer,实现连续采样但每段固定长度。
Wordsworth 发表于 2025-5-28 07:31 | 显示全部楼层
我以前也遇到 ADC 跑飞的情况,是触发源配错,结果一通跑。你用的是 TIM2_CH2 而不是 update event 吧?
Bblythe 发表于 2025-5-28 07:32 | 显示全部楼层
可以考虑 TIM2 CH2 专门给 ADC 触发,TIM2 CH1 继续做 PWM 控制,这样逻辑清晰一点。
Pulitzer 发表于 2025-5-28 07:33 | 显示全部楼层
HAL 的 ADC/DMA 有点黑盒,建议你调试时打开 ADC 的 EOC、EOS、JEOC 等标志,看是不是一直在触发。
Uriah 发表于 2025-5-28 07:34 | 显示全部楼层
也可以配合 DMA half-transfer interrupt,看每 25 个采样就处理一次,响应更快一点。
Clyde011 发表于 2025-5-28 07:35 | 显示全部楼层
别忘了 DMA 每次完成后需要重新开启 HAL_ADC_Start_DMA,STM32F4 的 DMA 不会自己“自动重装”。
香水城 发表于 2025-5-28 09:13 | 显示全部楼层
这个应该是可以实现的。TIMER触发一次,ADC转换一次。DMA配置在Normal模式,数据长度为50.

另外,转换完50个数据后,在DMA完成中断里快速做好下次接收的准备。
2565268366311a20c2.png
t60yz 发表于 2025-5-31 23:40 | 显示全部楼层
STM32 ADC+DMA 默认工作模式是连续转换+循环DMA传输,只要第一次启动了转换,ADC 会一直采样,DMA 会不断更新缓冲区。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

50

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部