【STM32+cubemx】0012 HAL库开发:定时器的PWM输出
本节我们介绍stm32定时器的PWM输出。
1)PWM基础知识
PWM的全称是Pulse Width Modulation,即脉冲宽度调制。它是数字信号,只有0、1两种状态,它通过一个周期中0、1所占不同的时间比例,来等效模拟信号。
假设一个数字信号源的高电平为5V、低电平为0V,如果我们在一个周期中的一半时间输出0V、另一半时间输出5V,只要信号的频率足够快,那么在外系统看来,一个整周期中电压所起的作用就相当于2.5V;同理,只要改变高低电平的时间占比,就能等效出0~5V间的任意电压。
如果要等效一个正弦波,可以如下输出PWM波形:
只要PWM的频率足够高,占空比可以分得足够细,那么理论上它可以等效出任意模拟电压波形。
在数字电路中PWM可以用很少的器件等效出模拟信号的功能,而不用配置复杂的DAC芯片,所以应用十分广泛。它可以用于LED灯调节亮度、电动调节转速、加热器调节温度等等场合。
2)stm32的PWM使用
我们在最基本的定时器工程上修改,得到PWM的工程,如下图所示:
选择channal 1输出PWM,此时可以看到右侧的芯片引脚PA6自动设置成为定时器的CH1输出;
设置定时器分频系数为720-1,即主时钟的720分之一,分频为100kHz;
Counter Mode设置的是计数方式,有向上、向下、中心对称计数等几种方式;
计数周期设置为1000-1,即计数从0~999,由于计数频率为100kHz,所以这里设置的是一个周期为10ms;
PWM的MODE可以设为1或2,二者输出的波形是反相的,这里设置为1,即先高电平,计数值到后变为低电平;
Pulse的值设定的是脉冲宽度,这里设为100,即计数到100时翻转输出,所以占空比为100/1000,结果为10%;
生成工程代码,在keil中打开。在main函数之前,加入启动PWM功能的代码:
编译、下载,运行。
此时可以用示波器监测PA6引脚上的波形,可以看到周期为10ms,占空比为10%的方波:
3)stm32的PWM特点
这里把stm32定时器的PWM和它的输出比较功能比较一下:
PWM功能可以输出频率、占空比可调的方波,在计数溢出和计数比较相等时输出都会翻转,如下图所示:
而输出比较功能,只能输出50%占空比的方波,定时器的周期即为方波周期,输出只在计数比较相等时翻转,计数溢出时不翻转;它可以设置输出方波的相位:
如果熟悉AVR单片机的朋友可能会有些疑惑,AVR的输出比较功能产生的波形,其频率和占空比都是可调的,与stm32的输出比较功能不同。实际上AVR单片机的输出比较功能等同于stm32的PWM功能,这里要注意一下,不同厂家的芯片对该功能的命名有点不同。
本节讲的PWM使用只是最简单的实现,stm32的PWM还有很多更强大的功能值得探索。
欢迎关注我的公众号,可留言“资料”获取相关资料和软件: