PWM 详解
Table of Contents
1 什么是PWM
1.1 定义
脉冲宽度调制(英语:Pulse Width Modulation,缩写:PWM),简称脉宽调制,是将模拟信号变换为脉冲的一种技术,一般变换后脉冲的周期固定,但脉冲的占空比会依模拟信号的大小而改变。直白地说,即占空比可调的一个波。
模拟信号的值可以连续变化,其时间和幅度的分辨率都没有限制。但模拟电路容易随时间漂移而难以调节,易严重发热且对噪声敏感。而用数字方式控制模拟电路可以大幅度降低系统的成本和功耗。
PWM技术是一种对模拟信号电平的数字编码方法,通过使用高分辨率计数器(调制频率)调制方波的占空比,从而实现对一个模拟信号的电平进行编码。其最大的优点是从处理器到被控对象之间的所有信号都是数字形式的,无需再进行数模转换过程;而且对噪声的抗干扰能力也大大增强(噪声只有在强到足以将逻辑值改变时,才可能对数字信号产生实质的影响),这也是PWM在通讯等信号传输行业得到大量应用的主要原因。1
1.2 占空比
在一串理想的脉冲序列中(如方波),代表1的正脉冲的持续时间与脉冲总周期的比值。 例如:脉冲宽度1μs,信号周期4μs的脉冲序列占空比为0.25。
PWM波的高电平通过的时候,有打开/激励的作用,而低电平通过的时候有关断的作用。当PWM波的频率较高时,看不出明显的开关变化,控制比较平滑。2
1.2.1 两个概念
- 同频率占空比:频率(周期)相同,占空比(脉宽)不同。
- 占空比相同,频率不同。
2 PWM 在各单片机中的具体使用
2.1 51 单片机
2.1.2 STC15F2K60S24
- 原理
STC15系列的单片机提供了两类形式的PWM产生方法:一类是利用内部可编程计数阵列,即软件模拟。一类是内部PWM发生器来产生,即硬件模拟。
PCA模块n工作于8位PWM模式时,将{0,CL[7:0]}与捕获寄存器{EPCnL,CCAPnL[7:0]}进行比较,如图所示。CL 一开始为0,PCA计数开始后逐渐加1,当{0,CL[7:0]}的值小于{EPCnL,CCAPnL[7:0]}时,输出为低,否则输出为高。当CL的值由FF变为00溢出时,{EPCnH,CCAPnH[7:0]}的内容装载到{EPCnL,CCAPnL[7:0]}中。从而实现无干扰地更新PWM。
Table 1: I/O口作为PWM输出时的状态表 常态I/O口的状态 作为PWM输出时的状态 弱上拉/准双向 强推挽输出/强上拉输出(需加限流电阻 1K~10K) 强推挽输出/强上拉输出 强推挽输出/强上拉输出(需加限流电阻 1K~10K) 仅为输入/高组态 PWM 无效 开漏 开漏 - 硬件模拟代码示例
当CCAP0L=20H时,CL从0到1FH小于CCAP0L输出低电平,否则输出高电平。
更新占空比数据:
2.2 STM325
2.2.1 原理
STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定 时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4 路的 PWM 输出,这样, STM32 最多可以同时产生 30 路 PWM 输出。
STM32通用定时器TIMx产生PWM需要:捕获 /比较模式寄存器( TIMxCCMR1/2)、捕获/比较使能寄存器( TIMxCCER)、捕获/比较寄存器( TIMxCCR1~4)。
捕获/比较模式寄存器( TIMxCCMR1/2),该寄存器总共有 2 个, TIMx _CCMR1 和 TIMx _CCMR2。 TIMxCCMR1 控制 CH1 和 2,而 TIMxCCMR1 控制 CH3 和 4。
捕获/比较使能寄存器( TIMxCCER)控制着各个输入输出通道的开关。
捕获/比较寄存器( TIMxCCR1~4),该寄存器总共有 4 个,对应 4 个输通道 CH1~4。在输出模式下,该寄存器的值与 CNT 的值比较,根据比较结果产生相应动作。利用这点, 我们通过修改这个寄存器的值,就可以控制 PWM 的输出脉宽了。
2.2.2 代码例程(库函数版)
2.3 MSP
2.3.1 原理
以MSP430F5310中的TimerA0为例,在TimerA0寄存器中,除了TA0CCR0用于设置PWM波的周期外,还有TA0CCR1~TA0CCR4这4个设置PWM波通道输出信号占空比用的寄存器。这些寄存器所控制的PWM输出通道通常是某个引脚的第二功能。为调节占空比,每个寄存器可以设置从0~TA0CCR0的数值。这样,随着TAxR的计数,TA0CCRn也在不断地和TA0CCR0比较,最终,PWM通道引脚根据输出设置决定输出波形的形式。
如:设定输出模式为“等于TAxCCR0时输出高,小于时输出低”,定时器计数模式为增计数模式。在定时器开始工作时,可认为TA0R,TA0CCR0,TA0CCRn 都是从0开始增加,并且增加的频率都是定时器的时钟频率。因此在最初的一段时间,这三个寄存器的值相等。根据设置,TA0CCRn=TA0CCR0,输出高电平。当上述三个数据达到TA0CCRn时,可认为TA0CCRn不再增加,而另两个值继续增加。此时,TA0CCR0>TA0CCRn,输出低电平。而当TA0R增加到TA0CCRn设置的数值时则溢出,重新开始计时,完成了一个PWM波的输出周期。
因此我们可以通过设置TA0CCRn的大小来控制占空比,它越大,占空比越大。
计算依据:
定时器数X个数所用的时间=PWM波的周期
由于定时器TAxR中的计数值是不断周期性变化的,因此这个变化周期就是输出的PWM波的周期。