📄 pid.pas
字号:
unit PID;
interface
type
TPID=class //定义一个类
sp,pv:single; //设定值和测量值
errormin,errormax,error_1:single;//偏差下限、偏差上限和上次偏差
umax,umin,U_1:single;//超调区上限、超调区下限和上次PID输出
Kp,Ti,Td,T:single; //比例增益、积分、微分和采样时间
deadband,Ui_sum:single; //死区和积分总和
Ud_1:single; //不完全微分惯性
function pidcontrol():single; //PID控制器输出
end;
implementation
function TPID.pidcontrol():single;
var
error:single; //即时偏差
Ki,Kd:single; //定义积分增益、微分增益
Up,Ui,Ud:single;//P作用、I作用和D作用
Ud_a,a,Td_s:single; //不完全微分的系数
mv:single;
begin
Ki:=Kp*T/Ti; //求积分增益
Kd:=Kp*Td/T; //求微分增益
error:=sp-pv; //求即时偏差error
if (Kd=0) then
begin
Td_s:=0;
a:=0;
Ud:=0;
Ud_1:=0;
end else begin
Td_s:=T+Td/Kd; //Ud的系数
a:=Td/(Td+T*Kd);//Ud_1的系数
Ud:=a*Ud_1+(Kd*Td/Td_s)*(error-error_1); //微分作用
Ud_1:=Ud;
end;
if (abs(error)>deadband) then //判断在死区?
begin
if (u_1>umax)then //遇限消弱积分
begin
if (error<0) then //减小方向则计算
begin
Ui:=Ki*error;
end else Ui:=0;
end else if (u_1<umin) then //遇限消弱积分
begin
if (error>0) then //增加方向则计算
begin
Ui:=Ki*error;
end else Ui:=0;
end else Ui:=Ki*error; //积分作用
Ui_sum:=Ui_sum+Ui; //积分累加
if (Ui_sum>100) then //防止积分过饱和
begin
Ui_sum:=100;
mv:=100;
end else if(Ui_sum<0)then //防止积分过饱和
Ui_sum:=0;
Up:=Kp*error; //比例作用
mv:=Up+Ui_sum+Ud; //共同作用
if (mv>100) then //输出范围限制
mv:=100
else if (mv<0) then
mv:=0;
end else mv:=Ui_sum; //不在死区
error_1:=error; //返回偏差,作为上次偏差
U_1:=mv;
result:=mv; //最终输出
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -