STM32
直播中

王娟

7年用户 462经验值
私信 关注
[问答]

pwm中调整下一个周期的占空比会送多一到两个错误的脉冲是为什么?

请问在pwm中调整下一个周期的占空比的问题。我现在用timer4的第二通道产生pwm,利用预装载功能,在每个pwm更新周期前设置下一个周期的占空比,但好像临停止的时候(脉冲流的尾段)会送多一个到两个错误的脉冲。请帮忙看看是什么问题。代码是这样的:    ......    ......    if (buff[t]&0x08) TIM4->CCR2=50; else TIM4->CCR2=130;   //(A处)    while (!(TIM4->SR&1)) ;                               TIM4->SR&=~1;                            //清除更新事件标志    if (buff[t]&0x04) TIM4->CCR2=50; else TIM4->CCR2=130;   //(B处)     //这里不等A处设置的pwm时间周期结束,就直接再写入新的参数,利用预装载功能    while (!(TIM4->SR&1)) ;                  //检查更新事件。这里等待的是A处设置的pwm时间周期结束    TIM4->SR&=~1;    if (buff[t]&0x02) TIM4->CCR2=50; else TIM4->CCR2=130;   //(C处)    while (!(TIM4->SR&1)) ;    TIM4->SR&=~1;    if (buff[t]&0x01) TIM4->CCR2=50; else TIM4->CCR2=130;   //(D处)    while (!(TIM4->SR&1)) ;                           //这里等待的是C处设置的pwm时间周期结束    TIM4->SR&=~1;      //D处设置的pwm时间周期这时还没有结束  }  TIM4->CR1|=1<<3;       //到最后了,改单脉冲模式,这个脉冲结束时,定时器自动停止。但这里好像会送多一到两个错误脉冲出去。
或者有否其他更好的处理方面?
请帮忙。
谢谢。

回帖(4)

崔璨

2020-4-28 09:17:20
你这样的做法,貌似不靠谱.
当你检查到更新的时候,并不是立即更新的,while,赋值,都需要时间,这个期间,可能PWM的下一个周期已经开始输出了,然后你又修改CCR2的值,导致输出脉冲不正确.
举报

王英

2020-4-28 09:27:12
那怎搞嘛?
举报

陈思远

2020-4-28 09:34:43
我那里检查更新是检查前一个pwm周期是不是结束,见代码的第5行。我是想用那个预装载功能,即是我现在赋的值要等前一个pwm周期完成后,在更新周期时才装入,我就在前一个pwm周期还没结束时(前一个pwm周期的期间),再赋一个新的值给它。等它下次更新周期时拿这个值。
另外,速度很高,1uS级别的。
举报

李红

2020-4-28 09:40:00
自动重装是在计数器溢出的情况下重装的。
比如装入计数器值为1,向下计数:计一次数,由1到0,再计一次才溢出。
所以重装值应该为 (要计数值) - 1。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分