|
用DMA传PWM脉冲数,需要发指定数量的脉冲数(10,200,500,1000,2000...)。之前发脉冲的的时间没有限制。然后调试发脉冲个数没问题。后面加上限定每1ms分别发这些脉冲。发10个或200个是没问题。然而在发500或1000个脉冲的时候,多了1个脉冲,发2000个脉冲多了3个脉冲数。而且这多的脉冲是标准的脉冲,而不是不完整的脉冲。请问为什么前面发10个或200个是没问题,然而后面的脉冲数多了就会存在多发脉冲的情况?改了优先级试过没用。附件上有程序,请大佬帮忙分析。 |
微信公众号
手机版
我是想实现多路脉冲+编码器接收功能。因为是小白,之前经过了很多考虑,包括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这两个函数,所以模式可以不用太注意。
我是小白一个,你说计数器溢出,按理应该不是,我的arr的值也不是很大,不会超过U16的上限。
我还没去用TIM触发采集ADC,老哥你的问题解决了么?能共享下你的测试代码么?我后面也需要用这个采集ADC的功能