打印
[AT32F437]

求助AT32F437的ADC周期采样策略

[复制链接]
73|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
天体书记|  楼主 | 2025-6-27 08:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们的ADC采样仅是温度采样 ,周期为1/3秒,所以,我现在是通过Timer计时软件计数触发的方式实现。现在的需求是在周期采样触发时,采样7次,再通过中值滤波的方式得到最终的温度值。
如果还使用软件计数触发的方式,我要再来一个Timer,感觉一个温度传感器使用2个Timer有点奢侈了。
我现在计划使用DMA的方式,开辟一个uint16_t temp_buf[7]的缓存空间。这样,当软件触发一次,让DMA自动完成7次采样。我的其余程序也就不用再修改了。这样的方案可行不?要怎么实现呢?
有大佬指点一下不?或分享一下技术经验?

使用特权

评论回复
沙发
muyichuan2012| | 2025-6-27 09:11 | 只看该作者
关于方案可行性 :
使用 DMA 的方式来实现 ADC 采样是个不错的方案。DMA 可以在后台自动完成数据传输,不需要 的 CPU频繁介入,这样可以减少资源占用,提高系统的效率,对于你目前的情况是比较合适的,而且也能避免使用两个 Timer 造成资源浪费的问题。

实现步骤
配置 ADC:

根据你的需求,选择合适的 ADC 通道,也就是连接温度传感器的那个通道。然后设置 ADC 的工作模式,比如采样时间、分辨率等参数。由于是对温度进行采样,一般温度传感器的输出信号相对比较稳定,可以选择适中的采样时间和分辨率,比如 12 位分辨率、采样时间可以根据具体芯片手册推荐的设置来定   。

配置 DMA :
开辟一个 uint16_t 类型的缓存空间 temp_buf[7],用于存储采样数据。在配置 DMA 时,要设置源地址为 ADC 的数据寄存器地址,目的地址为 temp_buf 缓存的起始地址。数据传输宽度根据 ADC 数据位宽设置为 16 位,传输数量为 7。同时,设置 DMA 的传输模式为单次传输(或者循环传输,如果是循环传输则需要注意在每次采样周期结束后及时处理数据,避免数据覆盖),并开启 DMA 中断,在以便数据传输完成后能得到通知。

设置软件触发:可以用一个 Timer 来实现软件触发 ADC 采样。将 Timer 的溢出时间设置为 1/3 秒,当 Timer 溢出时产生中断,在中断中通过软件触发 ADC 开始采样。或者也可以使用其他合适的触发源来完成 ADC 采样触发。

采样开始与数据处理 :在软件触发 ADC 采样后,DMA 就会自动将 ADC 采集到的 7 个数据依次存入 temp_buf 中。当 DMA 数据传输完成时,会产生中断,在中断处理函数中可以对 temp_buf 中的 7 个数据进行中值滤波处理,得到最终的温度值。

注意事项 :
DMA 优先级:确保 DMA 的优先级设置合理,不能低于 ADC 的优先级,以免影响数据的及时传输。
数据一致性 :在处理 temp_buf 中的数据时,要保证数据的一致性,避免在数据传输未完成时就开始处理数据。可以通过在 DMA 中断处理函数中设置一个标志位来指示数据是否已经准备好,程序主循环或者其他函数在检测到标志位有效后再对数据进行处理。
系统时钟与延时 :如果使用 Timer 作为软件触发源,要确保系统的时钟配置正确,Timer 的计数初值设置准确,以保证采样周期的准确性。

使用特权

评论回复
板凳
天体书记|  楼主 | 2025-6-27 10:24 | 只看该作者
谢谢版主的回复。
dma_init_struct.buffer_size = 7;


这里我设置成7,当我每次触发时,DMA就会帮我保存7个数据,之后才会触发完成中断吧?!

使用特权

评论回复
地板
天体书记|  楼主 | 2025-6-27 10:25 | 只看该作者
muyichuan2012 发表于 2025-6-27 09:11
关于方案可行性 :
使用 DMA 的方式来实现 ADC 采样是个不错的方案。DMA 可以在后台自动完成数据传输,不需 ...

谢谢版主的回复。
dma_init_struct.buffer_size = 7;

这里我设置成7,当我每次触发时,DMA就会帮我保存7个数据,之后才会触发完成中断吧?!

使用特权

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

本版积分规则

3

主题

23

帖子

0

粉丝