0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PWM输出第一个脉冲宽带异常的话题

茶话MCU 来源:ST MCU 信息交流 2020-05-14 09:27 次阅读

我们在使用STM32定时器做PWM输出过程中,当借助示波器或逻辑分析仪查看波形时,有时会发现输出的第一个PWM脉冲跟后续的输出脉冲不一样。比方像下面的输出波形,第一个脉冲的高电平要宽于所有其它后续脉冲。

对于这种情况,有些应用是不太在乎的,但有些应用场合可能就不能接受。那这个问题是怎么产生的?有没有办法解决?

产生这个现象的原因简单点说就是在于定时器比较输出模块的工作与定时器计数单元的工作具有相对独立性。使能比较通道的输出功能的操作与使能计数器的操作有个时间差,其长短往往跟用户处理代码有关。

我们知道,STM32的高级定时器或通用定时器,可以大致看成由四个模块组成,分别是主从控制模块、时基单元、输入捕捉模块、输出比较模块。下面截图是STM32F4系列高级定时器TIM1的功能框图的一部分,这里没有将定时器的主从模块截取进来,只保留了时基单元、输入捕捉单元、输出比较单元。

这三个单元既可以相互配合协调工作,也可以各自独立工作。比方说,输出比较单元的工作并不要求时基单元的计数器工作,换言之,即使计数器不被开启计数,输出比较单元依然可以根据默认配置或用户的有关输出配置而发挥作用。

我们不妨结合一个具体实例来看下。假设定时器TIM1的计数模式选择向上计数模式,让通道CH1按照PWM1模式的规则实现PWM输出。配置好ARR和CCR1,极性选择高有效,即OC输出与OCRef参考信号保持同相。

对于定时器的初始化,我们一般会先对时基单元的相关参数做配置,比如时钟源、ARR,PSC等,然后对比较输出功能做配置和使能。当完成比较输出的配置及使能后,即使此时没有使能时基单元的计数器,比较输出单元就发挥作用了,即它会结合比较输出配置和CNT与CCR的比较结果在OC端输出相应电平。

根据上述配置,若CCR大于计数器CNT的值时OC端输出高电平,否则输出低电平。若用户没有专门对CNT寄存器进行赋值,芯片复位后,它的默认值就是0,显然CCR的值要大于此时的CNT的值,自然此时OC端就输出高电平。如果此时计数器还未被开启,这个高电平就会保持到计数器被启动,并延申到后续的PWM输出动作中。即这个高电平会跟第一个PWM脉冲的输出连在一起。若刚好碰到第一个PWM脉冲首先是输出高电平,这就导致第一个脉冲的高电平宽度要宽于后面其它所有PWM脉冲的。

下图第1处乃通道OC功能配置完成被使能的时间点,第2处乃计数器被启动时间点。

在跟上述相同模式和极性条件下,有没有办法消除第一个脉冲的多余宽度呢?

办法是有的。既然OC通道被使能后,其输出由CCR与CNT的比较结果和PWM模式决定,这时我们可以考虑在使能OC通道之前手动将CNT的值进行修改,让它等于ARR或0xffff【若是32位计数器就是0xffffffff】,此时CNT的值不可能会小于用户配置的CCR值,就这样通过改变CCR与CNT的比较结果达到改变OC端输出电平之目的。

比方,如果你用STM32标准库写的话,你可以在下面红圈的那个地方加一句:【arr对应着时基单元中ARR寄存器的值】

参照上面相同定时器配置【向上计数模式、PWM1模式、极性选择高有效】,下面基于Cube库使用STM32F4的TIM1的通道2进一步做个验证测试。

使用CubeMx配置完成生成初始化代码,需添加的用户代码比较简单。如下图所示。其中方框里的延时函数代码是用来模拟比较输出使能与使能计数器两个操作间的间隔,以便观察效果。

基于上述代码,我们通过示波器可以看到第一个脉冲明显宽于其它后续PWM脉冲。【如下图所示】

在上面代码的基础上,我们在使能CH2比较输出功能的代码前添加一句修改CNT寄存器的语句,令其值等于ARR或等于计数器的满量程值。下图中椭圆圈内的代码。【若把CNT值改成等于ARR的值,效果也一样】

然后再进行测试,第一个脉冲也就不再异常了。【如下图所示】

最后小结下,这个现象只有在使能定时器通道的比较输出操作与使能计数器操作存在较为明显的时差时才可能发现,而且它还跟所选择的PWM模式有关,上面只是针对向上计数模式、PWM1模式做了分析和分享,当涉及其它应用模式时可具体问题具体分析,只要弄清原因了也就不难灵活应对。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4900

    浏览量

    209900
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348735
  • 定时器
    +关注

    关注

    23

    文章

    3147

    浏览量

    112034

