| 使用的是STM32L0系列,准备使用延时函数使PWM波形移相,现在延时函数不起作用 delay.c函数如下: //us void delay_us(uint32_t nus) { uint32_t temp; SysTick->LOAD = 30*nus; SysTick->VAL=0X00; SysTick->CTRL=0X01; do { temp=SysTick->CTRL; }while((temp&0x01)&&(!(temp&(1<<16)))); SysTick->CTRL=0x00; SysTick->VAL =0X00; } main函数使用delay如下: HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_4); delay_us(20); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); 但是定时器2的2通道输出PWM波并没有发生延时变化,这是为什么? |
首先,这个延时函数本身配置没问题的话肯定是可以有效运行的。 其次,你现在觉得不起作用,是基于2个TIMER输出通道没有产生带相移的 输出而得出的结论,只能说这个方式不可行,不能说这个延时函数本身没作用。 其实,目前你这个方式只能影响到起始输出那一刻,但没法影响到2个输出通道的相位。 打个比方,就像有人喊踏步踏的口令,开始可能有人动作慢点,别人踏步几个回合后才动起来。但当他踏步起来后还是严格按照口 令来的,最后你是看不到有谁踏步跟别人不同步的情况的,顶多发现刚开始有人动作慢点,后面的踏步都若严格按口令来的话是看不到 谁踏步跟别人有何异样。 你这个问题好像昨天咨询过,给过你一些参考回复。 可以基于一个定时器的2个通道,一个通道使用PWM输出模式,一个使用OC toggle输出模式结合DMA来实现。 或者使用2个定时器建立主从模式,各选1个通道来实现,通过设置不同的计数器初始值来产生输出相移。 第2种方式即2个定时器建立主从模可能比较简单点,我看了stm32L0的手册,TIM2和TIM21是可以进行主从连接的。
首先,这个延时函数本身配置没问题的话肯定是可以有效运行的。
一个使用OC toggle输出模式结合DMA来实现. 请教一下,为什么要结合DMA来实现?在匹配中断中修改CCR的值来完成第二个边沿可以吗?
一个使用OC toggle输出模式结合DMA来实现.
使用OC toggle输出模式结合DMA来实现比较方便,因为要不停动态修改CCR的值。 当然 你使用中断方式也可以。
使用OC toggle输出模式结合DMA来实现比较方便,因为要不停动态修改CCR的值。 当然 你使用中断方式也可以。
使用在中断里修改CCR的值原理上是可行的。 不过考虑到进出中断加上代码执行需要一定时间,此时计数器已经从头开始计数了或者继续,CCR的值就不能太小,靠近1,对当前和下次比较时刻是否来得及很难保证 。 所以对于频率高一点的PWM处理起来就很难了,况且中断会很频繁,STM32L0也只有32MHZ。 如果利用现成的DMA外设做这个,就会省掉很多中断时间,分辨率也会提高。
这个地方回帖太费劲了。 发的贴似乎没法再编辑。 使用中断方式修改比较值固然可以。不过,基于中断方式修改CCR的话,对CPU的占用我们要考虑,有些应用场景可能没法接受。这点要注意。