控制系统基本环节
- 比例
- 积分
- 微分
- 惯性
- 二阶系统
- 延时
PID调节
基本公式
- 可以直接在网上搜
分类
位置式PID
- PID输出直接给输出
增量式PID
- PID得到的输出叠加在上一次PID的输出中作为系统输出
积分分离PID
- 当控制量与给定值相差较大时,取消积分作用, 避免积分累加和过大造成的系统不稳定因素增加
相关代码
float SeqIntPID(float Kp, float Ki, float Kd, float GiveValue, float ActualValue) { float result; float Err,KpWork, KiWork, KdWork; Err = GiveValue - ActualValue; KpWork = Kp*Err; KiWork = Ki*SeqIntPIDErrADD; KdWork = Kd*(Err-SeqIntErrBack); if(fabs(Err) > 100) { result = KpWork+KdWork; } else{ result = KpWork+KiWork+KdWork; } SeqIntPIDErrADD = SeqIntPIDErrADD + Err; SeqIntErrBack = Err; return result; }
抗积分饱和PID
- 2种方法
- 限制积分累加和
- 限制每次的控制量输出(可以防止长期停止在饱和区)
相关代码(限制每次控制量输出代码)
float OverIntPID(float Kp, float Ki, float Kd, float GiveValue, float ActualValue) { float result; float Err,KpWork, KiWork, KdWork; Err = GiveValue - ActualValue; if(OverIntResultBack > 120) { if(Err < 0) { OverIntPIDErrADD = OverIntPIDErrADD + Err; } } else if(OverIntResultBack < 120) { if(Err > 0) { OverIntPIDErrADD = OverIntPIDErrADD + Err; } } else { OverIntPIDErrADD = OverIntPIDErrADD + Err; } KpWork = Kp*Err; KiWork = Ki*OverIntPIDErrADD; KdWork = Kd*(Err-OverIntErrBack); result = KpWork+KiWork+KdWork; OverIntErrBack = Err; OverIntResultBack = result; return result; }
变积分PID实现
- 说明
- 偏差越大,积分越慢;偏差越小,积分越快。
- 给定累加的偏差一个权值,当系统偏差大于某一个值时,累积不完全的偏差值,甚至不进行偏差值的累加。
相关代码
float ChangeIntPID(float Kp, float Ki, float Kd, float GiveValue, float ActualValue) { float result; float Err,KpWork, KiWork, KdWork,ErrCont; Err = GiveValue - ActualValue; KpWork = Kp*Err; KiWork = Ki*ChangeIntPIDErrADD; KdWork = Kd*(Err-ChangeIntErrBack); result = KpWork+KiWork+KdWork; if(fabs(Err)<= GiveValue*0.1) { ErrCont = Err; } else if((fabs(Err)<= GiveValue*0.9)&&(fabs(Err)> GiveValue*0.1)) { ErrCont = ((0.9*GiveValue)-fabs(Err))*Err/(0.8*GiveValue); } else { ErrCont = 0; } ChangeIntPIDErrADD = ChangeIntPIDErrADD + ErrCont; ChangeIntErrBack = Err; return result; }
不完全微分 PID控制
- 说明
- 微分信号的可以改善系统的动态特性,但也容易引入高频干扰,在误差信号存在扰动时, 更是能够显示微分的不足之处。克服上述问题的方法之一就是在采用不完全微分 PID 控制,所谓不完全微分法就是在 PID 控制算法的微分项中加入一个一阶惯性环节。如此可是系统性能得到改善。
- 这样会在高频时起到滤波的作用。
参考代码
float NoComDPID(float Kp, float Ki, float Kd, float Aifa, float GiveValue, float ActualValue) { float result; float Err,KpWork, KiWork, KdWork; Err = GiveValue - ActualValue; KpWork = Kp*Err; KiWork = Ki*NoComIntPIDErrADD; if(Aifa > 1) { Aifa = 1; } if(Aifa < 0) { Aifa = 0; } KdWork = Kd*(1-Aifa)*(Err-ErrBbk)+ Aifa*KdWorkBbk; result = KpWork+KiWork+KdWork; NoComIntPIDErrADD = NoComIntPIDErrADD + Err; KdWorkBbk = KdWork; ErrBbk = Err; return result; }
工业控制及其C语言算法实现
专家系统及其C语言实现
- if else即可实现
- 针对不同的条件组合给出不同的决策
- 模糊逻辑及其C语言实现
- 神经网络及其C语言实现
- 遗传算法及其C语言实现