OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3720|回复: 6

关于定时器中断触发ADC的问题

[复制链接]

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
发表于 2021-1-19 12:05:09 | 显示全部楼层 |阅读模式
1金钱
最近在学习论坛上的一个大佬写的定时器中断触发ADC的例程,看完有些问题想要请教大家一下,程序附在下面。
我的问题是:
一:这个程序定义了内存数组是32个元素,DMA设定为将ADC采集到的数据传给内存数组。我理解的这个例程是当定时器溢出,定时器中断触发开启ADC连续转换,每采集一个数据就通过DMA传给内存,直到传输了32个数据以后(程序中设定的DMA的缓存个数是32个),设定DMA传输完成中断,中断服务函数中判断DMA是否传输完成,在DMA的中断服务函数中关闭ADC连续转换。然后等待下一次的定时器中断的到来。请问我对程序的理解是否有误?如果没有那么这个ADC的采样频率该如何计算呢?按照这种思路来讲采样好像并不是连续进行的。

二:请问能否做到定时器一溢出就采样一个数据,然后下次溢出再采样一个数据,这样的话就能做到ADC的采样周期就是定时器的溢出时间了。那么我把源程序里面的哪些部分做修改就可以达到这样的目的?



战舰: 定时器中断触发ADC,DMA传输实验.zip (4.29 MB, 下载次数: 7)

最佳答案

查看完整内容[请看2#楼]

定时器触发adc采集dma保存:是定时器设置事件发生直接内部触发adc采样 采样结束触发dma读取保存 这种思路就是为了固定采样频率好做fft之类的分析的,采样频率假如不滤波就是定时器设置的触发周期 http://www.openedv.com/forum.php ... =1&extra=#pid850752 http://www.openedv.com/forum.php?mod=viewthread&tid=282696&extra=
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2021-1-19 12:05:10 | 显示全部楼层
本帖最后由 nashui_sx 于 2021-1-19 18:37 编辑

定时器触发adc采集dma保存:是定时器设置事件发生直接内部触发adc采样 采样结束触发dma读取保存
这种思路就是为了固定采样频率好做fft之类的分析的,采样频率假如不滤波就是定时器设置的触发周期

http://www.openedv.com/forum.php ... =1&extra=#pid850752

http://www.openedv.com/forum.php?mod=viewthread&tid=282696&extra=

回复

使用道具 举报

5

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
金钱
272
注册时间
2019-9-16
在线时间
67 小时
发表于 2021-1-19 14:27:09 | 显示全部楼层
ADC设置为连续采就好,设好采集频率,采完一次DMA自动把数据赋给你设置的地址。然后定时器中断里面取一次该值就可以了,唯一要注意的是定时器触发中断的时间要大于ADC采样时间。

采样时间这些看官方手册,都有详细的介绍,举个例子ADC_SampleTime_239_5Cycles -> 14MHz/239.5 约等于 17us。如果我每记错的话.....(所以还是建议看手册
回复

使用道具 举报

2

主题

458

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4459
金钱
4459
注册时间
2018-5-14
在线时间
956 小时
发表于 2021-1-19 17:00:48 | 显示全部楼层
将ADC的触发方式改成定时器的TRGO事件。然后定时器的主从寄存器里配置发生TRGO事件。然后就可以不用中断函数,硬件自动在定时器溢出时触发ADC
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
 楼主| 发表于 2021-1-19 22:28:58 | 显示全部楼层
姚先起 发表于 2021-1-19 17:00
将ADC的触发方式改成定时器的TRGO事件。然后定时器的主从寄存器里配置发生TRGO事件。然后就可以不用中断函 ...

您好,感谢您的回复,我根据您的回复去找了一下库函数版本的配置TRGO信号的函数void TIM_SelectOutputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_TRGOSource)
如果我想用 TIM3的TRGO信号触发ADC,那么请问 我以下的函数的参数中应该选择哪一个?
#define IS_TIM_TRGO_SOURCE(SOURCE) (((SOURCE) == TIM_TRGOSource_Reset) || \
                                    ((SOURCE) == TIM_TRGOSource_Enable) || \
                                    ((SOURCE) == TIM_TRGOSource_Update) || \
                                    ((SOURCE) == TIM_TRGOSource_OC1) || \
                                    ((SOURCE) == TIM_TRGOSource_OC1Ref) || \
                                    ((SOURCE) == TIM_TRGOSource_OC2Ref) || \
                                    ((SOURCE) == TIM_TRGOSource_OC3Ref) || \
                                    ((SOURCE) == TIM_TRGOSource_OC4Ref))
/**
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
 楼主| 发表于 2021-1-19 22:32:12 | 显示全部楼层
nashui_sx 发表于 2021-1-19 18:33
定时器触发adc采集dma保存:是定时器设置事件发生直接内部触发adc采样 采样结束触发dma读取保存
这种思路 ...

感谢您的回复!
回复

使用道具 举报

85

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
674
金钱
674
注册时间
2020-12-5
在线时间
202 小时
 楼主| 发表于 2021-1-19 22:35:09 | 显示全部楼层
lgouds 发表于 2021-1-19 14:27
ADC设置为连续采就好,设好采集频率,采完一次DMA自动把数据赋给你设置的地址。然后定时器中断里面取一次该 ...

您好,感谢您的回复。我想实现的是定时器溢出一次采集一个数据,这样的话定时器的周期就是我ADC的采集周期了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-15 01:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表