一、概述
为了实现对直流电机无极调速的需求,提出了一种基于STC 89C52微控制器的直流PWM可调速系统设计方案。根据系统所需达到的控制目的,UL2003驱动芯片作为电动机驱动电路,实现对电机的驱动。控制算法采用经典PWM脉宽调制算法作为控制策略。经过设计电路、接线和实验制作,表明无线对电机调速具有控制灵活,操作简便的特点,达到了设计要求。
二、设计要求
1).两个无线遥控按键分别实现增加,减少电机速度的功能
2).UL2003芯片驱动直流电机;
3).两个二级管指示灯指示电机增速和减速;
4).2262无线发送模块和2272无线接收模块实现无线通信。
三、PWM控制原理
(1)占空比:即输出的PWM中,高电平保持的时间与该PWM的时钟周期的时间之比。
如一个PWM的频率是1000HZ,高电平时间是200us,则它的周期是1/1000S=1ms,占空比是200us/1000us=20%。
(2)分辨率:占空比最小能达到的值,如8位的PWM,理论的分辨率就是1/256;16位的PWM,理论的分辨率就是1/65536。
四、电路方案设计
电路原理图借用开发板电路图为载体,电路图如下:
电路图如以上所示,其中,驱动电路使用DC MOTOR一路电路,在实验时,将P00排针短接即接通直流电机驱动电路,输入驱动信号---低电平0,则直流电机转动。
无线模块的连接电路更正:D---D0---P2.4,C---D1---P2.2,B---D2---P2.1,A---D3---P2.0;(P2.3连接有蜂鸣器故没有使用)。这个连接是自定义的,可以自己定义无线模块端口与单片机IO口相连即可。
五、程序代码
#include<reg52.h>
#include<intrins.h>
sbit key1=P2^4; //D
sbit key2=P2^2; //C
sbit key3=P2^1; //B
sbit key4=P2^0; //A
sbit linght1=P1^3;
sbit linght2=P1^2;
sbit linght3=P1^1;
sbit linght4=P1^0;
sbit BEEP =P2^3 ; //蜂鸣器
unsigned char PWM=0x03 ; //赋初值
///
sbit dula=P2^6; //数码管的段选信号
sbit wela=P2^7; //数码管的位选信号
void delay1 (void) //关闭数码管延时程序
{
int k;
for (k=0; k<1000; k++);
}
//
void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);
void main()
{
P1=0xff;
TMOD=0x00 ;
TH0=0x00 ; //延时常数
TL0=0x00 ; //频率调节
TH1=PWM ; //脉宽调节
TL1=0xff ;
EA=1;
ET0=1;
ET1=1;
TR0=1 ;
/
P0=0x00;//关掉数码管的信号。阻止数码管受到P0口信号的影响。
dula=1;
wela=0;
delay1();
dula=0;
wela=0;
delay1();
while(1)
{
do{
if(PWM!=0xff)
{PWM++ ;linght1=0;delayms(10);} //A按下,PWM增大,定时器初值变大,高电平时间变小,占空比减小,电机速度增大,
else
Beep() ;
linght1=1;
}
while(key1==1) ;
do{
if(PWM!=0x02)
{PWM-- ;linght2=0;delayms(10);} //B按下,PWM减小,初值变小,高电平时间变大,电机速度变小
else
Beep() ;
linght2=1;
}
while(key2==1) ;
if(key3==1)
linght3=0;
else
linght3=1;
if(key4==1)
linght4=0;
else
linght4=1;
}
}
// 定时器0中断服务程序 (频率)
void timer0() interrupt 1
{
TR1=0 ;
TH0=0x00;
TL0=0x00 ;
TH1=PWM ;
TR1=1 ;
P0=0x00 ; //启动输出
}
// 定时器1中断服务程序 (脉宽)
void timer1() interrupt 3
{
TR1=0 ;
P0=0xff ; //结束输出
}
//蜂鸣器子程序
void Beep()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
delay(100) ;
BEEP=1 ; //Beep取反
}
BEEP=1 ; //关闭蜂鸣器
delayms(100);
}
// 延时子程序
void delay(unsigned char t)
{
while(t--) ;
}
// 延时子程序
void delayms(unsigned char ms)
{
unsigned char i ;
while(ms--)
{
for(i = 0 ; i < 120 ; i++) ;
}
}