请选择 进入手机版 | 继续访问电脑版

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

延时函数不起作用

[复制链接]
吃肉肉,不长肉肉 提问时间:2023-2-1 09:27 / 未解决
使用的是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 发布时间:2023-2-1 09:27

举报

6个回答
xmshao 回答时间:2023-2-1 10:35:49
首先,这个延时函数本身配置没问题的话肯定是可以有效运行的。


其次,你现在觉得不起作用,是基于2个TIMER输出通道没有产生带相移的
输出而得出的结论,只能说这个方式不可行,不能说这个延时函数本身没作用。


其实,目前你这个方式只能影响到起始输出那一刻,但没法影响到2个输出通道的相位。


打个比方,就像有人喊踏步踏的口令,开始可能有人动作慢点,别人踏步几个回合后才动起来。但当他踏步起来后还是严格按照口
令来的,最后你是看不到有谁踏步跟别人不同步的情况的,顶多发现刚开始有人动作慢点,后面的踏步都若严格按口令来的话是看不到
谁踏步跟别人有何异样。


你这个问题好像昨天咨询过,给过你一些参考回复。


可以基于一个定时器的2个通道,一个通道使用PWM输出模式,一个使用OC toggle输出模式结合DMA来实现。


或者使用2个定时器建立主从模式,各选1个通道来实现,通过设置不同的计数器初始值来产生输出相移。



第2种方式即2个定时器建立主从模可能比较简单点,我看了stm32L0的手册,TIM2和TIM21是可以进行主从连接的。
qiangtech 回答时间:2023-2-1 10:45:10
xmshao 发表于 2023-2-1 10:35
首先,这个延时函数本身配置没问题的话肯定是可以有效运行的。

一个使用OC toggle输出模式结合DMA来实现.


请教一下,为什么要结合DMA来实现?在匹配中断中修改CCR的值来完成第二个边沿可以吗?
xmshao 回答时间:2023-2-1 11:40:51
qiangtech 发表于 2023-2-1 10:45
一个使用OC toggle输出模式结合DMA来实现.


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



当然 你使用中断方式也可以。

xmshao 回答时间:2023-2-1 11:40:49
使用OC toggle输出模式结合DMA来实现比较方便,因为要不停动态修改CCR的值。



当然 你使用中断方式也可以。
butterflyspring 回答时间:2023-2-1 14:20:35
使用在中断里修改CCR的值原理上是可行的。 不过考虑到进出中断加上代码执行需要一定时间,此时计数器已经从头开始计数了或者继续,CCR的值就不能太小,靠近1,对当前和下次比较时刻是否来得及很难保证 。 所以对于频率高一点的PWM处理起来就很难了,况且中断会很频繁,STM32L0也只有32MHZ。 如果利用现成的DMA外设做这个,就会省掉很多中断时间,分辨率也会提高。
xmshao 回答时间:2023-2-1 14:55:49
这个地方回帖太费劲了。 发的贴似乎没法再编辑。


使用中断方式修改比较值固然可以。不过,基于中断方式修改CCR的话,对CPU的占用我们要考虑,有些应用场景可能没法接受。这点要注意。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版