你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

DMA传PWM的脉冲数不准确问题

[复制链接]
ckjjjj 提问时间:2020-9-7 10:05 /
用DMA传PWM脉冲数,需要发指定数量的脉冲数(10,200,500,1000,2000...)。之前发脉冲的的时间没有限制。然后调试发脉冲个数没问题。后面加上限定每1ms分别发这些脉冲。发10个或200个是没问题。然而在发500或1000个脉冲的时候,多了1个脉冲,发2000个脉冲多了3个脉冲数。而且这多的脉冲是标准的脉冲,而不是不完整的脉冲。请问为什么前面发10个或200个是没问题,然而后面的脉冲数多了就会存在多发脉冲的情况?改了优先级试过没用。附件上有程序,请大佬帮忙分析。

这段是发500个脉冲

这段是发500个脉冲

这里就刚好1ms,但后面会多一个脉冲

这里就刚好1ms,但后面会多一个脉冲

波形分析.zip

下载

12.53 KB, 下载次数: 1, 下载积分: ST金币 -1

用逻辑分析仪抓到的波形

PWM Encoder.zip

下载

314.42 KB, 下载次数: 6, 下载积分: ST金币 -1

1 收藏 1 评论6 发布时间:2020-9-7 10:05

举报

6个回答
butterflyspring 回答时间:2020-9-18 17:27:12
DMA能决定你每次发送脉冲占空比,但是决定不了DMA的个数。到DMA为计数器为0时,如果产生中断到处理的时间长与脉冲周期数,就会发生这样的现象,也就是当处理的速度慢了。简单一点,可以把DMA缓冲区后面多添加几个大于ARR的值,帮你的程序拖延一些时间,掩护中断中断程序
ckjjjj 回答时间:2020-9-7 14:25:15

我是想实现多路脉冲+编码器接收功能。因为是小白,之前经过了很多考虑,包括IO翻转,或者定时器比较输出,都考虑过,但存在频繁中断的情况,或者不能单独改变每一路的频率,于是用DMA+PWM的方式发脉冲。主任务1ms会发一个脉冲数的数据,所以我需要在1ms内把脉冲发完才行。于是我就用DMA+PWM来。我的理解上,DMA用来控制脉冲个数,TIM负责发送PWM,于是脉冲个数就是DMA长度,这样,当DMA传数据直到DMA长度为0,产生中断把TIM-CCRx设置为0,停止定时器的发PWM,然后清除DMA中断标志。现在呢,因为需要1ms就要把脉冲发完,并且占空比设置为50%,所以,我在每次发送脉冲之前,分别设置TIM的PSC,ARR,和CCR,通过关系得到PSC,通过关系,算出ARR,然后知道ARR后就能知道设置比较值CCR,然后我设置好DMA长度后就开启DMA,这样就开始传数据。

然后呢,里面有几个函数可能没说清。TIMx_Dma_Pwm_Output_Init用来初始化PWM功能;TIMx_Dma_Pwm_Output用来输出PWM;Axis_Pwm_Mode_Cfg因为是用脉冲+方向的方式控制,所以用来配置脉冲的高或者低电平有效,以及方向高低电平有效;最主要就是初始化和输出PWM这两个函数,所以模式可以不用太注意。

小小超 回答时间:2020-9-9 08:35:27
是不是计数器溢出了?发100跟1000似乎关系不大
ckjjjj 回答时间:2020-9-9 09:37:35
ts2000 发表于 2020-9-9 08:35
是不是计数器溢出了?发100跟1000似乎关系不大

我是小白一个,你说计数器溢出,按理应该不是,我的arr的值也不是很大,不会超过U16的上限。
cool-366442 回答时间:2020-9-14 20:32:29
和我有类似之处,我的是timer触发采集ADC,用DMA方式,配置的采样频率20khz,采集信号发生器的5khz信号,采集点数20000个点,计算FFT,频率会有偏差,打的信号是5khz,计算出来是4.9khz,差100hz,不准确,郁闷啊
ckjjjj 回答时间:2020-9-22 11:09:22
cool-366442 发表于 2020-9-14 20:32
和我有类似之处,我的是timer触发采集ADC,用DMA方式,配置的采样频率20khz,采集信号发生器的5khz信号,采 ...

我还没去用TIM触发采集ADC,老哥你的问题解决了么?能共享下你的测试代码么?我后面也需要用这个采集ADC的功能

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版