PWM直流电机调速单片机程序Word文档下载推荐.docx
《PWM直流电机调速单片机程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《PWM直流电机调速单片机程序Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
//电机加速
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)
if(Key_dec==0)
count0-=5;
if(count0<
=0)
count0=0;
Key_dec);
}
/************电机正反向控制**************/
voidMotor_turn(void)
if(Key_turn==0)
if(Key_turn==0)
Flag=~Flag;
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<
count0)
PWM2=1;
else
PWM2=0;
if(count1>
count1=0;
else//电机反转
PWM1=1;
//-----------------------------------------------------------------------------
#include<
c8051f330.h>
//SFRdeclarations
math.h>
//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;
PrevError=pp->
LastError;
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;
//