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
    +关注

    关注

    116

    文章

    5848

    浏览量

    223935
  • STM32
    +关注

    关注

    2305

    文章

    11124

    浏览量

    371307
  • 定时器
    +关注

    关注

    23

    文章

    3361

    浏览量

    121830

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    IEEE 802.11af 与空白频谱无线技术的话题

    IEEE 802.11af 与空白频谱无线技术的话题
    的头像 发表于 12-14 15:12 186次阅读

    如何通过PWM脉冲控制电机?

    领域。 PWM脉冲脉冲宽度调制技术,通过调节脉冲的高低电平时间比例来控制电路的平均电平值,来对
    发表于 11-28 06:58

    案例分享| PPLN驱动的宽带量子合成器:实现超快压缩光脉冲源的关键突破

    (BroadbandQuantumSynthesizer,BQS)便是其中之,旨在推进超快量子光学的前沿,其目的是开发世界上第一个宽带压缩光脉冲封装源,这是对下
    的头像 发表于 11-27 17:11 1011次阅读
    案例分享| PPLN驱动的<b class='flag-5'>宽带</b>量子合成器:实现超快压缩光<b class='flag-5'>脉冲</b>源的关键突破

    Linux 下交叉编译实战:跑起来你的第一个 STM32 程序

    跑起来你的第一个STM32程序。、准备工作在开始之前,需要准备:1、Linux开发环境Ubuntu、Debian或其他主流发行版都可以。2、ARMGCC交叉编译工具
    的头像 发表于 11-24 19:04 279次阅读
    Linux 下交叉编译实战:跑起来你的<b class='flag-5'>第一个</b> STM32 程序

    文带你读懂“脉冲输入输出模块”

    在自动化生产的世界里,传感器、执行器、控制器每天都在“对话”。可问题是,它们说的语言千奇百怪——有的输出电压信号,有的传输电流信号,还有的发出连串高速脉冲。如果没有“翻译官”,系统就乱了套。 而
    的头像 发表于 11-24 17:10 465次阅读
    <b class='flag-5'>一</b>文带你读懂“<b class='flag-5'>脉冲</b>输入<b class='flag-5'>输出</b>模块”

    **CW32L012****开发评估板的第一个程序**

    CW32L012****开发评估板的第一个程序 最近以15.99在CW32生态社区入手了这块CW32L012开发评估板,我迫不及待的烧录进电灯程序,看看这块板子是否是正常的,能否满足我后面的学习
    发表于 11-22 00:09

    HRTIM变频控制输出第一个周期频率异常的原因?

    在使用STM32G474CBT6的HRTIM_Mater、HRTIM_TIMER_B和HRTIM_TIMER_D输出同步互补的四路输出时,关闭4路输出和三定时器的计数后,再次开启时
    发表于 04-25 06:17

    HRTIM变频控制输出第一个周期频率异常的原因?

    在使用STM32G474CBT6的HRTIM_Mater、HRTIM_TIMER_B和HRTIM_TIMER_D输出同步互补的四路输出时,关闭4路输出和三定时器的计数后,再次开启时
    发表于 04-22 12:08

    LTC3886输出PWM异常的原因?

    我在尝试用片LTC3886输出两路8V10A的电源,硬件设计参考了DC2155A,调试中发现OUT0控制外部MOS管的PWM波有异常,它的占空比
    发表于 04-17 06:59

    STM32H750使用定时器比较通道触发DMA操作GPIO,偶尔会发生第一个脉冲宽度过短怎么解决?

    RCC配置: DMA设置: 定时器设置: 生成的协议是dshot600 期望产生的效果是电平至少为560ns的高低电平 但是在实际测试的过程发现周期性的出现第一个脉冲会非
    发表于 03-11 06:11

    IGBT双脉冲测试过程中,第一个脉冲关断时候出现电压抬高的现象,导致炸管了 ,怎么办

    有没有大佬帮忙分析下,做双脉冲测试的时候,第一个脉冲在关断的时候,马上要关完了,结果驱动出现了震荡,导致管子立马又开了,然后电流激增,直接就炸管了,这是什么问题啊,图上是波形和驱动电路,求指导
    发表于 03-06 16:45

    ADS1274用DRDY+TDM输出模式下,读到的第一个字节是无效的,为什么?

    今天调试中发现问题,1274在用DRDY+TDM输出模式下,读到的第一个字节是无效的! 配置是4通道,在DRDY下降沿产生后,等待5us(采样率25K,即间隔40us)给出SPI
    发表于 01-08 08:17

    蓝桥杯的第一个项目,点亮LED

    第一节IO简介GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。每个GPIO内部都有这样的
    的头像 发表于 01-02 21:02 1099次阅读
    蓝桥杯的<b class='flag-5'>第一个</b>项目,点亮<b class='flag-5'>一</b><b class='flag-5'>个</b>LED

    ADS1299在DAISY-CHAIN模式下只能配置第一个AD吗,那后面几个都是要怎么配置寄存器,都和第一个样吗?

    DAISY-CHAIN模式下,每个AD能使用自己的内部时钟么?(不是SPI的SCLK),还是要必须第一个AD使用内部时钟,然后通过CLK口输送到其他剩余的AD的CLK口作为外部时钟使用。如果是这样的话,会有条高频
    发表于 12-20 06:47

    DAC8734只能把第一个接收到的数字数据输出,有哪些原因导致的呢?

    一个发送的数据时序没问题。但DAC8734只能把第一个接收到的数字数据输出,我用的是TI公司自己的DAC8734EVM。可能有哪些原因导致的呢?是上电顺序的原因吗?
    发表于 12-19 09:17