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

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

3天内不再提示

利用STM32高精度定时器实现PWM输出的实现原理

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

很多STM32系列的MCU内置高精度定时器,比方STM32F334、STM32G4、STM32H7等系列。利用高精度定时器实现PWM输出应该说是最基本的功能了。不过,在实际应用中,常有人觉得无法实现duty=0或duty=100%的PWM输出情形。这里以STM32F334的HRTIM为例,简单介绍下利用它实现PWM输出的实现原理。

STM32F334的HRTIM的功能框图如下,由一个MASTER定时器和ABCDE五个定时器单元组成。其中ABCDE五个定时器单元各可以产生2路输出信号,并支持互补输出。

先看看跟HRTIM有关的时钟。别的系列有支持向上、向下计数模式的。

在利用HRTIM中的定时器单元实现PWM输出时,基于不同的分频系数对应着不同的分辨率和最低频率。如下表所示:【截图来自STM32F334的参考手册】

显然,不同分频比对应不同的计数时钟fHRCK,根据计数时钟结合16位的计数宽度可求出最长计数时间,亦即最小的PWM输出频率。

但对于高精度定时器HRTIM,由于其自身特定机制的原因,在实现PWM功能时,设计比较值和计数周期值时需遵循下面两个原则:【注意是FHRTIM时钟单位,即未被倍频的时钟,这里就是那个144Mhz时钟】

1、 最小值必须不小于3个fHRTIM时钟单位;

2、最大值不得大于0xFFFE个fHRTIM时钟单位;

刚才上面说了,HRTIM里面的定时器单元所用的计数时钟是fHRTIM先经过倍频后再经过分频器而来的,那么结合上面的两个原则,不同分频比条件下可以设定的计数周期或比较值的范围就对应到如下表格:

上面表格就是定时器单元不同分频比时可以设置的计数周期值或用于比较的比较寄存器的值的范围。比方我们以上面TABLE82中的CKPSC=3时来看看。CKPSC=3,从上面Table81可以得知此时的计数时钟为源时钟倍频后的8分频,我们在设计PWM计数周期值或比较值时就要求在0x00c~~0xFFFB范围内配置。鉴于此,有人就得出没法实现PWM输出的0占空比或100%占空比的结论,其实这是误解。

假设此时我们所需要的PWM周期值刚好0xff00.那么比较寄存器CMP的值就可以在0x000c~~0xff00任意设置并能实现有效、可靠比较,显然,CMP值不要小于0x000c这个起点值【实际上Table82中的Min值都是对应着3个fHRTIM源时钟单位,因不同分频比而呈现不同数据而已】,那这不是说PWM输出不能实现0占空比的情况吗?非也!

对于HRTIM的输出,通常是根据计数器的值与比较寄存器的值发生相等匹配事件时进行SET【置1】或RESET【清零】输出。【用过STM32常规定时器的人这里可能会感受到一些差异。】

比方如上图所示,在发生比较事件时做RESET输出,发生PER周期性事件时做SET输出。

显然,当我们不断增加CMP的值,占空比也会相应增大。当CMP的值增加到刚好等于PER的值时,则输出RESET。因为此时CMP比较事件、PER周期性事件在同一时间点发生,会涉及到事件竞争的仲裁问题。由于比较事件响应优先级高于周期性事件的,所以此时的输出按比较事件来定,这里输出RESET,此时也刚好对应着Duty=0的情形。两个事件总是同时发生,而PER事件竞争不过CMP事件,输出只好由CMP事件说了算。

按照这种配置,那又如何实现Duty=100%的输出呢?

很简单,当我们将CMP的值设置成任意被PER还大的值时,就始终输出SET信号了。因为此时CMP永远不会等于PER,即不会发生有效比较匹配事件,无有效比较事件则不会有RESET的输出,输出始终由PER事件掌控。

在基于HRTIM做PWM输出时,弄清了原理后就知道如何灵活编写代码了。上面只是大致做了PWM输出的原理介绍,更多细节还是得细看手册,比方上面提到的定时器事件及事件响应竞争时的仲裁。

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

    关注

    114

    文章

    5156

    浏览量

    213463
  • STM32
    +关注

    关注

    2266

    文章

    10877

    浏览量

    354955
  • 定时器
    +关注

    关注

    23

    文章

    3242

    浏览量

    114521

原文标题:STM32高精度定时器PWM输出话题

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

