PWM(Pulse Width Modulation)控制就是对脉冲宽度进行控制的技术。
所以当电源电压不变的情况下,输出电压的平均值U取决于占空比α的大小,改变α的大小就可以改变输出电压的平均值,这就是PWM的工作原理。
#include "reg51.h"
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;//按键
sbit outa=P2^0;
sbit outb=P2^1;//电机驱动
void delayms(unsigned int ms);
unsigned char keyscanf();
void pwmc(unsigned char keytp);//子函数的声明
static unsigned int cnt=0;
/****************************
*
****************************/
void main()
{
unsigned char key_v=0;
while(1)
{
key_v=keyscanf();
pwmc(key_v);
}
}
/****************************
*
****************************/
void delayms(unsigned int ms)
{
char i=0;
char j=0;
for(i=0;i<ms;i++)
{
for(j=0;j<125;j++);
}
}
/****************************
****************************/
unsigned char keyscanf()
{
unsigned char keyv=0;
key1=0;
key2=1;
if(key3==0)
{
delayms(4);
if(key3==0)
{
keyv=1;
}
}
if(key4==0)
{
delayms(4);
if(key4==0)
{
keyv=2;
}
}
key1=1;
key2=0;
if(key3==0)
{
delayms(4);
if(key3==0)
{
keyv=3;
}
}
if(key4==0)
{
delayms(4);
if(key4==0)
{
keyv=4;
}
}
return keyv;
}
/****************************
****************************/
void pwmc(unsigned char keytp)
{
unsigned char a=0;
a=keytp;
if(a==1){ //当参数为0时表示关掉电机
outa=0;
outb=0;
}
if(a==2){ //当参数是1则开始PWM,2:5的占空比
outa= 1; //输出A为高电平(电机使能)
delayms(1); //高电平长度:延时2MS
outa = 0; //输出A为低电平(电机失能)
delayms(9);//低电平长度:延时总PWM长度5MS减去2MS
}
if(a==3){ //当参数是2则开始PWM,3:5的占空比
outa = 1; //输出A为高电平(电机使能)
delayms(5); //高电平长度:延时3MS
outa = 0; //输出A为低电平(电机失能)
delayms(2);//低电平长度:延时总PWM长度5MS减去3MS
}
if(a==4){ //当参数为3时表示全速,这时停止PWM,将OUTA置高电平
outa=1; //将OUTA置高电平
outb=0;
}
}
图一 代码图
图二 仿真图