PWM直流电机调速单片机程序.docx
《PWM直流电机调速单片机程序.docx》由会员分享,可在线阅读,更多相关《PWM直流电机调速单片机程序.docx(16页珍藏版)》请在冰豆网上搜索。
PWM直流电机调速单片机程序
*******************************************************************/
/*程序名:
PWM直流电机调速*/
/*晶振:
11.00592MHzCPU型号:
AT89C51*/
/*直流电机的PWM波控制,可以直接的调速从0到20级的调速*/
/*****************************************************************/
#include
#defineTH0_TL0(65536-1000)//设定中断的间隔时长
unsignedcharcount0=50;//低电平的占空比
unsignedcharcount1=0;//高电平的占空比
bitFlag=1;//电机正反转标志位,1正转,0反转
sbitKey_add=P2^0;//电机减速
sbitKey_dec=P2^1;//电机加速
sbitKey_turn=P2^2;//电机换向
sbitPWM1=P2^6;//PWM通道1,反转脉冲
sbitPWM2=P2^7;//PWM通道2,正转脉冲
unsignedcharTime_delay;
/************函数声明**************/
voidDelay(unsignedcharx);
voidMotor_speed_high(void);
voidMotor_speed_low(void);
voidMotor_turn(void);
voidTimer0_init(void);
/****************延时处理**********************/
voidDelay(unsignedcharx)
{
Time_delay=x;
while(Time_delay!
=0);//等待中断,可减少PWM输出时间间隔
}
/*******按键处理加pwm占空比,电机加速**********/
voidMotor_speed_high(void)//
{
if(Key_add==0)
{
Delay(10);
if(Key_add==0)
{
count0+=5;
if(count0>=100)
{
count0=100;
}
}
while(!
Key_add);//等待键松开
}
}
/******按键处理减pwm占空比,电机减速*****/
voidMotor_speed_low(void)
{
if(Key_dec==0)
{
Delay(10);
if(Key_dec==0)
{
count0-=5;
if(count0<=0)
{
count0=0;
}
}
while(!
Key_dec);
}
}
/************电机正反向控制**************/
voidMotor_turn(void)
{
if(Key_turn==0)
{
Delay(10);
if(Key_turn==0)
{
Flag=~Flag;
}
while(!
Key_turn);
}
}
/***********定时器0初始化***********/
voidTimer0_init(void)
{
TMOD=0x01;//定时器0工作于方式1
TH0=TH0_TL0/256;
TL0=TH0_TL0%256;
TR0=1;
ET0=1;
EA=1;
}
/*********主函数********************/
voidmain(void)
{
Timer0_init();
while
(1)
{
Motor_turn();
Motor_speed_high();
Motor_speed_low();
}
}
/**************定时0中断处理******************/
voidTimer0_int(void)interrupt1using1
{
TR0=0;//设置定时器初值期间,关闭定时器
TL0=TH0_TL0%256;
TH0=TH0_TL0/256;//定时器装初值
TR0=1;
if(Time_delay!
=0)//延时函数用
{
Time_delay--;
}
if(Flag==1)//电机正转
{
PWM1=0;
if(++count1 {
PWM2=1;
}
else
PWM2=0;
if(count1>=100)
{
count1=0;
}
}
else//电机反转
{
PWM2=0;
if(++count1 {
PWM1=1;
}
else
PWM1=0;
if(count1>=100)
{
count1=0;
}
}
}
//-----------------------------------------------------------------------------
#include//SFRdeclarations
#include
//FunctionPrototypes
//-----------------------------------------------------------------------------
#defineCMD_RESET0xA4//HD7279复位
#defineDECODE10xc8//方式0译码
sbitcs=P1^3;
sbitclk=P1^2;
sbitdat=P1^1;
sbitkey=P1^0;
sbitled_D1003=P0^7;
sbitsw1=P1^7;
sbitsw2=P1^6;
sbitsw3=P1^5;
sbitsw4=P1^4;
voidlong_delay(void);//延时函数
voidshort_delay(void);
voiddelay10ms(unsignedchar);
voidwrite7279(unsignedchar,unsignedchar);//HD7279写指令
voidsend_byte(unsignedchar);
voiddelay(unsignedchar);
voiddisp1(unsignedint);
voidOSCILLATOR_Init(void);
voidPORT_Init(void);
voidPCA0_Init(void);
voidTimer0_Init(void);
voidExt_Interrupt_Init(void);
//-----------------------------------------------------------------------------
//GlobalVariables
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//main()Routine
//-----------------------------------------------------------------------------
unsignedintCEX0_Compare_Value;//HoldscurrentPCAcomparevalue
unsignedinttmr,Speed_evaluate;
unsignedcharnum,num1,num2,num3,a;
unsignedintSpeed,pi,Speed2;
unsignedintSpeed1[10];
typedefstruct{
doubleSetPoint;/*设定目标DesiredValue*/
doubleProportion;/*比例常数ProportionalConst*/
doubleIntegral;/*积分常数IntegralConst*/
doubleDerivative;/*微分常数DerivativeConst*/
doubleLastError;/*前一项误差*/
doublePrevError;/*前第二项误差*/
doubleSumError;/*误差和*/
}PID;
doublePIDCalc(PID*pp,doubleNextPoint)
{
doubledError,Error,Pout;
Error=pp->SetPoint-NextPoint;/*?
?
?
?
?
?
*/
pp->SumError+=Error;/*?
?
?
?
?
?
/
dError=pp->LastError-pp->PrevError;/*?
?
?
?
*/
pp->PrevError=pp->LastError;
pp->LastError=Error;/*?
?
?
?
?
?
?
*/
Pout=pp->Proportion*Error+pp->Integral*pp->SumError+pp->Derivative*dError;
if(Pout>1100)
Pout=1000;
if(Pout<100)
Pout=100;
return(Pout);
}
PIDsPID;//定义PID结构体变量
doublerOut;//PID响应输出
unsignedcharrIn;//设置PID反馈值
doublex;
doublesumout;
unsignedchardd;
//设置PID输出
voidmain(void)
{
sPID.Proportion=0.44;//设置P
sPID.Integral=0.70;//设置I
sPID.Derivative=0.0;//设置D
//sPID.SetPoint=CEX0_Compare_Value;
//