pwm电机调速程序.docx
- 文档编号:202542
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:19
- 大小:18.23KB
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);
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 #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; //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 EA=1; sPID.SetPoint=70; while (1) { 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) { 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 //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. 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; else pi++; TH0=0;//ReinitTimer0Highregister TL0=0;//ReinitTimer0Lowregister if(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; else sumout=(0.85/1000.0)*rOut; //CEX0_Compare_Value=CEX0_Compare_Value-sumout; CEX0_Compare_Value=65536-(65536*(sumout+0.15)); } } else { TH0=0;//ReinitTimer0Highregister TL0=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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- pwm 电机 调速 程序