[STM32F1] STM32F103 ADC利用DMA进行采样问题求解

[复制链接]
2413|14
 楼主| cr315 发表于 2024-6-11 09:27 | 显示全部楼层 |阅读模式
ST, DMA, DM, ADC, AD
STM32F103配置了ADC1 的4个通道,利用定时器的事件触发进行10Hz 的数据采样,数据通过DMA传输。然后希望每次采样4*50个数据后触发DMA的中断进行数据的处理。

根据教程进行了相关的配置后,遇到了2个问题:

1 定时器配置成10hz,但是每次启动采集后基本马上就能进入DMA的回调函数,里面数据已经刷满了,所以感觉ADC的采样频率似乎不是收定时器触发的。

2DMA的回调函数HAL_ADC_ConvHalfCpltCallback,HAL_ADC_ConvCpltCallback,应该是数据完成一半数量的采集后触发第一个回调,全部采集后再触发第二个回调,但是实际上每次都是在第一个回调中数据就全部刷新了,采样完成的回调中不会有新的数据刷新。





希望有人能帮忙指点下,谢谢

laocuo1142 发表于 2024-6-11 16:10 | 显示全部楼层
检查时钟树配置是否有误
flycamelaaa 发表于 2024-6-11 19:00 | 显示全部楼层
尝试重新配置定时器、ADC和DMA,确保所有的设置都是正确的。
powerantone 发表于 2024-6-11 20:00 | 显示全部楼层
查看参考手册和教程
stormwind123 发表于 2024-6-11 22:00 | 显示全部楼层
如果ADC的转换时间过长,可能会导致采样频率低于预期。请检查ADC的时钟频率和采样时间设置。
公羊子丹 发表于 2025-3-19 08:03 | 显示全部楼层
看起来问题可能出在定时器触发和 ADC 配置上,你确认定时器触发的事件是否正确配置到 ADC 上了吗?ADC 是否配置为通过外部事件(定时器)触发?
周半梅 发表于 2025-3-19 08:04 | 显示全部楼层
你检查过 ADC 的采样时间 和 DMA 缓冲区大小 吗?如果 DMA 缓冲区太小,可能导致数据很快就被刷新,没等到定时器触发。
帛灿灿 发表于 2025-3-19 08:05 | 显示全部楼层
你在配置 DMA 时是否设置了 双缓冲模式?如果没有,DMA 的回调函数只会在第一个缓冲区满时触发,可能是这导致了你遇到的回调逻辑问题。
童雨竹 发表于 2025-3-19 08:06 | 显示全部楼层
你能确认一下 定时器的计数周期 是否和 DMA 的缓冲区大小 配合得当?定时器频率过高或缓冲区过小,可能导致不按照定时器频率采样。
万图 发表于 2025-3-19 08:07 | 显示全部楼层
看看 ADC 配置中的触发源,是否设置为 定时器事件,而不是默认的单次触发。你可以通过 CubeMX 配置 ADC1 的触发源为定时器事件。
Wordsworth 发表于 2025-3-19 08:08 | 显示全部楼层
DMA 回调 函数是不是在每次 DMA 缓冲区填满后都会调用?你可以检查是否 DMA 配置了 环形缓冲(circular mode),这样可以保证数据不断地采样并传输。
Bblythe 发表于 2025-3-19 08:09 | 显示全部楼层
在你的 HAL_ADC_ConvCpltCallback 和 HAL_ADC_ConvHalfCpltCallback 回调函数中,确认是不是存在数据覆盖的情况。你可以通过调试日志打印数据来确认问题。
Pulitzer 发表于 2025-3-19 08:10 | 显示全部楼层
你尝试过用 DMA 完成标志位 来判断 DMA 何时完成一次数据传输吗?这样可以避免每次都进入回调函数。
Uriah 发表于 2025-3-19 08:11 | 显示全部楼层
试试在回调中加入一些 数据验证逻辑,比如检查缓冲区的数据是否真的更新,可能是 DMA 缓冲区没有正确更新。
Clyde011 发表于 2025-3-19 08:12 | 显示全部楼层
如果配置没问题,试试将 DMA 的 优先级 设置为高一些,避免定时器触发频率过高时 DMA 操作被打断。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1466

主题

4964

帖子

0

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