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

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

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

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

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

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

PID算法的C语言实现:抗积分饱和的PID优化PID算法的C语言实现:抗积分饱和的PID优化导语:C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。下面我们来看看PID算法的C语言实现:抗积分饱和的PID优化,希望对大家有所帮助。积分饱和通俗讲就是系统在一个偏差方向上的.饱和,比如一个系统设定了输出不会超过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)//{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;}