收藏 人收藏

    评论

    相关推荐

    如何在MSP430™上实现内置振荡高精度定时器

    电子发烧友网站提供《如何在MSP430™上实现内置振荡高精度定时器.pdf》资料免费下载
    发表于 09-14 11:10 0次下载
    如何在MSP430™上<b class='flag-5'>实现</b>内置振荡<b class='flag-5'>器</b>的<b class='flag-5'>高精度</b><b class='flag-5'>定时器</b>

    定时器的工作方式介绍

    实现周期性事件的硬件模块。它可以用于实现各种定时任务,如定时中断、PWM(脉冲宽度调制)输出
    的头像 发表于 07-12 10:29 756次阅读

    STM32G4系列芯片定时器的延时输出问题

    有人使用STM32G4系列芯片内部的多个定时器PWM输出输出频率一样,占空比也一样,均为50%。可是,当他中途调整各个
    的头像 发表于 07-01 09:45 1465次阅读
    <b class='flag-5'>STM32</b>G4系列芯片<b class='flag-5'>定时器</b>的延时<b class='flag-5'>输出</b>问题

    STM8L052定时器1同时输出3路PWM,想让其中的两路PWM输出频率跟另外一个不同,可以实现吗?

    STM8L052的定时器1同时输出3路PWM但是想让其中的两路PWM输出频率跟另外一个不同,请问 可以
    发表于 05-13 09:06

    如何实现一个软件定时器

    在Linux,uC/OS,FreeRTOS等操作系统中,都带有软件定时器,原理大同小异。典型的实现方法是:通过一个硬件定时器产生固定的时钟节拍,每次硬件定时器中断到,就对一个全局的时间
    的头像 发表于 04-29 11:00 594次阅读

    求助,关于STM32高精度定时器应用问题求解

    最近使用STM32的高级定时器,想要实现无缝移相效果,尝试了各种方式,均无法正常移相,原厂也没有找到这方面的资料,不知道是否能实现这样的功能 我的测试分为左移相和右移相 第1次测试:左
    发表于 04-10 07:42

    如何用STM32定时器实现一个周期输出PWM2的波形?

    请教各位如何用STM32定时器实现一个周期输出PWM2的波形呢(低-高-低-高-低)?万分感谢您的解答!
    发表于 04-03 06:39

    STM32F407的定时器9和10怎么设置为主从关系?

    中关闭主定时器PWM输出,达到精确的位移控制的目的,这样只用进一次中断,而不用每次进中断里进行计数。 我用通用定时器2-5可以实现; 但是
    发表于 03-28 06:02

    STM32G030定时器16 17和1同步输出如何实现

    STM32G030系列中只有定时器1 16和17三个定时器可以输出带死区时间互补pwm,我想实现
    发表于 03-27 06:45

    STM32同一定时器PWM输出定时,会影响我的PWM输出吗?

    求助各位大佬 ,我用定时器2通道1输出PWM 定时器设置为TIM2_PERIODE (1000-1) TIM2_PRESCALER 36,现在还想开启2的中断用
    发表于 03-26 07:23

    如果STM32定时器外接了正交编码,该剩余通道是否能做PWM输出呢?

    其实,对于STM32芯片,编码输入信号就是定时器的计数时钟源之一。定时器外接了编码输入,若还有剩余通道的话,剩余通道依然可以实现输入捕获或输出
    的头像 发表于 03-21 09:06 1453次阅读
    如果<b class='flag-5'>STM32</b><b class='flag-5'>定时器</b>外接了正交编码<b class='flag-5'>器</b>,该剩余通道是否能做<b class='flag-5'>PWM</b><b class='flag-5'>输出</b>呢?

    STM32G030C8T6要输出8~12路PWM,每个定时器可以输出4路,那如何让两个定时器输出PWM同步呢?

    STM32G030C8T6要输出8~12路PWM,每个定时器可以输出4路,那如何让两个定时器
    发表于 03-08 08:19

    利用AD8210和AD8274实现高电压、 高精度电流检测和输出电平转换

    利用AD8210和AD8274实现高电压、 高精度电流检测和输出电平转换
    的头像 发表于 01-04 10:56 1140次阅读
    <b class='flag-5'>利用</b>AD8210和AD8274<b class='flag-5'>实现</b>高电压、 <b class='flag-5'>高精度</b>电流检测和<b class='flag-5'>输出</b>电平转换

    STM32定时器时间计算方法

    STM32微控制定时器模块在嵌入式系统中非常常见,它被用于产生精确的时间延迟,或者用于实时时钟(RTC)等功能。为了充分利用STM32
    的头像 发表于 12-19 11:31 1.1w次阅读

    基于STM32CUBEMX驱动低压步进电机驱动STSPIN220(3)----定时器中断产生指定数量脉冲

    在步进电机控制过程中,为了实现精确的位置和速度控制,经常需要输出指定数量的脉冲。这就需要使用定时器功能来生成PWM脉冲信号。本文将详细介绍如何利用
    的头像 发表于 12-01 15:26 1173次阅读
    基于<b class='flag-5'>STM32</b>CUBEMX驱动低压步进<b class='flag-5'>器</b>电机驱动<b class='flag-5'>器</b>STSPIN220(3)----<b class='flag-5'>定时器</b>中断产生指定数量脉冲