OpenEdv-开源电子网

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

分享:定时器触发ADC,DMA传输和定时中断+ADC+DMA

查看数: 62307 | 评论数: 132 | 收藏 37
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-8-25 21:28

正文摘要:

本帖最后由 1208 于 2019-8-6 17:55 编辑 弄了三个星期才将定时器触发ADC搞定, 之前在论坛都没找到这方面的知识 要么就是寄存器版本,看不太懂 要么就是只有部分程序,没有完整程序 不懂的人还挺多,特地过 ...

回复

wchlisa 发表于 2024-4-18 11:36:45
亲 我用咱的例程(定时器触发ADC,DMA传输实验),程序只能ad转换出一次数据是咋弄的呢?
qweewqqwe 发表于 2023-7-25 16:07:00
采样周期和定时器触发频率和采样点数应该如何确定?假如我要采样一个1Khz的输入信号,采集256个点做FFT将ADC时钟六分频,设置成12M,那采样周期和定时器触发频率怎么选择?
启林 发表于 2023-5-15 16:46:16
沉淀2010 发表于 2019-6-19 13:52
我也出现和你一样的现象,只能测试一次,再测必须要reset后才行。你解决了吗?

你好 我也遇到这个问题 请问您解决了吗
qidian 发表于 2021-10-25 15:53:02
谢谢,正需要,学习学习
天地宽9 发表于 2021-10-22 20:38:24
谢谢分享
Ubrj 发表于 2021-7-24 23:08:44
为啥在屏幕上显示ad值不好使呀,在while的 for循环里面,我把串口的程序去掉了,换成屏幕显示ad值,只能开机测一次,连续撤就不好使,这是为什么呀?
天海戈林 发表于 2021-7-2 17:16:52
其实用CUBE配置相对简单,如果用标准库就得去查看调用那个库函数,每一个参数怎么配置,相对麻烦。但是现在我也被迫用标准库,借鉴了你的功能,省了不少事,十分感谢。
bbtclj 发表于 2021-6-2 15:48:18
真是好资料,谢谢分享
仰望星空Y 发表于 2021-4-25 08:50:51
666,刚好在学,看看,谢谢
yangzhen1001 发表于 2021-4-7 15:20:46
资料很好,来学习下
车嘉炜 发表于 2020-12-21 21:14:42
您好,在您的程序里初始化定时器的时候,中断函数里面有这样的一句ADC1->CR2|=1<<1,请问这句的意思是什么,我看注释是启动连续转换,如果是的话该怎么理解呢?
opensourcetools 发表于 2020-10-20 23:27:05
先拜再下!
hiiam 发表于 2020-10-12 08:24:39
你好,我发现那个程序DMA中断只能进一次,Flag标志位从1改变为0之后就没用了,不能实现循环检测。不知道是不是我理解错误
13484539127 发表于 2020-10-9 19:03:18
谢谢分享
13484539127 发表于 2020-10-9 18:57:50
膜拜大佬
yatou0710 发表于 2020-9-9 15:31:06
非常感谢,,非常实用。。。。。
yatou0710 发表于 2020-9-9 15:27:53
段前进 发表于 2018-11-15 14:15
还是非常感谢,今天我的 ADC +DMA 5通道终于搞定

5通道的,,,最后数组里面是值是按通道五个五个划分的吗
yatou0710 发表于 2020-9-9 15:07:35
老倪Kszyp 发表于 2018-9-1 16:00
请教一下楼主,您分享的文件中,我要触发AD采样,把TIM的GPIO配置去掉行不行

你好,请问去掉可以吗
BDH 发表于 2020-9-2 09:42:08
谢谢大佬无私的分享
BDH 发表于 2020-9-2 08:51:10
多谢大佬的无私分享
sf116 发表于 2020-8-31 22:49:26
这这这不合适吧 发表于 2020-8-4 14:38
请问我是不是可以这样理解,使用定时器触发adc模式,当初始化都执行之后,这就是纯硬件的过程,也就是数这 ...

是的
这这这不合适吧 发表于 2020-8-4 14:38:47
请问我是不是可以这样理解,使用定时器触发adc模式,当初始化都执行之后,这就是纯硬件的过程,也就是数这个并不叫中断,cpu也不会在这处理,他就是硬件的定时器触发,adc采样,dma传输循环下去。即cpu在处理其他语句是不受adc影响的,不会被打断。
LYANG 发表于 2020-7-10 16:46:47
为什么下载之后打开是乱码啊
jinniuxing 发表于 2020-6-12 10:39:55
谢谢分享!
szy363309144 发表于 2020-4-16 15:09:32
为什么不能下载
刺花与航 发表于 2020-4-13 19:29:49
楼主,使用定时器是为了让ADC数据更新的更慢一些嘛?,感觉ADC+DMA然后用   连续转换模式,ADC不就一直在转换数据,然后DMA一直传输数据了不是?
随缘轻舞 发表于 2020-4-10 12:17:39
下载留名,正在学习这方面,及时雨,感谢!
Wujinquan 发表于 2020-4-6 18:09:27
博主和各位大佬,问个小白问题,为什么只进一次DMA中断。
cony17 发表于 2020-3-20 20:03:31
请问一下官方修改版本和定时器中断触发有什么区别吗
1208 发表于 2020-3-11 15:30:36
淘淘追梦 发表于 2019-10-15 15:09
楼主你好,现在你的pwm+adc+dma是连着的,不需要CPU参与。请问如果我想pwm+adc触发不变,dma传输是可以随意 ...

