增量式 PID 算法 程序是自己编的,根据多方资料改写了一部分,为增量式PID 算法。程序采用浮点形式,如果 MCU 速度不够快,可根据需求转换定点运算。 关键变量:ref——设置的参数;feb——采样反馈;根据实际情况修改这两个变量即可。 相关参数:Kp、Ti、Td、T:根据各项目的控制对象不同而修改其定义值。//定义变量double ref = 0;//设置参数double feb = 0;//采样反馈 int pwm_var =0; //PID 调整量Uint16 PWM_out = 0; //PWM 输出量 double Uo = 0;double Ek = 0;double Ei = 0;double Ed = 0;#define Kp 8 //PID 调节的比例常数#define Ti 0.05 //PID 调节的积分常数#define Td 0.02 //PID 调节的微分时间常数#define T 0.02 //采样周期#define Kpp Kp * ( 1 + (T / Ti)+ (Td / T) )#define Ki (-Kp) * ( 1 + (2 *Td / T ) )#define Kd Kp* Td / T//#define Kpp 4//#define Ki 0.8//#define Kd 20//误差的阀值,小于这个数值的时候,不做PID 调整,避免误差较小时频繁调节引起震荡#define Emin 3//调整值限幅,防止积分饱和#define Umax 100#define Umin -100//输出值限幅#define Pmax 15500#define Pmin 200///////////////////////////////////////////////////////////////////////// PID 运算 ///////void pid_ctrl(void){ Ek = ref -feb; //差值运算 if( fabs(Ek) < Emin )//误差的阀值(死区控制??) { pwm_var =0; } else { Uo = Kpp*Ek+ Ki*Ei + Kd*Ed;//PID 计算 Ed =Ei; Ei =Ek; pwm_var =(int)Uo; //强制转化调整量,PWM 为整数 if(pwm_var>= Umax)pwm_var =Umax; //调整值限幅,防止积分饱和 if(pwm_var<= Umin)pwm_var =Umin; //调整值限幅,防止积分饱和 } PWM_out +=pwm_var; //调整 PWM 输出 if(PWM_out > Pmax)PWM_out =Pmax; //输出值限幅 if(PWM_out < Pmin)PWM_out =Pmin; //输出值限幅 TBCCR1 = PWM_out;//输出给寄存器,改变 PWM 占空比}///////////////////////////////////////////////////////////////////调用示例:void main(void){ ref = 120.6; while(1) { feb =adc_sample(); pid_ctrl(); }}另外附上:PID 调节经验总结(搜索资源) PID 控制器参数选择的方法很多,例如试凑法、临界比例度法、扩充临界比例度法等。但是,对于...