预览加载中,请您耐心等待几秒...
1/6
2/6
3/6
4/6
5/6
6/6

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

PID算法的C语言实现PID算法的C语言实现积分饱和通俗讲就是系统在一个偏差方向上的饱和,下面一起来跟着小编学习一下PID算法的C语言实现方法吧,希望可以帮助到大家!比如一个系统设定了输出不会超过100,但因为出现一个方向上的偏差积分使得输出超过了100,此时达到了饱和状态,如果继续在这个方向上积分会导致PID控制超过100系统却运行在100,相当于积分调节对系统输出没有作用,就出现失控的状态,这是系统不能接受的,而且饱和积分越深,退出饱和就越久。上面是在正向的饱和,负向的饱和类似!为了解决这个问题,我们采用抗积分饱和算法,其思路就是:如果上一次的输出控制量超过了饱和值,饱和值为正,则这一次只积分负的偏差,饱和值为负,则这一次只积分正的偏差,从而避免系统长期留在饱和区!下面我以位置型+抗积分饱和+积分分离的.PID控制算法C语言来观察调节结果:(相对应的代码可以参考以往的文章)//位置型+抗积分饱和+积分分离PID控制算法struct_pid{floatSetSpeed;floatActualSpeed;floatErr;floatErr_Last;floatKp,Ki,Kd;floatVoltage;floatIntegral;floatUmax;//最大正饱和上限值floatUmin;//最大负饱和下限值}pid;voidPID_Init(void){printf("PID_Initbegin!");pid.SetSpeed=0;pid.ActualSpeed=0;pid.Err=0;pid.Err_Last=0;pid.Kp=0.2;pid.Ki=0.1;//增大了积分环节的值pid.Kd=0.2;pid.Voltage=0;pid.Integral=0;pid.Umax=400;//正饱和值为400pid.Umin=-200;//负饱和值为-200printf("PID_Initend!");}floatPID_Cal(floatSpeed){unsignedcharindex;pid.SetSpeed=Speed;pid.Err=pid.SetSpeed-pid.ActualSpeed;if(pid.ActualSpeed>pid.Umax)//如果上一次输出变量出现正向的饱和{if(abs(pid.Err)>200){index=0;}else{index=1;if(pid.Err<0){pid.Integral+=pid.Err;//正饱和只积分负偏差}}}elseif(pid.ActualSpeed{if(abs(pid.Err)>200){index=0;}else{index=1;if(pid.Err>0){pid.Integral+=pid.Err;//负饱和只积分正偏差}}}else{if(abs(pid.Err)>200)//积分分离的PID优化,可参考以往的文章{index=0;}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.Err_Last=pid.Err;pid.ActualSpeed=pid.Voltage*1.0;returnpid.ActualSpeed;}intmain(void){intcount=0;printf("SYSTEMBEGIN!");PID_Init();while(count<1000){floatspeed=PID_Cal(200.0);printf("-%d-%f-",count,speed);count++;}return0;}最后运行结果:我们发现,相对以往的算法,还算法大大提高了调节的速度和稳定!