OpenEdv-开源电子网

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

stm32f103 adc dma tim为每个通道开辟好滤波空间,自动定时 dma循环采集 模拟看门狗

[复制链接]

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-6-27 18:52:03 | 显示全部楼层 |阅读模式
本帖最后由 nashui_sx 于 2021-1-28 11:06 编辑

0:stm32f103c8t6
1:#define ADC1_CHN      2                  //要使用的ADC通道数
     开启几个通道Adc1_Init()里面的ADC_RegularChannelConfig函数只能有多少个有效,比如例子是2,只能有 1 2有效
2:#define ADC1_Count  10                  //AD滤波采样次数         就是每个通道采集10次供平均来用
3:这个例子的dma的优点是直接为每个通道开辟要滤波的通道缓存,使用的时候直接调用ADC1_Filter就可以了,dma循环采集adc,任何时候都可以ADC_Filter,也可以使用adc之前ADC_Filter一次就可以了
4:加上滤波后实际采样周期=(arr+1)*(psc+1)/Tclk=5000*72/72000000s=5ms*ADC1_Count=50ms
      定时器采样时间不能快过adc的转换时间       转换时间=[采样时间+ 12.5个周期(固定值)]/12m =(239.5[实际根据自己设定值]+12.5)/12m=21us*ADC1_CHN=42us
      采样时间=1.5 7.5 13.5 28.5 41.5 55.5 71.5 239.5  ADC频率(不能超过14M) =72M/分频(=2 4 6 8)

     采样很慢,滤波长度过长,相当于每次都用之前的ADC1_Count次做平均,数据会有迟滞


adc dma tim为每个通道开辟好滤波空间.rar (322.37 KB, 下载次数: 810)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2017-8-23
在线时间
23 小时
发表于 2018-6-27 23:54:39 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2017-12-5
在线时间
29 小时
发表于 2018-6-30 17:25:41 | 显示全部楼层
usart1文件中void DMA_USART1_Init(void)以后的函数有用吗
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
 楼主| 发表于 2018-7-1 07:41:31 | 显示全部楼层
长路曼曼 发表于 2018-6-30 17:25
usart1文件中void DMA_USART1_Init(void)以后的函数有用吗

不开启dma后面的就USART1_printf USART1_Send_Array  还有中断函数有用
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-6-27
在线时间
12 小时
发表于 2019-7-6 14:56:11 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-7-6 20:38:59 | 显示全部楼层

刚更新了定时器触发的dma adc,你可以看看
固定采样频率的adc才有意义
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2018-11-30
在线时间
13 小时
发表于 2019-12-27 15:03:17 | 显示全部楼层
楼主试过转换速度吗?定时器在1ms还可以,高于1ms就不进入中断了
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2018-11-30
在线时间
13 小时
发表于 2019-12-27 15:26:28 | 显示全部楼层
TIM2_Init(99,7199);//TIM2_Init(9999,7199)1s,每秒钟测一次adc,并通过DMA 将数据传送到内部的RAM ,您可以直接在这个地方修改adc转换的频率,进而得到ADC的转换时间  1


100hz,就无法进入中断,楼主请试试
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-12-27 17:47:45 | 显示全部楼层
杨春胜 发表于 2019-12-27 15:26
TIM2_Init(99,7199);//TIM2_Init(9999,7199)1s,每秒钟测一次adc,并通过DMA 将数据传送到内部的RAM ,您可 ...

可以呀,你在检查下吧,不行上传你的工程
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2018-11-30
在线时间
13 小时
发表于 2019-12-28 10:03:59 | 显示全部楼层
TIM_OCInitStructure.TIM_Pulse =1000,这里要处理 成 TIM_OCInitStructure.TIM_Pulse = arr/2;问题就解决了,谢谢
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-12-28 10:11:20 | 显示全部楼层
杨春胜 发表于 2019-12-28 10:03
TIM_OCInitStructure.TIM_Pulse =1000,这里要处理 成 TIM_OCInitStructure.TIM_Pulse = arr/2;问题就解决 ...

我的代码本来就+1/2了呀
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2020-4-25
在线时间
1 小时
发表于 2020-5-17 15:29:32 | 显示全部楼层
感谢分享,下来看看
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-5-23
在线时间
5 小时
发表于 2020-9-26 20:14:56 | 显示全部楼层
谢谢分享,学习下
回复 支持 反对

使用道具 举报

0

主题

44

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1896
金钱
1896
注册时间
2019-12-4
在线时间
257 小时
发表于 2022-1-10 15:10:38 | 显示全部楼层
感谢啊
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-20 18:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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