×
单片机 > 单片机程序设计 > 详情

基于单片机89C51产生PWM信号来控制直流电机调速程序

发布时间:2020-05-26 发布时间:
|
利用2051的T0产生双路PWM信号,推动L293D或L298N为直流电机调速,程序已通过调试。

/* =======直流电机的PWM速度控制程序======== */ 
/* 晶振采用11.0592M,产生的PWM的频率约为91Hz */

#include 
#include 
#define uchar unsigned char 
#define uint unsigned int 
sbit en1=P1^0; /* L298的Enable A */ 
sbit en2=P1^1; /* L298的Enable B */ 
sbit s1=P1^2; /* L298的Input 1 */ 
sbit s2=P1^3; /* L298的Input 2 */ 
sbit s3=P1^4; /* L298的Input 3 */ 
sbit s4=P1^5; /* L298的Input 4 */ 
uchar t=0; /* 中断计数器 */ 
uchar m1=0; /* 电机1速度值 */ 
uchar m2=0; /* 电机2速度值 */ 
uchar tmp1,tmp2; /* 电机当前速度值 */

/* 电机控制函数 index-电机号(1,2); speed-电机速度(-100~100) */ 
void motor(uchar index, char speed) 

if(speed>=-100 && speed<=100) 

if(index==1) /* 电机1的处理 */ 

m1=abs(speed); /* 取速度的绝对值 */ 
if(speed<0) /* 速度值为负则反转 */ 

s1=0; 
s2=1; 

else /* 不为负数则正转 */ 

s1=1; 
s2=0; 


if(index==2) /* 电机2的处理 */ 

m2=abs(speed); /* 电机2的速度控制 */ 
if(speed<0) /* 电机2的方向控制 */ 

s3=0; 
s4=1; 

else 

s3=1; 
s4=0; 



}

void delay(uint j)        /* 延时函数 */ 

for(j;j>0;j--); 
}

void main() 

uchar i; 
TMOD=0x02;            /* 设定T0的工作模式为2 */ 
TH0=0x9B;            /* 装入定时器的初值 */ 
TL0=0x9B; 
EA=1; /* 开中断 */ 
ET0=1; /* 定时器0允许中断 */ 
TR0=1; /* 启动定时器0 */ 
while(1) /* 电机实际控制演示 */ 

for(i=0;i<=100;i++) /* 正转加速 */ 

motor(1,i); 
motor(2,i); 
delay(5000); 

for(i=100;i>0;i--)     /* 正转减速 */ 

motor(1,i); 
motor(2,i); 
delay(5000); 

for(i=0;i<=100;i++)     /* 反转加速 */ 

motor(1,-i); 
motor(2,-i); 
delay(5000); 

for(i=100;i>0;i--)     /* 反转减速 */ 

motor(1,-i); 
motor(2,-i); 
delay(5000); 


}

void timer0() interrupt 1       /* T0中断服务程序 */ 

if(t==0)                                /* 1个PWM周期完成后才会接受新数值 */ 

tmp1=m1; 
tmp2=m2; 

if(t if(t t++; 
if(t>=100) t=0;                 /* 1个PWM信号由100次中断产生 */ 
}

 
关键字:单片机  89C51  PWM信号  直流电机  调速程序

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计