OpenEdv-开源电子网

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

关于ADC+DMA中断的问题,想请教一下各位。

[复制链接]

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-9-7
在线时间
30 小时
发表于 2019-3-14 19:36:32 | 显示全部楼层 |阅读模式
本帖最后由 BUGMAN 于 2019-3-14 19:42 编辑

时序图

时序图

ICG为25HZ的PWM信号,下降沿触发产生信号A,信号A为500K的PWM脉冲,脉冲持续3700个后,变为低电平。

想要这样的脉冲是想要用来触发AD转换,然后后面多出来的时间用来USB传输数据到上位机。
目前我设想的方案是,ICG信号(TIM3产生)通过主从模式让其下降沿使能启动A信号(TIM4产生),A信号上升沿触发启动AD转换,AD转换再触发DMA将数据转移到前面设好的数组里,采集3700个数据后进入中断,关闭TIM4同时USB_USART_SendData()函数传输数据。在SH下一个下降沿到来前完成中断,SH下一个下降沿到来时又会使能TIM4。

目前的问题就是不知道如何在采集3700个数字后进入中断。
之前我以为将DMA设置里的DMA_BufferSize设为3700,在将DMA设为循环模式,AD转换一次传一个数据,传3700个数据之后就能进入传输完成中断了。结果发现并不是我预料的那样。


DMA与ADC设置代码

DMA与ADC设置代码






求各位指点一下,真的感谢!

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

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-9-7
在线时间
30 小时
 楼主| 发表于 2019-3-15 11:16:06 | 显示全部楼层
我觉得,我现在遇到的问题和这位兄弟的是一样的,有人能详细解答一下吗,感谢!
www.openedv.com/forum.php?mod=vi ... =DMA%2B%D6%D0%B6%CF
回复 支持 1 反对 0

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-9-7
在线时间
30 小时
 楼主| 发表于 2019-3-16 11:15:40 | 显示全部楼层
本帖最后由 BUGMAN 于 2019-3-16 11:17 编辑
nashui_sx 发表于 2019-3-15 22:52
降低主频正好使adc是500k估计会影响你的usb
所以你的思路应该最适合你,
或者这个500k能变通,不过是采 ...

终于搞出来啦,我的思路是可以的,发现问题出在PWM波触发ADC的那步,我一开始设置PWM波的占空比为50%,我以为是上升沿触发AD转换,后来发现当PWM波处于高电平的时候,AD转换就一直在进行,因此DMA也一直在工作,当DMA累计搬了3700个数后,就进入中断了,因此AD转换并没有按500K的频率进行。
我的设置方法是将PWM波的占空比调的足够小,保证一次PWM波周期只能进行一次AD转换,这样也就只能进行一次DMA转换,因此3700个脉冲波后就会进入中断。
再次感谢老哥帮忙!

PWM占空比

PWM占空比

PWM尾

PWM尾

PWM头

PWM头
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-3-14 20:13:07 | 显示全部楼层
本帖最后由 nashui_sx 于 2019-3-14 20:14 编辑

假如25hz的信号是外部的  500k采样周期用 ADC_SampleTime 和ADC_TwoSamplingDelay 保证采样周期    应该SH下降沿的时候进外部中断  启动adc dma   dma数据量3700  dma中断证明采集完成给信号usb发送

假如25hz是自己设定的    500k采样周期用 ADC_SampleTime 和ADC_TwoSamplingDelay 保证采样周期   启动adc dma 定时器触发模式  dma数据量3700  采样频率定时器触发模式设定25hz  dma中断证明采集完成给信号usb发送

应该是这样的

回复 支持 反对

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4105
金钱
4105
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-14 21:16:22 | 显示全部楼层
如果说你不是想获取PWM的平均值, 就不应该用ADC。
用TIM的PWM input mode就可以了
回复 支持 反对

使用道具 举报

头像被屏蔽

0

主题

207

帖子

0

精华

禁止发言

积分
276
金钱
276
注册时间
2019-3-4
在线时间
4 小时
发表于 2019-3-15 08:15:16 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-9-7
在线时间
30 小时
 楼主| 发表于 2019-3-15 10:15:47 | 显示全部楼层
nashui_sx 发表于 2019-3-14 20:13
假如25hz的信号是外部的  500k采样周期用 ADC_SampleTime 和ADC_TwoSamplingDelay 保证采样周期    应该SH ...

我这个25HZ信号是由STM32F103内部的TIM3产生的,F1里有这两个函数吗?
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-3-15 10:36:56 | 显示全部楼层
本帖最后由 nashui_sx 于 2019-3-15 10:38 编辑
BUGMAN 发表于 2019-3-15 10:15
我这个25HZ信号是由STM32F103内部的TIM3产生的,F1里有这两个函数吗?

这是两个宏的前一半名字
103没有ADC_TwoSamplingDelay...
103的ADC_SampleTime 最小 ADC_SampleTime_1Cycles5
转换时间=[采样时间+ 12.5个周期(固定值)]/12m  
72m主频没有2us 可以选个接近的 或者改主频 比如40M主频  RCC_PCLK2_Div4  adc=10m  (7.5+12.5)/10m=2us=500k
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-9-7
在线时间
30 小时
 楼主| 发表于 2019-3-15 10:46:52 | 显示全部楼层
edmund1234 发表于 2019-3-14 21:16
如果说你不是想获取PWM的平均值, 就不应该用ADC。
用TIM的PWM input mode就可以了

能够详细说一下吗,不是很明白。我想要实现的就是在25HZ信号下降沿后,通过ADC采集3700个数据,并且采集速度为500Khz,然后传给上位机。
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-9-7
在线时间
30 小时
 楼主| 发表于 2019-3-15 10:51:40 | 显示全部楼层
nashui_sx 发表于 2019-3-15 10:36
这是两个宏的前一半名字
103没有ADC_TwoSamplingDelay...
103的ADC_SampleTime 最小 ADC_SampleTime_1C ...

这样就让AD转换速度设为500KHZ,就不需要用PWM触发AD转换了对吧?然后该如何让他采集3700个数后进入中断呢,DMA该如何设置呢?   我DMA的代码搞了好久,就是没搞出来。
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-3-15 10:56:37 | 显示全部楼层
BUGMAN 发表于 2019-3-15 10:51
这样就让AD转换速度设为500KHZ,就不需要用PWM触发AD转换了对吧?然后该如何让他采集3700个数后进入中断 ...

都可以pwm触发ad 500k采样也可以  反正就 这几种模式,你选个适合的满足条件的就可以了
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-9-7
在线时间
30 小时
 楼主| 发表于 2019-3-15 11:17:59 | 显示全部楼层
nashui_sx 发表于 2019-3-15 10:56
都可以pwm触发ad 500k采样也可以  反正就 这几种模式,你选个适合的满足条件的就可以了

那DMA该怎么设呢,我觉得我现在的问题跟这位兄弟的是一样的。感谢!
www.openedv.com/forum.php?mod=vi ... =DMA%2B%D6%D0%B6%CF
回复 支持 反对

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4105
金钱
4105
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-15 11:48:20 | 显示全部楼层
本帖最后由 edmund1234 于 2019-3-15 11:51 编辑
BUGMAN 发表于 2019-3-15 10:46
能够详细说一下吗,不是很明白。我想要实现的就是在25HZ信号下降沿后,通过ADC采集3700个数据,并且采集 ...

ADC能采集的是模拟信号, 你的PWM是模拟信号吗?PWM不是0就是1, 你想采那个?
ADC能采的是PWM信号是通过RC电路转换到模拟信号, 之后采样才有意思啊, 但通过RC电路后, 它就不的3700个数据, 而是平均值, 或是某个时段的平均数, 明白?
如果说你要获取3700 PWM信号的周期及占空比, 那就不是用ADC, 而是用计数器的PWM 输入模式捕获, 明白?
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-9-7
在线时间
30 小时
 楼主| 发表于 2019-3-15 11:53:32 | 显示全部楼层
