|
這是一個C51的PID調(diào)節(jié)的源程序。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (11.32 KB, 下載次數(shù): 68)
下載附件
2019-9-25 16:01 上傳
單片機(jī)源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #include <stdio.h>
- #include <math.h>
- #ifndef uchar
- #define uchar unsigned char
- #endif
- #ifndef uint
- #define uint unsigned int
- #endif
- #ifndef ulong
- #define ulong unsigned long
- #endif
- /*
- struct _pid{
- float SetSpeed; //定義設(shè)定值
- float ActualSpeed; //定義實(shí)際值
- float err; //定義偏差值
- float err_last; //定義上一個偏差值
- float Kp,Ki,Kd; //定義比例、積分、微分系數(shù)
- float voltage; //定義電壓值(控制執(zhí)行器的變量)
- float integral; //定義積分值
- float umax;
- float umin;
- }pid;
- void PID_init(){
- printf("PID_init begin \n");
- pid.SetSpeed=0.0;
- pid.ActualSpeed=0.0;
- pid.err=0.0;
- pid.err_last=0.0;
- pid.voltage=0.0;
- pid.integral=0.0;
- pid.Kp=0.4;
- pid.Ki=0.2; //注意,和上幾次相比,這里加大了積分環(huán)節(jié)的值
- pid.Kd=0.2;
- pid.umax=400;
- pid.umin=-200;
- printf("PID_init end \n");
- }
- float PID_realize(float speed){
- int index;
- pid.SetSpeed=speed;
- pid.err=pid.SetSpeed-pid.ActualSpeed;
- if(pid.ActualSpeed>pid.umax) //灰色底色表示抗積分飽和的實(shí)現(xiàn)
- {
- if(abs(pid.err)>200) //藍(lán)色標(biāo)注為積分分離過程
- { index=0; }
- else{
- if(abs(pid.err)>180) {index=(200-abs(err))/20;}
- else{index=1;}
- if(pid.err<0)
- {
- pid.integral+=pid.err;
- }
- }
- }
- else
- if(pid.ActualSpeed<pid.umin)
- {
- if(abs(pid.err)>200) //積分分離過程
- { index=0; }
- else{
- if(abs(pid.err)>180) {index=(200-abs(err))/20;}
- else{index=1;}
- if(pid.err>0)
- {
- pid.integral+=pid.err;
- }
- }
- }
- else
- {
- if(abs(pid.err)>200) //積分分離過程
- { index=0; }
- else{
- if(abs(pid.err)>180) {index=(200-abs(err))/20;}
- else{index=1;}
- pid.integral+=pid.err;
- }
- }
- //pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);
- //pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral/2+pid.Kd*(pid.err-pid.err_last); //梯形積分
- pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last); //
- pid.err_last=pid.err;
- pid.ActualSpeed=pid.voltage*1.0;
- return pid.ActualSpeed;
- }
- */
- void main()
- {
- uint idata count=0;
- int idata speed1,speed3=0;
- // uchar speed2;
- SCON=0x50;
- TMOD=0x20;
- TCON=0x40;
- TH1=0xe8;
- TL1=0xe8;
- TI=1;
- TR1=1;
- printf("System begin \n");
- PID_init();
- while(1)
- {
- if(count<100)
- {
- speed1 = PID_contral(250, speed3 );
- // printf("%f\n",speed);
- printf("%d\n",speed1);
- printf("%5d\n",speed3);
- // if(speed3<151){speed3 +=20;}
- // if((speed3>150)&&(speed3<181)){speed3 += 10;}
- // if((speed3>180)&&(speed3<191)){speed3 += 2;}
- if(speed3<250){speed3 += 10;}
- }
- if((count>99)&&(count<150))
- {
- speed1=PID_contral(200,speed3);
- printf("%d\n",speed1);
- printf("%5d\n",speed3);
- if(count<110) {speed3 -= 2;}
- if((count>119)&&(count<130)) {speed3 -= 1;}
- // else speed3 =202;
- }
- count++;
-
- if(count>150){break;}
-
- }
-
- }
復(fù)制代碼
0.png (9.17 KB, 下載次數(shù): 73)
下載附件
2019-9-25 16:02 上傳
所有資料51hei提供下載:
pid抗飽和變積分.rar
(103.99 KB, 下載次數(shù): 37)
2019-9-25 15:49 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|