原文标题:PWM输出第一个脉冲宽带异常的话题

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    f446rct6在使用dma控制pwm占空比时,pwm波形异常的原因?

    需要更新数据时,启动次dma传输 现象:pwm波的频率,占空比没有问题,但是在启动dma传输的第一个或第二波形,经常会 出现
    发表于 04-09 07:45

    TIM_PWM+DMA输出不同占空比的单脉冲,为什么第三数据总是第一个输出

    使用TIM_PWM + DMA,DMA传输长度为3,即顺序输出3不同占空比的单脉冲(10%,20%,50%),三
    发表于 04-03 07:23

    求助,用CubeMX配置占空比30%的PWM输出第一个波形不准确是为什么?

    我用的是G0的芯片配置,通过抓波发现第一个波形永远与我配置的占空比不准确,但是除了第一个周期不准确外,后面的都没问题。
    发表于 03-18 07:55

    STM32F103VET6的PWM输出,设置空闲态为低电平,在低电平刹车时出现异常短暂脉冲的原因?

    单通道PWM输出时(设定低电平时间为600us,设定空闲状态为低电平),在PWM低电平500us时,来了刹车信号,发现
    发表于 03-18 07:45

    使用ADuC7060的PWM1端口输出PWM脉冲,断电后再上电导致PWM输出异常,怎么解决?

    我打算使用ADuC7060的PWM1端口输出PWM脉冲,单端输出,占空比是50%,周期是100μS,在用Keil调试时能正常
    发表于 01-15 07:30

    PWM脉冲的产生与使用

    PWM脉冲的周期范围为10~65535μs或2~65535ms,在设置脉冲周期时,如果周期小于两个时间单位,系统会默认周期值为两个时间单位;PWM脉宽时间为0~65535μs或0~65
    的头像 发表于 12-29 14:19 772次阅读
    <b class='flag-5'>PWM</b><b class='flag-5'>脉冲</b>的产生与使用

    ADA4961脉冲响应异常怎么解决?

    测试,波形如下图所示,发现第一个周期的响应异常:前半周振幅不足,第二周期开始就比较平稳。 如上图,黄色波形为输入,绿色为输出。增益控制维持不变。 问题: 1、上述响应是否正常 2、是否有更合适器件推荐? 满足
    发表于 11-14 08:22

    举个例子来说明PWM如何输出指定脉冲

    举个例子来说明PWM如何输出指定脉冲数: 假设我们需要使用PWM来控制直流电机的转速。电机的
    发表于 09-21 08:55

    pwm就能输出指定脉冲

    PWM(Pulse Width Modulation)是种调制技术,通过改变高电平和低电平的持续时间来调节输出脉冲宽度。通过PWM技术,
    发表于 09-21 08:52

    如何使用PWM触发ADC和PWM刹车功能来阻止PWM输出

    : NuTiny-EVB-Mini51_V2.1 此示例代码显示了两 PWM 函数。 第一个PWM 触发 ADC, 第二
    发表于 08-30 06:17

    如何使用PWM触发ADC和PWM刹车功能来阻止PWM输出

    : NuTiny-EVB-Mini51_V2.1 此示例代码显示了两 PWM 函数。 第一个PWM 触发 ADC, 第二
    发表于 08-23 07:31

    STM32F103VET6 PWM输出,设置空闲态为低电平时出现异常短暂脉冲是什么原因?

    单通道PWM输出时(设定低电平时间为600us,设定空闲状态为低电平),在PWM低电平500us时,来了刹车信号,发现
    发表于 08-07 09:06

    求助,用CubeMX配置占空比30%的PWM输出第一个波形不准确是为什么

    我用的是G0的芯片配置,通过抓波发现第一个波形永远与我配置的占空比不准确,但是除了第一个周期不准确外,后面的都没问题。
    发表于 08-07 07:26

    N76E003 PWM启动第一个脉宽有时有4MS宽度,是哪里问题?

    N76E003 PWM启动第一个脉宽有时有4MS宽度(设置为50KHZ 50%DUTY 正常应该为10US),是哪里问题? 这个长脉宽,有时没有,有时有,无规律
    发表于 06-15 07:06

    基于ESPHelper的项目,第一个网络连接的引导循环和异常是怎么回事?

    多年来,我直致力于基于 ESPHelper 的项目(大约 15 ESP8266-01/03 在 MQTT 环境中起工作)。它总是
    发表于 06-08 06:47