打印
[STM32F4]

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

[复制链接]
68|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
使用 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。

使用特权

评论回复
5
童雨竹| | 2025-5-28 07:30 | 只看该作者
你是不是在 HAL_ADC_Start_DMA() 之后没等 ADC 触发源?它可能一上来就跑了。

使用特权

评论回复
6
万图| | 2025-5-28 07:31 | 只看该作者
也可以考虑用双缓冲 DMA,用 DMA 完成中断来切换 buffer,实现连续采样但每段固定长度。

使用特权

评论回复
7
Wordsworth| | 2025-5-28 07:31 | 只看该作者
我以前也遇到 ADC 跑飞的情况,是触发源配错,结果一通跑。你用的是 TIM2_CH2 而不是 update event 吧?

使用特权

评论回复
8
Bblythe| | 2025-5-28 07:32 | 只看该作者
可以考虑 TIM2 CH2 专门给 ADC 触发,TIM2 CH1 继续做 PWM 控制,这样逻辑清晰一点。

使用特权

评论回复
9
Pulitzer| | 2025-5-28 07:33 | 只看该作者
HAL 的 ADC/DMA 有点黑盒,建议你调试时打开 ADC 的 EOC、EOS、JEOC 等标志,看是不是一直在触发。

使用特权

评论回复
10
Uriah| | 2025-5-28 07:34 | 只看该作者
也可以配合 DMA half-transfer interrupt,看每 25 个采样就处理一次,响应更快一点。

使用特权

评论回复
11
Clyde011| | 2025-5-28 07:35 | 只看该作者
别忘了 DMA 每次完成后需要重新开启 HAL_ADC_Start_DMA,STM32F4 的 DMA 不会自己“自动重装”。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

13

帖子

0

粉丝