可以,程序设置好就行
1208 发表于 2020-3-11 15:29:10
wasd123 发表于 2020-3-9 16:47
楼主,三个压缩包用的实现方案都不同吗

是的,用方式不同
wasd123 发表于 2020-3-9 16:47:28
楼主,三个压缩包用的实现方案都不同吗
淘淘追梦 发表于 2019-10-15 15:09:24
楼主你好,现在你的pwm+adc+dma是连着的,不需要CPU参与。请问如果我想pwm+adc触发不变,dma传输是可以随意开断的吗
shaowen567 发表于 2019-9-25 09:33:43

我也碰到串口只打印一次数据的情况,之后就没反应了,请问解决了吗
dyy哟 发表于 2019-9-5 14:43:35
yanjuan 发表于 2019-8-2 15:59
大神,这个程序怎么改成双通道呀,就是你这个思路,怎么改的?小白,不懂,很着急

了解下同步规则ADC,是由ADC1和ADC2共同实现的
1208 发表于 2019-9-3 18:24:23
yanjuan 发表于 2019-9-3 17:10
楼主,想请教您一下,这个用双通道的话,应该怎么来写?能指点一下嘛?刚接触这块

可以用双重(多通道)ADC同步规则:http://www.openedv.com/forum.php ... d=282189&extra=
yanjuan 发表于 2019-9-3 17:10:45
楼主,想请教您一下,这个用双通道的话,应该怎么来写?能指点一下嘛?刚接触这块
Jeff1996 发表于 2019-8-27 08:40:35
眼眼眼眼眼眼眼
1208 发表于 2019-8-22 09:51:45
poffy 发表于 2019-8-21 10:56
在哪里加while循环

主函数里面
poffy 发表于 2019-8-21 10:56:52
1208 发表于 2019-7-16 16:11
是的,你加个while循环就行

在哪里加while循环
poffy 发表于 2019-8-21 10:35:08
菜鸡请教,我想问一下不应该每隔500ms一个数据吗,为什么只有32个数据
sqk 发表于 2019-8-9 13:30:56
这个是把pwm的频率作为adc的采样频率了吗
sqk 发表于 2019-8-9 13:13:56
本帖最后由 sqk 于 2019-8-9 13:20 编辑

刚学stm32想问这个程序里key0按键有用到吗
1208 发表于 2019-8-6 18:33:43
zifeiyu0921 发表于 2019-8-2 14:43
定时器工作在PWM输出模式,没有设置占空比是怎么产生的上升沿触发ADC采样的?

有设置定时器上升沿触发的,你看下定时器里面的
//        TIM_TimeBaseStructure.TIM_Period = 1000;//50000;  
//        TIM_TimeBaseStructure.TIM_Prescaler = (720-1);  
//        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
//        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
//        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

//        TIM_DMAConfig(TIM1, TIM_DMABase_CCR1, TIM_DMABurstLength_2Bytes );
//        TIM_DMACmd(TIM1, TIM_DMA_Update, ENABLE);

//        TIM_Cmd(TIM1, ENABLE);  
//        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
//         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
//        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
//        TIM_OCInitStructure.TIM_Pulse = 500; //设置待装入捕获比较寄存器的脉冲值,高于脉冲值就会产生高电平
//        TIM_OC2Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2 OC2
1208 发表于 2019-8-6 17:57:53
zifeiyu0921 发表于 2019-8-2 15:36
楼主,三个程序我都试了,没一个能正确输出的呀,就那个官方修改版可以出数字,收到一些数字0之后就是2000 ...

你用的是板子,引脚对应不
1208 发表于 2019-8-6 17:57:19
zifeiyu0921 发表于 2019-8-2 18:46
楼主,刚刚又试了最后代码,得到了正确的数据,但是在void TIM2_PWM_Init(u16 arr,u16 psc)函数中,有这样 ...

一种是TIM2 CH2对应PA1,一种是TIM1_CH1对应PA8
程序写了两种触发模式,任选一种都可以,你看下我定时器注释掉的

1208 发表于 2019-8-6 17:44:28
zifeiyu0921 发表于 2019-8-6 10:59
楼主,你这个程序为什么只测量一遍啊,在while循环里面不是应该一直测量嘛?

这个在别的函数里面有用if来判断每次接收的数据,你可以将它去掉,再改下就可以一直测量
zifeiyu0921 发表于 2019-8-6 10:59:24
楼主,你这个程序为什么只测量一遍啊,在while循环里面不是应该一直测量嘛?
zifeiyu0921 发表于 2019-8-2 18:46:30
楼主,刚刚又试了最后代码,得到了正确的数据,但是在void TIM2_PWM_Init(u16 arr,u16 psc)函数中,有这样一行代码RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB2Periph_GPIOA, ENABLE);        //使能定时器1时钟  但是查阅数据手册可知,GPIOA是挂在APB2下的,不知道为什么你这样使能没有报错并且程序还得到了正确的结果
yanjuan 发表于 2019-8-2 15:59:32
dyy哟 发表于 2019-3-4 14:13
其实我之前试过这个思路,运行之后也没问题,只是心里感觉不太靠谱。因为没多少人做过,而且大多数人都用 ...

大神,这个程序怎么改成双通道呀,就是你这个思路,怎么改的?小白,不懂,很着急



关闭

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

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

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

GMT+8, 2026-8-17 07:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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