OpenEdv-开源电子网

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

DMA+ADC1四路输出,亲测可用,整个的测量一次的时间大约是1.2ms

[复制链接]

13

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
431
金钱
431
注册时间
2017-9-24
在线时间
81 小时
发表于 2019-7-11 14:17:07 | 显示全部楼层 |阅读模式
这个是我再做实验的时候通过将原子哥的程序进行移植和修改,然后测试可以使用的程序,希望能够帮到有需要的坛友。

DMA+ADC四路输出.rar

2.97 MB, 下载次数: 99

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
431
金钱
431
注册时间
2017-9-24
在线时间
81 小时
 楼主| 发表于 2019-7-11 14:21:29 | 显示全部楼层
使用的开发板是战舰V3,需要在液晶显示屏上才能够看到实际的测量的电压值。
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-7-11 21:30:50 | 显示全部楼层
不用定时器触发的adc用dma就是耍流氓
回复 支持 反对

使用道具 举报

13

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
431
金钱
431
注册时间
2017-9-24
在线时间
81 小时
 楼主| 发表于 2019-7-12 08:26:01 | 显示全部楼层
nashui_sx 发表于 2019-7-11 21:30
不用定时器触发的adc用dma就是耍流氓

是不是使用定时器定时的通过DMA来传输数据?
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-7-12 09:48:46 | 显示全部楼层
gongzq666 发表于 2019-7-12 08:26
是不是使用定时器定时的通过DMA来传输数据?

定时器触发adc采样然后dma读取,这样能固定采样频率

你要是不固定采样频率,dma读取意义我觉得不大,毕竟只能看adc变化 adc变化率都没法定
回复 支持 反对

使用道具 举报

4

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2017-11-16
在线时间
159 小时
发表于 2019-7-12 10:20:52 | 显示全部楼层
nashui_sx 发表于 2019-7-12 09:48
定时器触发adc采样然后dma读取,这样能固定采样频率

你要是不固定采样频率,dma读取意义我觉得不大, ...

//获取ADC值
u16 Get_ADC(u8 times)
{  
         u8 i=0;
         u16 temp=0;
         u16 avg=0;
         for(i=0;i<times;i++){
                        ADC_SoftwareStartConvCmd(ADC1,ENABLE); //软件启动ADC
                        ADC_DMACmd(ADC1,ENABLE);//开始ADC_DMA传输         
                         if(DMA_GetFlagStatus(DMA1_FLAG_TC1)!=RESET)//等待通道1传输完成
                         {
                                        delay_ms(10);       
                                        temp+=ADC_ConvertedValue;
                         }
                                DMA_ClearFlag(DMA1_FLAG_TC1);//清除通道1传输完成标志
         }
         avg=temp/times;
         return (float)avg*(3.3/4096);
}
请问这样使用可以吗,ADC为单通道单次转换。这个函数在主函数循环里面被调用
回复 支持 反对

使用道具 举报

13

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
431
金钱
431
注册时间
2017-9-24
在线时间
81 小时
 楼主| 发表于 2019-7-12 10:22:26 | 显示全部楼层
nashui_sx 发表于 2019-7-12 09:48
定时器触发adc采样然后dma读取,这样能固定采样频率

你要是不固定采样频率,dma读取意义我觉得不大, ...

好的 ,谢谢你的建议,我再深入的研究研究!
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-7-12 10:53:45 | 显示全部楼层
本帖最后由 nashui_sx 于 2019-7-12 11:06 编辑
vegetablebird 发表于 2019-7-12 10:20
//获取ADC值
u16 Get_ADC(u8 times)
{  

1.你只用值的话可以,但是正常的话用值是不是太简单了,比如温度你转成ad值采样,你难道温度超过一个设定阈值就报警触发别的,不会的对吧。还是要结合温度上升速率,那就需要固定采样周期
在比如你采集波形ad值分析,你不固定采样频率也没法做fft变换
你这种能用,只是就是能看个ad值的场合用,实际有些场合没啥用

2.你要是只是用个值,你也没必要一直开关adc,反正dma不占cpu,你直接一直开着就行了,想用直接去读那个变量就好了

3.你adc采样每此延时10ms,平滑50次 500毫秒,不觉得时间太久吗,还有啥意义用dma,dma就是为了解放cpu干别的事,你竟然延时了500ms
正常应该定时器触发+完成中断,不定时器触发也应该用dma完成中断给main一个信号进行滤波就好了

http://www.openedv.com/forum.php?mod=viewthread&tid=273877&extra=
你看下这个里面的两个例子 一个是定时器触发的,一个是不带的,怎么不延时采样的
回复 支持 反对

使用道具 举报

13

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
431
金钱
431
注册时间
2017-9-24
在线时间
81 小时
 楼主| 发表于 2019-7-12 11:27:48 | 显示全部楼层
nashui_sx 发表于 2019-7-12 09:48
定时器触发adc采样然后dma读取,这样能固定采样频率

你要是不固定采样频率,dma读取意义我觉得不大, ...

我刚刚查看了一下,是不是通过定时器的PWM产生固定周期的方波,adc使用的是外部外部触发方式,然后定时的作用就是体现再PWM的周期上面,DMA可以直接开启,不用去管。然后就能够实现adc通过固定的时间进行采样并将数据通过DMA送入RAM。
回复 支持 反对

使用道具 举报

4

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2017-11-16
在线时间
159 小时
发表于 2019-7-12 11:46:30 | 显示全部楼层
nashui_sx 发表于 2019-7-12 10:53
1.你只用值的话可以,但是正常的话用值是不是太简单了,比如温度你转成ad值采样,你难道温度超过一个设定 ...

因为在循环里面有满足一个条件才使用这个函数,所以我用了单次转换,只需要获取ADC的值就可以。这样的话直接设置连续转换也可以吗?
延时这个确实是我不小心加进去的
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-7-12 14:19:12 | 显示全部楼层
gongzq666 发表于 2019-7-12 11:27
我刚刚查看了一下,是不是通过定时器的PWM产生固定周期的方波,adc使用的是外部外部触发方式,然后定时的 ...

是的,定时器的好几种时间都能控制adc的启动,dma直接存起来,存满了会进完成中断,主函数滤波就好了,3个通道你可以设置30缓存的dma  正好一个通道10个数据 滤波就好了
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-7-12 14:20:32 | 显示全部楼层
vegetablebird 发表于 2019-7-12 11:46
因为在循环里面有满足一个条件才使用这个函数,所以我用了单次转换,只需要获取ADC的值就可以。这样的话 ...

对,单次就行了,转换完自动关了,下次打开转换就好了
回复 支持 反对

使用道具 举报

13

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
431
金钱
431
注册时间
2017-9-24
在线时间
81 小时
 楼主| 发表于 2019-7-12 17:17:23 | 显示全部楼层
nashui_sx 发表于 2019-7-12 14:20
对,单次就行了,转换完自动关了,下次打开转换就好了

好的 ,谢谢您的建议。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 11:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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