STM32 嵌入式学习入门(4)——PWM原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FelikZhang/article/details/79237573

STM32 嵌入式学习入门(4)——PWM原理


本文先对STM32F103的通用定时器作一简单介绍,然后详细介绍通用定时器的一个应用——输出PWM波形的原理。整个文章以介绍“怎么用”为主,对于通用定时器以及PWM相关的理论和概念只是点到为止。对于具体的用STM32输出PWM波,写好了会把链接放过来。


一、STM32F103通用定时器简介:

通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成的定时器。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM)。使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作。


STM32 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能特点包括:
  ①位于低速的APB1总线上(APB1)
  ②16 位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)。
  ③16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数 为 1~65535 之间的任意数值。
  ④4 个独立通道(TIMx_CH1~4),这些通道可以用来作为: 
  输入捕获 
  输出比较
  PWM 生成(边缘或中间对齐模式) 
  单脉冲模式输出 
⑤可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。

如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器): 
①更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) 
②触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) 
③输入捕获 
④输出比较 
⑤支持针对定位的增量(正交)编码器和霍尔传感器电路 
⑥触发输入作为外部时钟或者按周期的电流管理
STM32 的通用定时器可以被用于测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。   
使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。



二、PWM原理:

(一)PWM简介:

PWM是英文“Pulse Width Modulation” 的缩写,中文名称为:脉冲宽度调,简称脉宽调制。

脉冲是指短时间内出现电压或电流的突然变化,脉冲宽度指的是脉冲持续的时间,即高电平或低电平持续的时间。脉冲宽度调制就是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点来说,就是对脉冲宽度的控制。就是说在一周期内(每个周期的时间都是相等的),脉冲可能全部表现为高电平,也可能全部表现为低电平,也可能在一个周期的一部分时间内表现为高电平,剩余部分时间表现为低电平。

PWM的作用:脉冲宽度调制要做的就是控制一个周期内高电平(或低电平)持续的时间。举个例子:

PWM控制电机转速:我们要控制电机的转速,可以有这么两个思路,一个思路是改变电机两端的电压值,让电机的转速发生变化。这个想法有很大的缺陷,实现起来也不好实现。第二个思路是PWM电机调速法。通俗点可以这么解释这个事情:比方说一个额定电压3.3V的电机,以1秒为一个时间周期。第一个周期内,我给电机通电1秒钟(通电电压大小3.3V),也就是说这1秒内所有时间电机应当都是全速转动的。第二个周期内,给电机通电0.5秒钟(通电电压大小仍为3.3V),剩余0.5秒电机两端电压为0,这样的话,这个周期内电机只有一半的时间在全速转动,另一半时间电机靠惯性在转动。显而易见,上述两个过程电机的转速是不同的,这就是PWM调速的原理:在一个周期内,高低电平持续的时间是可变的,通过改变在一个周期内高电平所占整个周期的时间的长短去控制电机的转速。这里有一个专有名词——占空比(占空比:占空比是指在一个脉冲循环内,通电时间相对于总时间所占的比例)。

再举一个LED灯的例子。我们经常能看到一些灯由全灭的状态逐渐变亮,然后达到最亮,再慢慢变灭的过程,最典型的就是有些手机的消息提示的那个灯,或者有些霓虹灯也有这种效果。我不知道这些例子具体到底是不是通过PWM实现的,但是这些效果都可以通过PWM去实现。比方还是以1秒为一个周期,第一个周期中,整个一秒钟时间内灯两端的电压为0,下一个周期中,前0.1秒灯两端电压为灯正常工作时的电压,后0.9秒灯两端电压为0……通电时间增加到1秒时灯最亮,然后通电时间再以一个周期0.1秒的值递减,直到减为0,有慢慢增加,以此类推,就能实现上述的灯渐亮渐灭的过程。

注:这里要注意的是我为了举例子方便说周期为1秒,但实际上要实现这些效果,周期非常小,可能只有0.1秒甚至更小。

通过上面的介绍和两个例子相信大家对PWM这个东西应该有所了解了,也就不难理解PWM是通用定时器的一个应用这件事情了。这里再强调一下,PWM改变的是占空比,是高电平在一个周期内周期总时间的长度。而不是改变电压的值,不要搞错了。我就碰到过有同学把这个搞混了。

(二)PWM原理


上面这张图能很清楚地解释清楚PWM的工作过程,这里要介绍两个寄存器:自动重装载寄存器(ARR)、捕获比较寄存器(CCRx)。

自动重装载寄存器(TIMx_ARR):



捕获比较寄存器(TIMx_CCR1):


PWM的工作过程如下:首先ARR寄存器里面的值确定了一个PWM周期,就是我们上面举的那两个例子中的“1秒”(注意这个周期是在PWM系统初始化的时候写入ARR寄存器的,写入以后一般就不再改动了)。然后CCR寄存器里面的值是PWM工作过程中确定的,它可以为一个定值,也可以是一个变化的值。

当它是一个定值时(就像图片里的那样),占空比就是一个定值,如果放到上面那个LED灯的例子,那么实验现象就不是灯会渐亮渐灭,而是始终维持一个比较暗的亮度,如果CCR里面的值设定得越靠近ARR寄存器里面的值(只是靠近,但不大于),那么按照图上来看,就是每个周期内高电平持续的时间越短,至于灯到底是更亮了还是更暗了就得实际情况具体分析了。

当它是一个变化的值的时候,在程序里就可以设置一个变量,让这个变量按照一定规律递增(或递减)。然后把这个值写入到CCR寄存器中,这样每个周期中PWM的占空比就是不同的。宏观上,就能看到上面的LED灯的渐亮渐灭的过程。


相关的概念和基本原理介绍完了,下面就是一些细节和代码的实现了,下篇文章会写到这些内容。

猜你喜欢

转载自blog.csdn.net/FelikZhang/article/details/79237573