edmund1234 发表于 2019-3-15 11:48
ADC能采集的是模拟信号, 你的PWM是模拟信号吗?PWM不是0就是1, 你想采那个?
ADC能采的是PWM信号通过RC ...

哦哦,是这样的,我想要的并不是采集PWM的信号,而是想用PWM来触发ADC1来采集别的波形,采集3700个点后进入中断,再来传输数据,传输好后再采集。
回复 支持 反对

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4105
金钱
4105
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-15 11:59:46 | 显示全部楼层
BUGMAN 发表于 2019-3-15 11:53
哦哦,是这样的,我想要的并不是采集PWM的信号,而是想用PWM来触发ADC1来采集别的波形,采集3700个点后进 ...

你期望在这3700个点, 是什么数据?

比如说第一个PWM的占空比是50%, 你期望这采样数据是什么? 是0X400?
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-3-15 12:37:10 | 显示全部楼层
edmund1234 发表于 2019-3-15 11:48
ADC能采集的是模拟信号, 你的PWM是模拟信号吗?PWM不是0就是1, 你想采那个?
ADC能采的是PWM信号是通过 ...

他的目的应该是采集波形,
比如你要采集个正弦波,后处理,怎么办  首先至少采集一个周期  其次满足采样点要求
两者结合估计他计算的是500khz 3700个点正好

所以他要么固定adc转换周期是500k,全速dma转换。或者定时器主从模式产生500khz的方波3700个脉冲,用于pwm触发adc转换
回复 支持 反对

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4105
金钱
4105
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-15 13:26:23 | 显示全部楼层
nashui_sx 发表于 2019-3-15 12:37
他的目的应该是采集波形,
比如你要采集个正弦波,后处理,怎么办  首先至少采集一个周期  其次满足采样 ...

一个频率为500K的PWM信号, 你想用ADC采样, 然后得出它的占空比, 再把4096*占空比的, 先放缓冲, 再经DMA送到上位机, 是这样吗?

如果是, 我之前的回帖已经说明白这问题, 不可能用ADC做, 用ADC读不出它的占空比。
回复 支持 反对

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4105
金钱
4105
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-15 13:30:05 | 显示全部楼层
对于一个频率为500K的PWM信号来说, ADC最多可以采样两点, 通过这两点(不是0, 就是0xFFF)的数据你就能反推占空比?
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-3-15 19:35:24 | 显示全部楼层
edmund1234 发表于 2019-3-15 13:30
对于一个频率为500K的PWM信号来说, ADC最多可以采样两点, 通过这两点(不是0, 就是0xFFF)的数据你就能反 ...

你还是再学习学习在评论,不要活在自己的世界里
回复 支持 反对

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4105
金钱
4105
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-3-15 21:12:14 | 显示全部楼层
nashui_sx 发表于 2019-3-15 19:35
你还是再学习学习在评论,不要活在自己的世界里

踩着你尾巴了? 呵呵
回你帖的时候没打算让你多学点技术, 就想让你先学好些汉语。
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-3-15 22:16:29 | 显示全部楼层
本帖最后由 nashui_sx 于 2019-3-15 22:20 编辑
edmund1234 发表于 2019-3-15 21:12
踩着你尾巴了? 呵呵
回你帖的时候没打算让你多学点技术, 就想让你先学好些汉语。

你踩着自己的了吧,
你以为知道用定时器主从模式 还知道用定时器触发adc并dma采集会不知道pwm波用adc采集只有0 1没意义,你还是再看看帖子,并谦虚点好好学习吧,省的尾巴被自己踩掉了还要我给你回炉,或者直接给楼主做一个传上来让大家欣赏学习学习
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-9-7
在线时间
30 小时
 楼主| 发表于 2019-3-15 22:35:30 | 显示全部楼层
