一、概述
为了实现对直流电机无极调速的需求,提出了一种基于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; //Asbit 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;elselinght3=1;if(key4==1)linght4=0;elselinght4=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++) ;}
}