pwm电机调速程序.docx
《pwm电机调速程序.docx》由会员分享,可在线阅读,更多相关《pwm电机调速程序.docx(19页珍藏版)》请在冰豆网上搜索。
pwm电机调速程序
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);
count0+=5;
if(count0>=100)
count0=100;
while(!
Key_add);//等待键松开
/******按键处理减pwm占空比,电机减速*****/
voidMotor_speed_low(void)
if(Key_dec==0)
count0-=5;
if(count0<=0)
count0=0;
Key_dec);
/************电机正反向控制**************/
voidMotor_turn(void)
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;//设置定时器初值期间,关闭定时器
TH0=TH0_TL0/256;//定时器装初值
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;//HoldscurrentPCAcomparevalueunsignedinttmr,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;//设置PsPID.Integral=0.70;//设置IsPID.Derivative=0.0;//设置D//sPID.SetPoint=CEX0_Compare_Value;//sPID.SetPoint=CEX0_Compare_Value;//设置PID输出PCA0MD=0x00;//Disablewatchdogtimerled_D1003=0;PORT_Init();//InitializecrossbarandGPIOOSCILLATOR_Init();//InitializeoscillatorPCA0_Init();//InitializePCA0IP=0x82;//定时器中断0高于外部中断0Timer0_Init();Ext_Interrupt_Init();for(tmr=0;tmr<0x2000;tmr++);send_byte(CMD_RESET);//HD7279复位//GloballyenableinterruptsEA=1;sPID.SetPoint=70;while(1){delay10ms(100);//键盘程序-------------------------------------------------------------if(sw1==0)//按键1是否按下{if(sw1==0)//再次检查按键{num++;//若按键按下,num加1if(num==1)//到9归0{num=0;}while(sw1==0);//按键释放}//delay10ms(100);}write7279(DECODE1+4,num);//将num写入HD7279第1位delay10ms(1);if(sw2==0){if(sw2==0){num1++;if(num1==2){num1=0;}while(!sw2);}//delay10ms(100);}write7279(DECODE1+5,num1);//将num1写入HD7279第2位delay10ms(1);if(sw3==0){if(sw3==0){num2++;if(num2==10){num2=0;}while(!sw3);}//delay10ms(100);}write7279(DECODE1+6,num2);//将num1写入HD7279第2位delay10ms(1);if(sw4==0){if(sw4==0){num3++;if(num3==10){num3=0;}while(!sw4);}//delay10ms(100);}write7279(DECODE1+7,num3);//将num1写入HD7279第2位delay10ms(1);Speed_evaluate=num*1000+num1*100+num2*10+num3;sPID.SetPoint=Speed_evaluate;//控制程序-----------------------------------------------------------------//---------------------------------------------------------------------------}}voidOSCILLATOR_Init(void){OSCICN=0x83;//Setinternaloscillatortorun//atitsmaximumfrequencyCLKSEL=0x00;}voidPORT_Init(void){XBR0=0x00;XBR1=0x41;//Enablecrossbarandweakpull-upsP0MDOUT|=0x10;//SetCEX0(P0.4)topush-pullP0SKIP|=0x0F;//P1SKIP=0x00;P1MDOUT=0x0f;}voidPCA0_Init(void){PCA0CN=0x00;//Stopcounter;clearallflagsPCA0MD=0x01;//UseEtternimebasePCA0CPM0=0xCB;//Module0=16-bitPWMmodeand//enableModule0MatchandInterrupt//Flags//ConfigureinitialPWMdutycycle=50%CEX0_Compare_Value=65536-(65536*0.15);PCA0CPL0=(CEX0_Compare_Value&0x00FF);PCA0CPH0=(CEX0_Compare_Value&0xFF00)>>8;EIE1|=0x10;//EnablePCAinterrupts//StartPCAcounterCR=1;}voidExt_Interrupt_Init(void){TCON|=0x05;///INT0and/INT1areedgetriggeredIT01CF=0x10;///INT0activelow;/INT0onP0.0;///INT1activelow;/INT1onP0.1EX0=1;//Enable/INT0interrupts}voidTimer0_Init(void){TH0=0;//InitTimer0HighregisterTL0=0;//InitTimer0LowregisterTMOD|=0x01;//Timer0in16-bitmode方式1CKCON|=0x02;//Timer0usesa1:48prescalerET0=1;//Timer0interruptenabledTCON|=0x10;//Timer0ON}//PCA0_ISR//-----------------------------------------------------------------------------voidPCA0_ISR(void)interrupt11{CCF0=0;//Clearmodule0interruptflag.PCA0CPL0=(CEX0_Compare_Value&0x00FF);PCA0CPH0=(CEX0_Compare_Value&0xFF00)>>8;}voidTimer0_ISR(void)interrupt1{intj,sum;TF0=0;//Clearinterruptflag.a++;if(a==4){Speed1[pi]=Speed;if(pi>=3){EX0=0;for(j=0;j<=3;j++){sum=sum+Speed1[j];}Speed2=sum/4;disp1(Speed2);Speed=0;pi=0;EX0=1;}a=0;sum=0;if(pi>=3)pi=0;elsepi++;TH0=0;//ReinitTimer0HighregisterTL0=0;//ReinitTimer0Lowregisterif(abs(sPID.SetPoint-Speed2)<=5){CEX0_Compare_Value=CEX0_Compare_Value;}else{rIn=Speed2;for(dd=0;dd<50;dd++)x=rIn;//x=5.0*(double)rIn/256.0;rOut=PIDCalc(&sPID,x);//sumout=rOut*256/5;if(rOut==100)sumout=0;elsesumout=(0.85/1000.0)*rOut;//CEX0_Compare_Value=CEX0_Compare_Value-sumout;CEX0_Compare_Value=65536-(65536*(sumout+0.15));}}else{TH0=0;//ReinitTimer0HighregisterTL0=0;//ReinitTimer0Lowregister}}voidINT0_ISR(void)interrupt0{IE0=0;////Clearinterruptflag.Speed++;}voidwrite7279(unsignedcharcmd,unsignedchardta){send_byte(cmd);send_byte(dta);}voidsend_byte(unsignedcharout_byte){unsignedchari;cs=0;long_delay();for(i=0;i<8;i++){if(out_byte&0x80){dat=1;}else{dat=0;}clk=1;short_delay();clk=0;short_delay();out_byte=out_byte*2;}dat=0;}voidlong_delay(void){unsignedchari;for(i=0;i<0x30;i++);}voidshort_delay(void){unsignedchari;for(i=0;i<8;i++);}voiddelay10ms(unsignedchartime){unsignedchari;unsignedintj;for(i=0;i{for(j=0;j<0x390;j++);}}voiddisp1(un
PWM2=1;
else
PWM2=0;
if(count1>=100)
count1=0;
else//电机反转
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;//HoldscurrentPCAcomparevalueunsignedinttmr,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;//设置PsPID.Integral=0.70;//设置IsPID.Derivative=0.0;//设置D//sPID.SetPoint=CEX0_Compare_Value;//sPID.SetPoint=CEX0_Compare_Value;//设置PID输出PCA0MD=0x00;//Disablewatchdogtimerled_D1003=0;PORT_Init();//InitializecrossbarandGPIOOSCILLATOR_Init();//InitializeoscillatorPCA0_Init();//InitializePCA0IP=0x82;//定时器中断0高于外部中断0Timer0_Init();Ext_Interrupt_Init();for(tmr=0;tmr<0x2000;tmr++);send_byte(CMD_RESET);//HD7279复位//GloballyenableinterruptsEA=1;sPID.SetPoint=70;while(1){delay10ms(100);//键盘程序-------------------------------------------------------------if(sw1==0)//按键1是否按下{if(sw1==0)//再次检查按键{num++;//若按键按下,num加1if(num==1)//到9归0{num=0;}while(sw1==0);//按键释放}//delay10ms(100);}write7279(DECODE1+4,num);//将num写入HD7279第1位delay10ms(1);if(sw2==0){if(sw2==0){num1++;if(num1==2){num1=0;}while(!sw2);}//delay10ms(100);}write7279(DECODE1+5,num1);//将num1写入HD7279第2位delay10ms(1);if(sw3==0){if(sw3==0){num2++;if(num2==10){num2=0;}while(!sw3);}//delay10ms(100);}write7279(DECODE1+6,num2);//将num1写入HD7279第2位delay10ms(1);if(sw4==0){if(sw4==0){num3++;if(num3==10){num3=0;}while(!sw4);}//delay10ms(100);}write7279(DECODE1+7,num3);//将num1写入HD7279第2位delay10ms(1);Speed_evaluate=num*1000+num1*100+num2*10+num3;sPID.SetPoint=Speed_evaluate;//控制程序-----------------------------------------------------------------//---------------------------------------------------------------------------}}voidOSCILLATOR_Init(void){OSCICN=0x83;//Setinternaloscillatortorun//atitsmaximumfrequencyCLKSEL=0x00;}voidPORT_Init(void){XBR0=0x00;XBR1=0x41;//Enablecrossbarandweakpull-upsP0MDOUT|=0x10;//SetCEX0(P0.4)topush-pullP0SKIP|=0x0F;//P1SKIP=0x00;P1MDOUT=0x0f;}voidPCA0_Init(void){PCA0CN=0x00;//Stopcounter;clearallflagsPCA0MD=0x01;//UseEtternimebasePCA0CPM0=0xCB;//Module0=16-bitPWMmodeand//enableModule0MatchandInterrupt//Flags//ConfigureinitialPWMdutycycle=50%CEX0_Compare_Value=65536-(65536*0.15);PCA0CPL0=(CEX0_Compare_Value&0x00FF);PCA0CPH0=(CEX0_Compare_Value&0xFF00)>>8;EIE1|=0x10;//EnablePCAinterrupts//StartPCAcounterCR=1;}voidExt_Interrupt_Init(void){TCON|=0x05;///INT0and/INT1areedgetriggeredIT01CF=0x10;///INT0activelow;/INT0onP0.0;///INT1activelow;/INT1onP0.1EX0=1;//Enable/INT0interrupts}voidTimer0_Init(void){TH0=0;//InitTimer0HighregisterTL0=0;//InitTimer0LowregisterTMOD|=0x01;//Timer0in16-bitmode方式1CKCON|=0x02;//Timer0usesa1:48prescalerET0=1;//Timer0interruptenabledTCON|=0x10;//Timer0ON}//PCA0_ISR//-----------------------------------------------------------------------------voidPCA0_ISR(void)interrupt11{CCF0=0;//Clearmodule0interruptflag.PCA0CPL0=(CEX0_Compare_Value&0x00FF);PCA0CPH0=(CEX0_Compare_Value&0xFF00)>>8;}voidTimer0_ISR(void)interrupt1{intj,sum;TF0=0;//Clearinterruptflag.a++;if(a==4){Speed1[pi]=Speed;if(pi>=3){EX0=0;for(j=0;j<=3;j++){sum=sum+Speed1[j];}Speed2=sum/4;disp1(Speed2);Speed=0;pi=0;EX0=1;}a=0;sum=0;if(pi>=3)pi=0;elsepi++;TH0=0;//ReinitTimer0HighregisterTL0=0;//ReinitTimer0Lowregisterif(abs(sPID.SetPoint-Speed2)<=5){CEX0_Compare_Value=CEX0_Compare_Value;}else{rIn=Speed2;for(dd=0;dd<50;dd++)x=rIn;//x=5.0*(double)rIn/256.0;rOut=PIDCalc(&sPID,x);//sumout=rOut*256/5;if(rOut==100)sumout=0;elsesumout=(0.85/1000.0)*rOut;//CEX0_Compare_Value=CEX0_Compare_Value-sumout;CEX0_Compare_Value=65536-(65536*(sumout+0.15));}}else{TH0=0;//ReinitTimer0HighregisterTL0=0;//ReinitTimer0Lowregister}}voidINT0_ISR(void)interrupt0{IE0=0;////Clearinterruptflag.Speed++;}voidwrite7279(unsignedcharcmd,unsignedchardta){send_byte(cmd);send_byte(dta);}voidsend_byte(unsignedcharout_byte){unsignedchari;cs=0;long_delay();for(i=0;i<8;i++){if(out_byte&0x80){dat=1;}else{dat=0;}clk=1;short_delay();clk=0;short_delay();out_byte=out_byte*2;}dat=0;}voidlong_delay(void){unsignedchari;for(i=0;i<0x30;i++);}voidshort_delay(void){unsignedchari;for(i=0;i<8;i++);}voiddelay10ms(unsignedchartime){unsignedchari;unsignedintj;for(i=0;i{for(j=0;j<0x390;j++);}}voiddisp1(un
PWM1=1;
//-----------------------------------------------------------------------------
#include//SFRdeclarations
//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输出
sPID.Proportion=0.44;//设置P
sPID.Integral=0.70;//设置I
sPID.Derivative=0.0;//设置D
//sPID.SetPoint=CEX0_Compare_Value;
//sPID.SetPoint=CEX0_Compare_Value;//设置PID输出
PCA0MD=0x00;//Disablewatchdogtimer
led_D1003=0;
PORT_Init();//InitializecrossbarandGPIO
OSCILLATOR_Init();//Initializeoscillator
PCA0_Init();//InitializePCA0
IP=0x82;//定时器中断0高于外部中断0
Timer0_Init();
Ext_Interrupt_Init();
for(tmr=0;tmr<0x2000;tmr++);
send_byte(CMD_RESET);//HD7279复位//Globallyenableinterrupts
sPID.SetPoint=70;
delay10ms(100);
//键盘程序-------------------------------------------------------------
if(sw1==0)//按键1是否按下
if(sw1==0)//再次检查按键
num++;//若按键按下,num加1
if(num==1)//到9归0
num=0;
while(sw1==0);//按键释放
//delay10ms(100);
write7279(DECODE1+4,num);//将num写入HD7279第1位
delay10ms
(1);
if(sw2==0)
num1++;
if(num1==2)
num1=0;
sw2);
write7279(DECODE1+5,num1);//将num1写入HD7279第2位
if(sw3==0)
num2++;
if(num2==10)
num2=0;
sw3);
write7279(DECODE1+6,num2);//将num1写入HD7279第2位
if(sw4==0)
num3++;
if(num3==10)
num3=0;
sw4);
write7279(DECODE1+7,num3);//将num1写入HD7279第2位
Speed_evaluate=num*1000+num1*100+num2*10+num3;
sPID.SetPoint=Speed_evaluate;
//控制程序-----------------------------------------------------------------
//---------------------------------------------------------------------------
voidOSCILLATOR_Init(void)
OSCICN=0x83;//Setinternaloscillatortorun
//atitsmaximumfrequency
CLKSEL=0x00;
voidPORT_Init(void)
XBR0=0x00;
XBR1=0x41;
//Enablecrossbarandweakpull-ups
P0MDOUT|=0x10;//SetCEX0(P0.4)topush-pull
P0SKIP|=0x0F;//
P1SKIP=0x00;
P1MDOUT=0x0f;
voidPCA0_Init(void)
PCA0CN=0x00;//Stopcounter;clearallflags
PCA0MD=0x01;//UseEtternimebase
PCA0CPM0=0xCB;//Module0=16-bitPWMmodeand
//enableModule0MatchandInterrupt
//Flags
//ConfigureinitialPWMdutycycle=50%
CEX0_Compare_Value=65536-(65536*0.15);
PCA0CPL0=(CEX0_Compare_Value&0x00FF);
PCA0CPH0=(CEX0_Compare_Value&0xFF00)>>8;
EIE1|=0x10;//EnablePCAinterrupts
//StartPCAcounter
CR=1;
voidExt_Interrupt_Init(void)
TCON|=0x05;///INT0and/INT1areedgetriggered
IT01CF=0x10;///INT0activelow;/INT0onP0.0;
///INT1activelow;/INT1onP0.1
EX0=1;//Enable/INT0interrupts
voidTimer0_Init(void)
TH0=0;//InitTimer0Highregister
TL0=0;//InitTimer0Lowregister
TMOD|=0x01;//Timer0in16-bitmode方式1
CKCON|=0x02;//Timer0usesa1:
48prescaler
ET0=1;//Timer0interruptenabled
TCON|=0x10;//Timer0ON
//PCA0_ISR
voidPCA0_ISR(void)interrupt11
CCF0=0;//Clearmodule0interruptflag.
voidTimer0_ISR(void)interrupt1
intj,sum;
TF0=0;
//Clearinterruptflag.
a++;
if(a==4)
Speed1[pi]=Speed;
if(pi>=3)
{EX0=0;
for(j=0;j<=3;j++)
sum=sum+Speed1[j];
Speed2=sum/4;
disp1(Speed2);
Speed=0;
pi=0;
EX0=1;
a=0;
sum=0;
pi++;
TH0=0;//ReinitTimer0Highregister
TL0=0;//ReinitTimer0Lowregister
if(abs(sPID.SetPoint-Speed2)<=5)
CEX0_Compare_Value=CEX0_Compare_Value;
rIn=Speed2;
for(dd=0;dd<50;dd++)
x=rIn;
//x=5.0*(double)rIn/256.0;
rOut=PIDCalc(&sPID,x);
//sumout=rOut*256/5;
if(rOut==100)
sumout=0;
sumout=(0.85/1000.0)*rOut;
//CEX0_Compare_Value=CEX0_Compare_Value-sumout;
CEX0_Compare_Value=65536-(65536*(sumout+0.15));
voidINT0_ISR(void)interrupt0
IE0=0;////Clearinterruptflag.
Speed++;
voidwrite7279(unsignedcharcmd,unsignedchardta)
send_byte(cmd);
send_byte(dta);
voidsend_byte(unsignedcharout_byte)
unsignedchari;
cs=0;
long_delay();
for(i=0;i<8;i++)
if(out_byte&0x80)
dat=1;
dat=0;
clk=1;
short_delay();
clk=0;
out_byte=out_byte*2;
voidlong_delay(void)
for(i=0;i<0x30;i++);
voidshort_delay(void)
for(i=0;i<8;i++);
voiddelay10ms(unsignedchartime)
unsignedintj;
for(i=0;i{for(j=0;j<0x390;j++);}}voiddisp1(un
for(j=0;j<0x390;j++);
voiddisp1(un
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1