在上次說的直流電機調速的項目中,用了S52單片機的T2定時器產生PWM波信號,用于控制直流電機的轉速,雖然電機的平均速度與占空比不是嚴格的線性關系,但是在調節占空比可以明顯的看出電機轉速發生了改變,也算是滿足了課題的要求。下面復習一下PWM的知識吧。
PWM—脈沖寬度調制(Pulse Width Modulation),是一種周期一定而高低電平可調的方波信號。當輸出脈沖的頻率一定時,輸出脈沖的占空比越大,相對應的輸出有效電壓越大。PWM可以應用在許多方面,如電機調速、溫度控制、壓力控制等。
圖1 PWM波示意圖
如上圖所示T1為脈沖寬度(就是導通時間),周期為T,則輸出電壓的平均值為U=VCC*T1/T=a*VCC,a是占空比,變化范圍為0≤a≤1。VCC為電源電壓。
所以當電源電壓不變的情況下,輸出電壓的平均值U取決于占空比a的大小,改變a的大小就可以改變輸出電壓的平均值,這就是PWM的工作原理。采用T2定時器產生PWM脈沖極其精確,誤差只在幾個us。
上PWM程序
// 文件名: T2PWM.c
// 功能: 用T2定時器產生PWM波,頻率實調1khz
// 說明: 單片機AT89S52,晶振12MHZ;
// 日期: 2011年4月6日
#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
sbit PWM = P1^1;
uchar pluse; //占空比寄存器
void Timer2() interrupt 5
{
static uchar time;
TF2=0;
if(++time==pluse) PWM=0; //達到脈寬設定值時,輸出PWM低電平
else if(time==40) //PWM的頻率為1khz左右
{
time=0;
PWM=1;
}
}
void InitTimer2(void) //初始化函數
{
RCAP2H = 0xff ;//定時25us初值
RCAP2L = 0x0e7;//
ET2=1;
EA=1;
TR2=1;
}
void main(void)
{
InitTimer2();
while(1)
{
pluse=20;
}
}
我把PWM波的周期定為1ms,占空比分40級可調(即每級差2.5%),這樣定時器T2每25us產生一個定時中斷,每40次中斷后進入下一個PWM波的周期。在程序中,pluse=20,即占空比為50%,輸出的平均電壓為12*50%=6V。
PWM產生的過程是這樣的,開始時PWM為1,當計時到達pluse時(即到達了設定的脈寬寬度時間)PWM=0,隨后到達PWM周期時間后PWM=1,此時下一個PWM周期重新開始。為了便于理解,波形在定時中斷的產生時序示意圖如下所示。
圖2 PWM產生時序圖
這是用示波器截下的PWM波形圖,波形還不錯。