单片机学习小组
直播中

陈超

7年用户 958经验值
私信 关注

如何使用Timer输出PWM信号?

如何使用timer输出PWM信号?

回帖(1)

张帆

2022-1-21 13:55:20
目的

单片机输出PWM信号是很常用的一种功能需求,STM32中通常使用Timer来输出PWM信号,这篇文章将对相关内容做个说明。
基础说明

在使用Timer输出PWM信号需要了解一些Timer的基础知识,可以查看 《使用HAL库开发STM32:Timer基础说明与定时功能使用》 这篇文章中的 Timer基础说明 章节。

PWM信号有几个参数,周期、脉宽、频率、占空比,其中最主要的是 周期脉宽 ,其它参数都可以通过这两个参数计算出来。在使用Timer输出PWM信号时PWM信号的周期就是Timer的计数周期时间,其相关内容可以参考上面链接的文章,这里只贴一下周期时间计算公式:
周期时间 = (Prescaler + 1) × (Period + 1) ÷ 时钟频率 单位:秒
确定单个信号的周期时间就能计算出频率了,计算公式如下:
频率 = 1 ÷ 周期时间 单位:赫兹
上面涉及的一些参数都是Timer本身的一些参数。对于STM32的单片机,很多Timer都可以输出多路PWM信号,每路PWM信号都有独立的参数可以设置其输出特征,最主要的参数就是 Pulse ,这个参数影响PWM信号的脉宽

上图是默认参数下计数器计数和PWM信号输出的对照图示,上面的几个参数选项说明如下:



  • Counter Mode 这个参数影响CNT的计数方式
  • PWM Mode 这个参数影响比较CNT和Pulse的比较方式
    mode=1时,当CNT < Pulse时,比较结果为1、反之为0,mode=2时差不多就是比较结果反一反;
  • CH Polarity 这个参数影响信号输出电平
    设置为High时,当比较结果为1时输出高电平,结果为0时输出低电平;设置为Low时则输出电平反一反;

知道脉宽和周期就可以计算占空比了,计算公式如下:
占空比 = 高电平时间 ÷ 周期
输出PWM信号

下面是最基础的PWM的使用:
下面图片看不清的话可以点击查看大图

上面演示中我使用了TIM4,在F405上它是在APB1总线上的,在上图中可以看到我的APB1给Timer的时钟频率为84MHz。上图中我设定Prescaler为83,即对时钟84分频,相当于给计数器的时钟为1MHz,每次计数时间为1us。上图中我设定Period为999,即每个计数周期为1000次计数,再根据时钟和Prescaler的设定,最终一个计数周期为1毫秒,频率为1KHz。
在使用STM32CubeIDE配置PWM生成代码后,我们只需要用下面方法就可以启动PWM输出:
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1); 如果想要停止PWM信号输出可以使用下面方法:
HAL_TIM_PWM_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); 如果想要在程序中动态的修改Pulse来调节占空比可以使用下面方法:
__HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__)
在默认配置下,如果Pulse设置为0,那么将恒定输出低电平;如果Pulse设置大于Period,那么将恒定输出高电平。
如果想要在程序中动态修改 周期/频率 ,其实就是修改Period,可以使用下面方法,建议在配置时使能AutoReloadPreload:
__HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__)
通常一个Timer可以输出多路PWM信号,每一路PWM信号可以设置不同的脉宽,但频率是相同的。
总结

使用Timer输出PWM信号只是在定时器的基础上增加一点点内容,使用起来也很简单,更多内容可以查看官方文档和例程。
举报

更多回帖

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