目的

单片机输出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信号只是在定时器的基础上增加一点点内容,使用起来也很简单,更多内容可以查看官方文档和例程。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