利用PID算法实现倒立摆控制.docx

利用PID算法实现倒立摆控制.docx

ID:59224220

大小:11.01 KB

页数:5页

时间:2020-09-09

利用PID算法实现倒立摆控制.docx_第1页
利用PID算法实现倒立摆控制.docx_第2页
利用PID算法实现倒立摆控制.docx_第3页
利用PID算法实现倒立摆控制.docx_第4页
利用PID算法实现倒立摆控制.docx_第5页
资源描述:

《利用PID算法实现倒立摆控制.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、利用PID算法实现倒立摆控制#include#include#defineucharunsignedchar#defineuintunsignedint#defineTHC00xf8#defineTLC00xcD//2msunsignedcharcodeDuan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴极数码管,0-9段码表unsignedcharData_Buffer[8]={0,0,0,0,0,0,0,0};uchari=0;sbitAddSpeed=P1

2、^1;sbitSubSpeed=P1^2;sbitPWM_FC=P1^0;inte,e1,e2;//pid偏差floatuk,uk1,duk;//pid输出值floatKp=5,Ki=10,Kd=1.9;//pid控制系数intout=0;uintSpeedSet=1000;uintcnt=0;uintInpluse=0,num=0;//脉冲计数uintPWMTime=100;//脉冲宽度unsignedchararry[];voidSendString(uintch);voidPIDControl();//PID控制voidSystemInit();//系统初始化vo

3、iddelay(ucharx);voidPWMOUT();//PWM输出voidSetSpeed();//速度设置voidSegRefre();/**************主函数************/voidmain(){SystemInit();while(1){SetSpeed();SegRefre();PWMOUT();}}voidPIDControl()//pid偏差计算{e=SpeedSet-num;duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2))/50;//+Kd*(e-2e1+e2)uk=uk1+duk;out=(int)uk;

4、if(out>1000){out=1000;}elseif(out<0){out=0;}uk1=uk;e2=e1;e1=e;PWMTime=out;}voiddelay(ucharx){uinti,j;for(i=x;i>0;i--)for(j=50;j>0;j--);}voidPWMOUT(){if(cnt1000)cnt=0;}voidSystemInit(){TMOD=0X21;//t1用来串口t2定时TH0=THC0;TL0=TLC0;TH1=0xC0;TL1=0XC0;ET1=

5、1;ET0=1;TR0=1;TR1=1;EX0=1;//中断0用来测量转速IT0=1;EA=1;e=0;e1=0;e2=0;}voidSetSpeed(){if(AddSpeed==0){delay(200);if(AddSpeed==0){SpeedSet+=100;if(SpeedSet>9999){SpeedSet=9999;}}}if(SubSpeed==0){delay(200);if(SubSpeed==0){SpeedSet-=100;if(SpeedSet<0)SpeedSet=0;}}}voidSegRefre()//显示刷新{Data_Buffer[

6、0]=SpeedSet/1000;Data_Buffer[1]=SpeedSet%1000/100;Data_Buffer[2]=SpeedSet%100/10;Data_Buffer[3]=SpeedSet%10;Data_Buffer[4]=num/1000;Data_Buffer[5]=num%1000/100;Data_Buffer[6]=num%100/10;Data_Buffer[7]=num%10;}voidint0()interrupt0{Inpluse++;}voidt0()interrupt1{staticunsignedcharBit=0;//静态

7、变量,退出程序值保留staticunsignedinttime=0;staticunsignedintaa=0;TH0=THC0;TL0=TLC0;aa++;if(aa==50){aa=0;flag0=1;}Bit++;time++;//转速测量周期if(Bit>8)Bit=0;P0=0xff;P2=Duan[Data_Buffer[Bit]];switch(Bit){case0:P0=0X7F;break;case1:P0=0XBF;break;case2:P0=0XDF;break;case3:P0=0XEF;break;case4:

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。