久芯网

延时函数不起作用

avatar 吃肉肉,不长肉肉 提问时间: 2023-07-08 21:38:26 / 未解决
使用的是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波并没有发生延时变化,这是为什么?

6个回答
  • avatar xmshao
    回答时间: 2023-07-08 22:05:54

    首先,这个延时函数本身配置没问题的话肯定是可以有效运行的。 其次,你现在觉得不起作用,是基于2个TIMER输出通道没有产生带相移的 输出而得出的结论,只能说这个方式不可行,不能说这个延时函数本身没作用。 其实,目前你这个方式只能影响到起始输出那一刻,但没法影响到2个输出通道的相位。 打个比方,就像有人喊踏步踏的口令,开始可能有人动作慢点,别人踏步几个回合后才动起来。但当他踏步起来后还是严格按照口 令来的,最后你是看不到有谁踏步跟别人不同步的情况的,顶多发现刚开始有人动作慢点,后面的踏步都若严格按口令来的话是看不到 谁踏步跟别人有何异样。 你这个问题好像昨天咨询过,给过你一些参考回复。 可以基于一个定时器的2个通道,一个通道使用PWM输出模式,一个使用OC toggle输出模式结合DMA来实现。 或者使用2个定时器建立主从模式,各选1个通道来实现,通过设置不同的计数器初始值来产生输出相移。 第2种方式即2个定时器建立主从模可能比较简单点,我看了stm32L0的手册,TIM2和TIM21是可以进行主从连接的。

  • avatar qiangtech
    回答时间: 2023-07-08 22:35:23
    xmshao 发表于 2023-2-1 10:35
    首先,这个延时函数本身配置没问题的话肯定是可以有效运行的。

    一个使用OC toggle输出模式结合DMA来实现. 请教一下,为什么要结合DMA来实现?在匹配中断中修改CCR的值来完成第二个边沿可以吗?

  • avatar xmshao
    回答时间: 2023-07-08 22:57:43
    qiangtech 发表于 2023-2-1 10:45
    一个使用OC toggle输出模式结合DMA来实现.

    使用OC toggle输出模式结合DMA来实现比较方便,因为要不停动态修改CCR的值。 当然 你使用中断方式也可以。

  • avatar xmshao
    回答时间: 2023-07-08 23:16:01

    使用OC toggle输出模式结合DMA来实现比较方便,因为要不停动态修改CCR的值。 当然 你使用中断方式也可以。

  • avatar butterflyspring
    回答时间: 2023-07-08 23:37:04

    使用在中断里修改CCR的值原理上是可行的。 不过考虑到进出中断加上代码执行需要一定时间,此时计数器已经从头开始计数了或者继续,CCR的值就不能太小,靠近1,对当前和下次比较时刻是否来得及很难保证 。 所以对于频率高一点的PWM处理起来就很难了,况且中断会很频繁,STM32L0也只有32MHZ。 如果利用现成的DMA外设做这个,就会省掉很多中断时间,分辨率也会提高。

  • avatar xmshao
    回答时间: 2023-07-08 23:57:01

    这个地方回帖太费劲了。 发的贴似乎没法再编辑。 使用中断方式修改比较值固然可以。不过,基于中断方式修改CCR的话,对CPU的占用我们要考虑,有些应用场景可能没法接受。这点要注意。

会员中心 微信客服
客服
回到顶部