nashui_sx 发表于 2019-3-15 22:16
你踩着自己的了吧,
你以为知道用定时器主从模式 还知道用定时器触发adc并dma采集会不知道pwm波用adc采 ...

。。哥们你是对的,我就是想要采集波形的
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-3-15 22:52:40 | 显示全部楼层
BUGMAN 发表于 2019-3-15 22:35
。。哥们你是对的,我就是想要采集波形的

降低主频正好使adc是500k估计会影响你的usb
所以你的思路应该最适合你,
或者这个500k能变通,不过是采样点变了,你可以看看那个转换周期   转换时间=[采样时间+ 12.5个周期(固定值)]/12m 是个整数(方便你以后处理)能满足你,全速dma采集就可以了,点数重新计算
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-3-16 12:22:26 | 显示全部楼层
本帖最后由 nashui_sx 于 2019-3-16 12:25 编辑
BUGMAN 发表于 2019-3-16 11:15
终于搞出来啦,我的思路是可以的,发现问题出在PWM波触发ADC的那步,我一开始设置PWM波的占空比为50%,我 ...

为了追求精度,那你现在可以用ad采集一个500k的方波了,假如你的采样频率是500k  ad值要么全是4096(高)  要么全是0(低)    假如是高低电平的波动值证明你的采样频率不是固定的,要么上位机用时间和采样点差值,要么检查代码保证500k的采样频率
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-9-7
在线时间
30 小时
 楼主| 发表于 2019-3-16 13:50:25 | 显示全部楼层
nashui_sx 发表于 2019-3-16 12:22
为了追求精度,那你现在可以用ad采集一个500k的方波了,假如你的采样频率是500k  ad值要么全是4096(高) ...

好的,我去试试
回复 支持 反对

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-3-16 14:03:22 | 显示全部楼层
BUGMAN 发表于 2019-3-16 13:50
好的,我去试试

你知道原理就知道为啥这么能检测了也就好检测了,不过精度要求不高,不检测也可以
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-9-7
在线时间
30 小时
 楼主| 发表于 2019-3-16 23:21:43 | 显示全部楼层
nashui_sx 发表于 2019-3-16 14:03
你知道原理就知道为啥这么能检测了也就好检测了,不过精度要求不高,不检测也可以

原理我是懂得,就是现在还在琢磨如何传输数据到上位机。
现在的问题是 ,我采集了3700个数,触发信号是25HZ,所以我要在40ms内完成采集与传送,好应对下一个周期的到来,采集时间为7.4ms,所以我需要在32.6ms内用USB把数据传送过去,我是在DMA传输完成中断中,用原子哥的USB虚拟串口里的USB_USART_SendData()函数配上for循环传送的,不大清楚速度跟不跟得上?
而且我上位机是用LABVIEW画的,看他们网上说的,需要自己拟一个通信协议,这个我也还在了解。
回复 支持 反对

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2018-9-7
在线时间
30 小时
 楼主| 发表于 2019-3-17 01:19:09 | 显示全部楼层
nashui_sx 发表于 2019-3-16 14:03
你知道原理就知道为啥这么能检测了也就好检测了,不过精度要求不高,不检测也可以

还有个情况是,AD转换的数据是16位的,而USB_USART_SendData()函数只能传送一个字节,所以我在DMA设置里,将一个16位拆成了两个8位处理,但是传到上位机时,高八位和低八位经常会错位,这个我也还在思考原因和解决的办法。
回复 支持 反对

使用道具 举报

17

主题

94

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2023-5-29
在线时间
125 小时
发表于 2023-8-25 15:38:12 | 显示全部楼层
楼主,你这个CCD(TCD1304)的采集系统,代码可以分析参考考一下不
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 18:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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