搜索
bottom↓
回复: 15

STM32用PWM触发ADC采样,采样一定样本后停止,如何设置?

[复制链接]

出0入36汤圆

发表于 2019-6-25 15:10:20 | 显示全部楼层 |阅读模式
   想实现的功能如下:
         1。用定时器产生一路PWM驱动外围电路,并用这路PWM的上升边沿做为ADC开始采集的起始点。
         2.  ADC采集用DMA传输,PWM边沿触发ADC开始第一个样本的采集,采集完成256个样本后通知主函数进行运算处理。此时不再采集传输以防数据被覆盖。
         3.  主函数处理完后,再次允许PWM边沿触发ADC继续采集下一轮256的样本。并且保证第一个样本是PWM边沿触发,就是需要保证同步。
         4.  PWM一经开启,就不允许再次暂停。
   触发ADC采样完256个样本后产生DMA中断,在中断里置位标志。如何暂停ADC和DMA继续动作,处理玩后又如何保证下一个采集的同步呢?
  现在的处理是在DMA中断中  用ADC_Cmd(ADC1, DISABLE);  来关闭中断,主函数处理完后再开启,但是感觉这个做法不好。

出0入0汤圆

发表于 2019-6-25 15:21:31 | 显示全部楼层
采集完样本不是关闭定时器就只有关ADC了,这么做为什么不好

出0入0汤圆

发表于 2019-6-25 15:32:35 | 显示全部楼层
可以换个思路嘛,比如采257个,只用最后256个,第一个丢掉。

出0入36汤圆

 楼主| 发表于 2019-6-25 15:38:55 | 显示全部楼层
lcw_swust 发表于 2019-6-25 15:32
可以换个思路嘛,比如采257个,只用最后256个,第一个丢掉。

没理解你的意思

出0入0汤圆

发表于 2019-6-25 16:38:47 | 显示全部楼层
不用关中断,关闭ADC的DMA传输使能位就足够 了,ADC会一直跑的,你再次使能DMA传输又传就是了

出0入0汤圆

发表于 2019-6-25 16:58:02 | 显示全部楼层
GZZXB 发表于 2019-6-25 15:38
没理解你的意思

我的意思是采集够了后关ADC或关DMA都行,如果担心同步的问题就把数据多采一些,前面多余的数据认为不稳定就丢掉。

出0入0汤圆

发表于 2019-6-25 17:04:57 | 显示全部楼层
设置双buff,一个接收,一个处理,这样数据可以连续采集

出0入0汤圆

发表于 2019-8-20 10:16:06 | 显示全部楼层
楼主  后来搞定了没

出0入36汤圆

 楼主| 发表于 2019-8-21 10:50:23 | 显示全部楼层
liaoliaoliao123 发表于 2019-8-20 10:16
楼主  后来搞定了没

用笨方法实现了,就是每次都初始化下打点定时器。

出0入0汤圆

发表于 2019-8-21 11:15:52 | 显示全部楼层
定时器直接触发启动与关闭,计算好采样时间,DMA连续采样一个定时周期后停止计算数据。只要采样的数据能覆盖到需要采样波形完整周期即可。

出0入0汤圆

发表于 2019-8-21 11:55:09 | 显示全部楼层
楼主 有没有搞过外部事件触发ADC采集

出0入36汤圆

 楼主| 发表于 2019-8-24 21:19:33 | 显示全部楼层
liaoliaoliao123 发表于 2019-8-21 11:55
楼主 有没有搞过外部事件触发ADC采集

这个没有用过,但是应该是一样的道理只是触发源配置为外部信号触发而已。

出0入0汤圆

发表于 2019-8-25 16:54:22 | 显示全部楼层
1、2倍长度的buffer,前后各1半当两个缓冲区交替用。用HalfCplt和Cplt区分是前还是后半个完成了。
2、用双缓冲模式:双缓冲区模式
此模式可用于所有 DMA1 和 DMA2 数据流。
通过将 DMA_SxCR 寄存器中的 DBM 位置 1,即可使能双缓冲区模式。
除了有两个存储器指针之外,双缓冲区数据流的工作方式与常规(单缓冲区)数据流的一
样。使能双缓冲区模式时,将自动使能循环模式(DMA_SxCR 中的 CIRC 位的状态是“无
关”),并在每次事务结束时交换存储器指针。
在此模式下,每次事务结束时,DMA 控制器都从一个存储器目标交换为另一个存储器目
标。这样,软件在处理一个存储器区域的同时,DMA 传输还可以填充/使用第二个存储器区
域。

出0入0汤圆

发表于 2019-8-25 16:56:28 | 显示全部楼层
liaoliaoliao123 发表于 2019-8-21 11:55
楼主 有没有搞过外部事件触发ADC采集

貌似没有直接gpio触发的渠道。
可以将信号作为某个定时器的外部时钟输入ETR,定时器设定为slave模式,用trgo事件触发dma。

出0入0汤圆

发表于 2019-8-26 09:45:05 | 显示全部楼层
ilawp 发表于 2019-8-25 16:56
貌似没有直接gpio触发的渠道。
可以将信号作为某个定时器的外部时钟输入ETR,定时器设定为slave模式,用t ...

谢谢你的回复

出0入0汤圆

发表于 2019-8-26 09:47:01 | 显示全部楼层
GZZXB 发表于 2019-8-24 21:19
这个没有用过,但是应该是一样的道理只是触发源配置为外部信号触发而已。 ...

好 谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 05:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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