2.1 PID算法數(shù)學(xué)推導(dǎo)過(guò)程
2.1.1 連續(xù)系統(tǒng)的PID算法
2.1.2 PID算法的離散化
2.2 位置型PID算法
2.2.1 MATLAB算法
clc
clear
%PID初始化
len = 500 ; %運(yùn)算次數(shù)
y = zeros(1,len); %期望值
y_d = zeros(1,len); %過(guò)程值
err = zeros(1,len); %誤差值
err_0 = 0 ; %k時(shí)刻誤差
err_1 = 0 ; %k-1時(shí)刻誤差
y_d_last = 0 ; %k-1時(shí)刻輸出
integral = 0; %積分值
Kp = 0.2; %比例系數(shù)
Kd = 0.2; %微分值
Ki = 0.015 ; %積分值
%運(yùn)算過(guò)程
for k=1:1:len
y(k) = 200 ; %期望輸出
err_0 = y(k)-y_d_last; %計(jì)算偏差
integral = integral+err_last; %誤差累計(jì)
y_d_last = Kp* err_0 + Ki*integral + Kd*( err_1- err_0); %位置型PID運(yùn)算公式
err_1 = err_0 ;
%更新參數(shù)
y_d(k) = y_d_last ;
err(k) = err_1 ;
end
%輸出圖像繪制
t = 1:1:len;
subplot( 2, 1, 1 ) ;
plot( t, y, 'r', t, y_d, 'b' );
axis([0 len, 0 1.5*y(1)])
title('輸出曲線');
xlabel('t')
ylabel('y(t)')
%誤差圖像繪制
subplot( 2, 1, 2 ) ;
plot( t, err );
axis([0 len, 0 1.5*y(1)])
title('誤差曲線');
xlabel('t')
ylabel('e(t)')
MATLAB運(yùn)行結(jié)果如下圖所示。
2.2.2 C算法
#include
struct _pid
{
float SetSpeed ; //設(shè)置速度
float ActualSpeed ; //實(shí)際速度
float err ; //誤差
float err_last ; //最終誤差
float Kp , Kd , Ki ; //比例系數(shù)
float voltage ; //輸出電壓
float integral ; //積分值
}pid;
void PID_Init()
{
pid.SetSpeed = 0 ;
pid.ActualSpeed = 0.0 ;
pid.err = 0.0 ;
pid.err_last = 0.0 ;
pid.voltage = 0.0 ;
pid.integral = 0.0 ;
pid.Kp = 0.2 ;
pid.Kd = 0.2 ;
pid.Ki = 0.015 ;
}
float PID_Realize( float Speed )
{
pid.SetSpeed = Speed ;
pid.err = pid.SetSpeed-pid.ActualSpeed ;
pid.integral += pid.err ;
pid.voltage = pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*( pid.err-pid.err_last ) ;
pid.err_last = pid.err ;
pid.ActualSpeed = pid.voltage*1.0 ;
return pid.ActualSpeed ;
}
void main()
{
int count ;
count = 0 ;
PID_Init() ;
while( count<850 )
{
float Speed = PID_Realize( 200.0 ) ;
count ++ ;
}
}
2.3 增量型PID算法
2.3.1 MATLAB算法
clc
clear
%PID初始化
len = 400 ; %運(yùn)算次數(shù)
y = zeros(1,len); %期望值
y_d = zeros(1,len); %過(guò)程值
err = zeros(1,len); %誤差值
err_0 = 0 ; %k時(shí)刻誤差
err_1 = 0 ; %k-1時(shí)刻誤差
err_2 = 0 ; %k-2時(shí)刻誤差
y_d_last = 0 ; %k-1時(shí)刻輸出
increment = 0 ; %增量
Kp = 0.2; %比例系數(shù)
Kd = 0.2; %微分值
Ki = 0.015 ; %積分值
%運(yùn)算過(guò)程
for k=1:1:len
y(k) = 200 ; %期望輸出
err_0 = y(k)-y_d_last; %計(jì)算偏差
increment = Kp*(err_0-err_1) + Ki*err_0 + Kd*(err_0-2*err_1+err_2);%增量型PID運(yùn)算公式
err_2 = err_1;
err_1 = err_0;
y_d_last = y_d_last + increment ; %輸出疊加
%更新參數(shù)
y_d(k) = y_d_last ;
err(k) = err_2;
end
%輸出圖像繪制
t = 1:1:len;
subplot( 2, 1, 1 ) ;
plot( t, y, 'r', t, y_d, 'b' );
axis([0 len, 0 1.5*y(1)])
title('輸出曲線');
xlabel('t')
ylabel('y(t)')
%誤差圖像繪制
subplot( 2, 1, 2 ) ;
plot( t, err );
axis([0 len, 0 1.5*y(1)])
title('誤差曲線');
xlabel('t')
ylabel('e(t)')
MATLAB運(yùn)行結(jié)果如下圖所示。
2.3.2 C算法
#include
struct _pid
{
float SetSpeed ; //設(shè)置速度
float ActualSpeed ; //實(shí)際速度
float err ; //誤差
float err_next ; //上一次誤差
float err_last ; //最終誤差
float Kp , Kd , Ki ; //比例系數(shù)
}pid;
void PID_Init()
{
pid.SetSpeed = 0 ;
pid.ActualSpeed = 0.0 ;
pid.err = 0.0 ;
pid.err_last = 0.0 ;
pid.err_next = 0.0 ;
pid.Kp = 0.2 ;
pid.Kd = 0.2 ;
pid.Ki = 0.015 ;
}
float PID_Realize( float Speed )
{
float incrementSpeed ;
pid.SetSpeed = Speed ;
pid.err = pid.SetSpeed-pid.ActualSpeed ;
incrementSpeed=
pid.Kp*(pid.err-pid.err_next)+pid.Ki*pid.err+pid.Kd*( pid.err-2*pid.err_next+pid.err_last ) ;
pid.err_last = pid.err_next ;
pid.err_next = pid.err ;
pid.ActualSpeed += incrementSpeed ;
return pid.ActualSpeed ;
}
void main()
{
int count ;
count = 0 ;
PID_Init() ;
while( count<850 )
{
float Speed = PID_Realize( 200.0 ) ;
count ++ ;
}
}
2.4 積分分離型PID算法
2.4.1 實(shí)現(xiàn)原理
為了消除系統(tǒng)的穩(wěn)態(tài)誤差,提高控制精度引入了積分環(huán)節(jié),但是在啟動(dòng),結(jié)束和大幅度增減設(shè)定時(shí),短時(shí)間內(nèi)系統(tǒng)輸出有很大的偏差,會(huì)造成PID運(yùn)算的積分積累,導(dǎo)致控制量超過(guò)執(zhí)行機(jī)構(gòu)可能允許的最大動(dòng)作范囲所對(duì)應(yīng)的極限控制量,從而引起較大的超調(diào),甚至震蕩,為了克服這一問(wèn)題,引入了積分分離的概念,基本思路是“當(dāng)給定值與反饋值偏差較大時(shí),取消積分的作用,當(dāng)被控量接近給定值時(shí),引入積分控制”,用于消除穩(wěn)態(tài)誤差,提高系統(tǒng)的精度。
2.4.2 MATLAB算法
clc
clear
%PID初始化
len = 500 ; %運(yùn)算次數(shù)
y = zeros(1,len); %期望值
y_d = zeros(1,len); %過(guò)程值
err = zeros(1,len); %誤差值
err_0 = 0 ; %k時(shí)刻誤差
err_1 = 0 ; %k-1時(shí)刻誤差
y_d_last = 0 ; %k-1時(shí)刻輸出
integral = 0; %積分值
Kp = 0.2; %比例系數(shù)
Kd = 0.2; %微分值
Ki = 0.015 ; %積分值
max = 400 ; %積分上限
index = 0 ; %積分有效性
%運(yùn)算過(guò)程
for k=1:1:len
y(k) = 200 ; %期望輸出
err_0 = y(k)-y_d_last; %計(jì)算偏差
if abs(err_0) <= y(k)
index = 1 ;
integral = integral+err_0; %誤差累計(jì)
else
index = 0 ;
end
y_d_last = Kp*err_0 + Ki*index*integral + Kd*(err_1-err_0); %位置型PID運(yùn)算公式
err_1 = err_0 ;
%更新參數(shù)
y_d(k) = y_d_last ;
err(k) = err_1 ;
end
%輸出圖像繪制
t = 1:1:len;
subplot( 2, 1, 1 ) ;
plot( t, y, 'r', t, y_d, 'b' );
axis([0 len, 0 1.5*y(1)])
title('輸出曲線');
xlabel('t')
ylabel('y(t)')
%誤差圖像繪制
subplot( 2, 1, 2 ) ;
plot( t, err );
axis([0 len, 0 1.5*y(1)])
title('誤差曲線');
xlabel('t')
ylabel('e(t)')
MATLAB運(yùn)行結(jié)果如下圖所示。
2.4.3 C算法
#include
#include
struct _pid
{
float SetSpeed ; //設(shè)置速度
float ActualSpeed ; //實(shí)際速度
float err ; //誤差
float err_last ; //最終誤差
float Kp , Kd , Ki ; //比例系數(shù)
float voltage ; //輸出電壓
float integral ; //積分值
float umax ; //積分上限
float umin ; //積分下限
}pid;
void PID_Init()
{
pid.SetSpeed = 0 ;
pid.ActualSpeed = 0.0 ;
pid.err = 0.0 ;
pid.err_last = 0.0 ;
pid.voltage = 0.0 ;
pid.integral = 0.0 ;
pid.Kp = 0.2 ;
pid.Kd = 0.2 ;
pid.Ki = 0.1 ;
pid.umax = 400 ;
pid.umin = -200 ;
}
float PID_Realize( float Speed )
{
char index ;
pid.SetSpeed = Speed ;
pid.err = pid.SetSpeed-pid.ActualSpeed ;
if( abs(pid.err)<= pid.umax )
{
index = 1 ;
pid.integral += pid.err ;
}
else
index = 0 ;
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 ;
return pid.ActualSpeed ;
}
void main()
{
int count ;
count = 0 ;
PID_Init() ;
while( count<1000 )
{
float Speed = PID_Realize( 200.0 ) ;
count ++ ;
printf( "%.2f\\n" , Speed ) ;
}
}
2.5 抗積分飽和型PID算法
2.5.1 實(shí)現(xiàn)原理
所謂積分飽和現(xiàn)象是指如果系統(tǒng)存在一個(gè)方向的偏差,PID控制器的輸出會(huì)因?yàn)榇嬖诜e分環(huán)節(jié)而不斷累積增大,從而導(dǎo)致執(zhí)行機(jī)構(gòu)達(dá)到極限位置,若控制器輸出響應(yīng)繼續(xù)增大,執(zhí)行器開(kāi)度不可能再增大,此時(shí)計(jì)算機(jī)輸出控制量超出了正常運(yùn)行范圍而進(jìn)入飽和區(qū),一旦系統(tǒng)出現(xiàn)反向偏差,輸出響應(yīng)逐漸從飽和區(qū)退出,進(jìn)入飽和區(qū)時(shí)間越長(zhǎng)則退出飽和區(qū)的時(shí)間也就隨之增加,這段時(shí)間里,執(zhí)行機(jī)構(gòu)仍然停留在極限位置而不能隨著偏差方向立即作出相應(yīng)的改變,造成控制性能惡化,這種現(xiàn)象稱為積分飽和現(xiàn)象或積分失控現(xiàn)象。實(shí)現(xiàn)抗積分飽和算法的基本思路是計(jì)算系統(tǒng)的響應(yīng)時(shí),首先判斷上一時(shí)刻的控制量是否超出了極限范圍,如果超過(guò)上限,則只累計(jì)反向偏差,若低于下限,則只累計(jì)正向偏差,從而避免控制量長(zhǎng)時(shí)間停留在飽和區(qū)。
2.5.2 MATLAB算法
clc
clear
%PID初始化
len = 180 ; %運(yùn)算次數(shù)
y = zeros(1,len); %期望值
y_d = zeros(1,len); %過(guò)程值
err = zeros(1,len); %誤差值
err_0 = 0 ; %k時(shí)刻誤差
err_1 = 0 ; %k-1時(shí)刻誤差
y_d_last = 0 ; %k-1時(shí)刻輸出
integral = 0; %積分值
Kp = 0.2; %比例系數(shù)
Kd = 0.2; %微分值
Ki = 0.1 ; %積分值
max = 400 ; %積分上限
min = -200 ; %積分下限
index = 0 ; %積分有效性
%運(yùn)算過(guò)程
for k=1:1:len
y(k) = 200 ; %期望輸出
err_0 = y(k)-y_d_last; %計(jì)算偏差
if y_d_last>max
if abs(err_0) <= y(k)
index = 1 ;
if err_0 < 0
integral = integral+err_0; %誤差累計(jì)
end
else
index = 0 ;
end
elseif y_d_last<min
if abs(err_0) <= y(k)
index = 1 ;
if err_0 > 0
integral = integral+err_0; %誤差累計(jì)
end
else
index = 0 ;
end
else
if abs(err_0) <= y(k)
index = 1 ;
integral = integral+err_0; %誤差累計(jì)
else
index = 0 ;
end
end
y_d_last = Kp*err_0 + Ki*index*integral + Kd*(err_1-err_0); %位置型PID運(yùn)算公式
err_1 = err_0 ;
%更新參數(shù)
y_d(k) = y_d_last ;
err(k) = err_1 ;
end
%輸出圖像繪制
t = 1:1:len;
subplot( 2, 1, 1 ) ;
plot( t, y, 'r', t, y_d, 'b' );
axis([0 len, 0 1.5*y(1)])
title('輸出曲線');
xlabel('t')
ylabel('y(t)')
%誤差圖像繪制
subplot( 2, 1, 2 ) ;
plot( t, err );
axis([0 len, 0 1.5*y(1)])
title('誤差曲線');
xlabel('t')
ylabel('e(t)')
MATLAB運(yùn)行結(jié)果如下圖所示。
2.5.3 C算法
#include
#include
struct _pid
{
float SetSpeed ; //設(shè)置速度
float ActualSpeed ; //實(shí)際速度
float err ; //誤差
float err_last ; //最終誤差
float Kp , Kd , Ki ; //比例系數(shù)
float voltage ; //輸出電壓
float integral ; //積分值
float umax ; //積分上限
float umin ; //積分下限
}pid;
void PID_Init()
{
pid.SetSpeed = 0 ;
pid.ActualSpeed = 0.0 ;
pid.err = 0.0 ;
pid.err_last = 0.0 ;
pid.voltage = 0.0 ;
pid.integral = 0.0 ;
pid.Kp = 0.2 ;
pid.Kd = 0.2 ;
pid.Ki = 0.1 ;
pid.umax = 400 ;
pid.umin = -200 ;
}
float PID_Realize( float Speed )
{
char index ;
pid.SetSpeed = Speed ;
pid.err = pid.SetSpeed-pid.ActualSpeed ;
if( pid.ActualSpeed>pid.umax )
{
if( abs(pid.err)<=200 )
{
index = 1 ;
if( pid.err<0 )
pid.integral += pid.err ;
}
else
index = 0 ;
}
else if( pid.ActualSpeed
2.6 梯形積分PID算法
2.6.1 實(shí)現(xiàn)原理
根據(jù)梯形算法的積分環(huán)節(jié)公式
作為PID控制的積分項(xiàng),其作用是消除余差,為了盡量減小余差,應(yīng)提高積分項(xiàng)運(yùn)算精度,為此可以將矩形積分改為梯形積分,具體實(shí)現(xiàn)的語(yǔ)句為pid.voltage = pid.Kppid.err+indexpid.Ki pid.integral/2+pid.Kd ( pid.err-pid.err_last ) ;
2.6.2 MATLAB算法
clc
clear
%PID初始化
len = 358 ; %運(yùn)算次數(shù)
y = zeros(1,len); %期望值
y_d = zeros(1,len); %過(guò)程值
err = zeros(1,len); %誤差值
err_0 = 0 ; %k時(shí)刻誤差
err_1 = 0 ; %k-1時(shí)刻誤差
y_d_last = 0 ; %k-1時(shí)刻輸出
integral = 0; %積分值
Kp = 0.2; %比例系數(shù)
Kd = 0.2; %微分值
Ki = 0.1 ; %積分值
max = 400 ; %積分上限
min = -200 ; %積分下限
index = 0 ; %積分有效性
%運(yùn)算過(guò)程
for k=1:1:len
y(k) = 200 ; %期望輸出
err_0 = y(k)-y_d_last; %計(jì)算偏差
if y_d_last>max
if abs(err_0) <= y(k)
index = 1 ;
if err_0 < 0
integral = integral+err_0; %誤差累計(jì)
end
else
index = 0 ;
end
elseif y_d_last<min
if abs(err_0) <= y(k)
index = 1 ;
if err_0 > 0
integral = integral+err_0; %誤差累計(jì)
end
else
index = 0 ;
end
else
if abs(err_0) <= y(k)
index = 1 ;
integral = integral+err_0; %誤差累計(jì)
else
index = 0 ;
end
end
y_d_last = Kp*err_0 + Ki*index*integral/2 + Kd*(err_1-err_0); %PID運(yùn)算公式
err_1 = err_0 ;
%更新參數(shù)
y_d(k) = y_d_last ;
err(k) = err_1 ;
end
%輸出圖像繪制
t = 1:1:len;
subplot( 2, 1, 1 ) ;
plot( t, y, 'r', t, y_d, 'b' );
axis([0 len, 0 1.5*y(1)])
title('輸出曲線');
xlabel('t')
ylabel('y(t)')
%誤差圖像繪制
subplot( 2, 1, 2 ) ;
plot( t, err );
axis([0 len, 0 1.5*y(1)])
title('誤差曲線');
xlabel('t')
ylabel('e(t)')
MATLAB運(yùn)行結(jié)果如下圖所示。
2.6.3 C算法
#include
#include
struct _pid
{
float SetSpeed ; //設(shè)置速度
float ActualSpeed ; //實(shí)際速度
float err ; //誤差
float err_last ; //最終誤差
float Kp , Kd , Ki ; //比例系數(shù)
float voltage ; //輸出電壓
float integral ; //積分值
float umax ; //積分上限
float umin ; //積分下限
}pid;
void PID_Init()
{
pid.SetSpeed = 0 ;
pid.ActualSpeed = 0.0 ;
pid.err = 0.0 ;
pid.err_last = 0.0 ;
pid.voltage = 0.0 ;
pid.integral = 0.0 ;
pid.Kp = 0.2 ;
pid.Kd = 0.2 ;
pid.Ki = 0.1 ;
pid.umax = 400 ;
pid.umin = -200 ;
}
float PID_Realize( float Speed )
{
char index ;
pid.SetSpeed = Speed ;
pid.err = pid.SetSpeed-pid.ActualSpeed ;
if( pid.ActualSpeed>pid.umax )
{
if( abs(pid.err)<=200 )
{
index = 1 ;
if( pid.err<0 )
pid.integral += pid.err ;
}
else
index = 0 ;
}
else if( pid.ActualSpeed
2.7 變積分PID算法
2.7.1 實(shí)現(xiàn)原理
變積分PID可以看做是積分分離的PID算法的更一般形式,在普通的PID控制算法中,由于積分系數(shù)是常數(shù),所以在整個(gè)控制過(guò)程中,積分增量是不變的,但是,系統(tǒng)對(duì)于積分項(xiàng)的要求是,系統(tǒng)偏差較大時(shí),積分作用應(yīng)該減弱甚至全無(wú),而在偏差較小時(shí),則應(yīng)該加強(qiáng),積分系數(shù)取大了會(huì)引起超調(diào),甚至積分飽和,取小了又不能短時(shí)間內(nèi)消除靜差,因此,需要根據(jù)系統(tǒng)偏差的大小改變積分速度。
變積分PID的基本思想是改變積分項(xiàng)的累加速度,使其與偏差大小相對(duì)應(yīng),偏差越大,積分越慢,偏差較小,積分越快。
這里給積分系數(shù)前加一個(gè)比例系數(shù)index,使最終的比例環(huán)節(jié)的積分系數(shù)為Ki*index。
2.7.1 MATLAB算法
clc
clear
%PID初始化
len = 200 ; %運(yùn)算次數(shù)
y = zeros(1,len); %期望值
y_d = zeros(1,len); %過(guò)程值
err = zeros(1,len); %誤差值
err_0 = 0 ; %k時(shí)刻誤差
err_1 = 0 ; %k-1時(shí)刻誤差
y_d_last = 0 ; %k-1時(shí)刻輸出
integral = 0; %積分值
Kp = 0.4; %比例系數(shù)
Kd = 0.2; %微分值
Ki = 0.2 ; %積分值
max = 400 ; %積分上限
min = -200 ; %積分下限
index = 0 ; %積分有效性
%運(yùn)算過(guò)程
for k=1:1:len
y(k) = 200 ; %期望輸出
err_0 = y(k)-y_d_last; %計(jì)算偏差
if abs(err_0) > max
index = 0 ;
elseif abs(err_0) < min
index = 1 ;
integral = integral+err_0; %誤差累計(jì)
else
index = ( max-abs(err_0) )/20 ;
integral = integral+err_0; %誤差累計(jì)
end
y_d_last = Kp*err_0 + Ki*index*integral/2 + Kd*(err_1-err_0); %PID運(yùn)算公式
err_1 = err_0 ;
%更新參數(shù)
y_d(k) = y_d_last ;
err(k) = err_1 ;
end
%輸出圖像繪制
t = 1:1:len;
subplot( 2, 1, 1 ) ;
plot( t, y, 'r', t, y_d, 'b' );
axis([0 len, 0 1.5*y(1)])
title('輸出曲線');
xlabel('t')
ylabel('y(t)')
%誤差圖像繪制
subplot( 2, 1, 2 ) ;
plot( t, err );
axis([0 len, 0 1.5*y(1)])
title('誤差曲線');
xlabel('t')
ylabel('e(t)')
MATLAB運(yùn)行結(jié)果如下圖所示。
2.7.2 C算法
#include
#include
struct _pid
{
float SetSpeed ; //設(shè)置速度
float ActualSpeed ; //實(shí)際速度
float err ; //誤差
float err_last ; //最終誤差
float Kp , Kd , Ki ; //比例系數(shù)
float voltage ; //輸出電壓
float integral ; //積分值
}pid;
void PID_Init()
{
pid.SetSpeed = 0 ;
pid.ActualSpeed = 0.0 ;
pid.err = 0.0 ;
pid.err_last = 0.0 ;
pid.voltage = 0.0 ;
pid.integral = 0.0 ;
pid.Kp = 0.4 ;
pid.Kd = 0.2 ;
pid.Ki = 0.2 ;
}
float PID_Realize( float Speed )
{
char index ;
pid.SetSpeed = Speed ;
pid.err = pid.SetSpeed-pid.ActualSpeed ;
if( abs(pid.err)>200 )
index = 0 ;
else if( abs(pid.err)<180 )
{
index = 1 ;
pid.integral += pid.err ;
}
else
{
index = ( 200-abs(pid.err) )/20 ;
pid.integral += pid.err ;
}
pid.voltage = pid.Kp*pid.err+index*pid.Ki*pid.integral/2+pid.Kd*( pid.err-pid.err_last ) ;
pid.err_last = pid.err ;
pid.ActualSpeed = pid.voltage*1.0 ;
return pid.ActualSpeed ;
}
void main()
{
int count ;
count = 0 ;
PID_Init() ;
while( count<150 )
{
float Speed = PID_Realize( 200.0 ) ;
count ++ ;
printf( "%.2f\\n" , Speed ) ;
}
}
2.8 專家PID與模糊PID算法思想
PID的控制思想非常簡(jiǎn)單,主要就是比例,積分和微分環(huán)節(jié)的參數(shù)整定過(guò)程,對(duì)于執(zhí)行期控制模型確定或者控制模型簡(jiǎn)單的系統(tǒng)來(lái)說(shuō),參數(shù)的整定可以通過(guò)計(jì)算獲得,對(duì)于一般精度要求不是很高的執(zhí)行器系統(tǒng),可以采用拼湊的方法進(jìn)行實(shí)驗(yàn)型的整定。
但是,實(shí)際的系統(tǒng)大部分屬于非線性系統(tǒng),或者說(shuō)是系統(tǒng)模型不確定的系統(tǒng),如果控制精度要求較高的話,那么對(duì)于參數(shù)的整定過(guò)程也是有難度的,專家PID和模糊PID就是為了滿足這方面的需求而設(shè)計(jì)的,專家算法和模糊算法都?xì)w屬于智能算法的范疇,智能算法最大的優(yōu)點(diǎn)就是在控制模型未知的情況下,可以對(duì)模型進(jìn)行控制,這里需要注意的是,專家PID也好,模糊PID也好,絕對(duì)不是專家系統(tǒng)或模糊算大與PID控制算法的簡(jiǎn)單加和,它是專家系統(tǒng)或者模糊算法在PID控制器參數(shù)整定上的應(yīng)用,也就是說(shuō),智能算法是輔助PID進(jìn)行參數(shù)整定的手段。
關(guān)于專家PID的C語(yǔ)言實(shí)現(xiàn),需要找到一些依據(jù),還需要從PID系數(shù)本身考慮。
1、比例系數(shù)Kp的作用是加快系統(tǒng)的響應(yīng)速度,提高系統(tǒng)的調(diào)節(jié)精度,Kp越大,系統(tǒng)的響應(yīng)速度越快,調(diào)節(jié)的精度越高,但是容易產(chǎn)生超調(diào),甚至?xí)鹣到y(tǒng)不穩(wěn)定,Kp取值過(guò)小,則會(huì)降低系統(tǒng)的調(diào)節(jié)精度,拖慢響應(yīng)速度,從而延長(zhǎng)調(diào)節(jié)時(shí)間,使系統(tǒng)的靜態(tài),動(dòng)態(tài)特性變差。
2、積分系數(shù)Ki的作用是消除系統(tǒng)的穩(wěn)態(tài)誤差,Ki越大,系統(tǒng)的靜態(tài)誤差消除得越快,但是若Ki過(guò)大,在響應(yīng)過(guò)程的初期就會(huì)產(chǎn)生積分飽和的現(xiàn)象,從而引起相應(yīng)過(guò)程的較大超調(diào),若Ki過(guò)小,將使系統(tǒng)靜態(tài)誤差難以消除,影像系統(tǒng)的調(diào)節(jié)精度。
3、微分系數(shù)Kd的作用是改善系統(tǒng)的動(dòng)態(tài)特性,其作用主要是在響應(yīng)過(guò)程中抑制偏差向任何方向的變化,對(duì)偏差變化進(jìn)行提前預(yù)報(bào),但是若Kd過(guò)大,會(huì)使響應(yīng)過(guò)程提前制動(dòng),從而延長(zhǎng)調(diào)節(jié)時(shí)間,而且會(huì)降低系統(tǒng)的抗干擾性。
2.9 PID算法應(yīng)用——電機(jī)轉(zhuǎn)速控制
PID是一種廣泛應(yīng)用在控制理論中的算法,以直流電機(jī)為例,要想精確控制電機(jī)的轉(zhuǎn)速就需要形成一種閉環(huán)控制思想。首先將一個(gè)默認(rèn)的輸入端的電壓值發(fā)送給直流電機(jī),通過(guò)轉(zhuǎn)速傳感器將當(dāng)前電機(jī)的轉(zhuǎn)速反饋到輸入端,通過(guò)與輸入端做運(yùn)算,如果轉(zhuǎn)速高于設(shè)定的值,則減小輸入端電壓,如果轉(zhuǎn)速低于設(shè)定的值,則提高輸入端電壓,由此形成了一種閉環(huán)控制回路,即通過(guò)不停的對(duì)輸出端進(jìn)行反饋,以達(dá)到精確控制的目的。為了使控制系統(tǒng)的速度更快,精確性更高,穩(wěn)定性更強(qiáng),PID控制器被廣泛應(yīng)用在了這里面,現(xiàn)在我們通過(guò)MATLAB的Simulink來(lái)實(shí)現(xiàn)直流電機(jī)的PID控制。
一個(gè)直流電機(jī)的模型如上圖所示,為了簡(jiǎn)化討論,假設(shè)轉(zhuǎn)子和轉(zhuǎn)軸都是剛體,且轉(zhuǎn)子受到的磁場(chǎng)恒定,轉(zhuǎn)子收到的摩擦力與速度成正比,該電機(jī)的物理參數(shù)為:
(1)轉(zhuǎn)子的轉(zhuǎn)動(dòng)慣量J=0.01kg·m^2^
(2)電機(jī)摩擦系數(shù)b=0.01N···m·s
(3)電動(dòng)勢(shì)常數(shù)Ke=0.01V/rad/sec
(4)電機(jī)扭矩常數(shù)Kt=0.01N·m/Amp
(5)電阻R=1Ω
(6)電感L=0.5H
我們希望控制器輸入1V電壓的時(shí)候穩(wěn)定狀態(tài)下保持0.1rad/sec的轉(zhuǎn)速,穩(wěn)定時(shí)間2s,穩(wěn)態(tài)誤差低于1%,受到階躍輸入干擾的時(shí)候超調(diào)小于5%。Matlab的仿真并不像之前學(xué)習(xí)51的時(shí)候用的Protuse一樣,可以看到直觀效果,Matlab的仿真實(shí)際是對(duì)數(shù)學(xué)的計(jì)算過(guò)程,即輸入與輸出必須都抽象成函數(shù)表達(dá)式進(jìn)行,通過(guò)觀察輸出的函數(shù)表達(dá)式與波形來(lái)判斷系統(tǒng)的工作狀態(tài)與性能。我們將上面得到的復(fù)頻域下的函數(shù)表達(dá)式代入?yún)?shù),得到
通過(guò)Simulink創(chuàng)建仿真圖如下圖所示。
雙擊PID控制器的圖標(biāo),打開(kāi)了以下對(duì)話框。
對(duì)話框內(nèi)的這三個(gè)參數(shù)就是PID控制器的三個(gè)參數(shù),其中Proportional代表比例環(huán)節(jié),Integral代表積分環(huán)節(jié),Derivative代表微分環(huán)節(jié),通過(guò)修改這三個(gè)參數(shù)達(dá)到實(shí)現(xiàn)控制系統(tǒng)的目的。
在PID控制中,這三個(gè)參數(shù)分別對(duì)系統(tǒng)控制有以下幾個(gè)作用:
(1)比例環(huán)節(jié)P:控制輸出響應(yīng)的速度,減小穩(wěn)態(tài)誤差,但是會(huì)增大超調(diào)量
(2)積分環(huán)節(jié)I:消除系統(tǒng)的穩(wěn)態(tài)誤差,加快達(dá)到穩(wěn)定所需的時(shí)間,但也會(huì)增大超調(diào)量
(3)微分環(huán)節(jié)D:加快動(dòng)態(tài)過(guò)程,容易引起系統(tǒng)震蕩,同樣,微分環(huán)節(jié)也會(huì)增大超調(diào)量
為了滿足:
(1)穩(wěn)定時(shí)間2s
(2)穩(wěn)態(tài)誤差低于1%
(3)超調(diào)小于5%
這三個(gè)條件,我們首先修改比例環(huán)節(jié),用來(lái)滿足穩(wěn)態(tài)誤差低于1%這個(gè)參數(shù)。通過(guò)實(shí)驗(yàn)發(fā)現(xiàn),當(dāng)比例環(huán)節(jié)設(shè)定在100以上的時(shí)候,穩(wěn)態(tài)誤差低于1%,如下圖所示。
但是我們發(fā)現(xiàn)
即系統(tǒng)的超調(diào)量較大,達(dá)到了20%,此時(shí)需要調(diào)節(jié)微分環(huán)節(jié)達(dá)到目的,我們通過(guò)實(shí)驗(yàn)發(fā)現(xiàn),當(dāng)微分環(huán)節(jié)超過(guò)10時(shí),系統(tǒng)的超調(diào)如下圖所示。
此時(shí)系統(tǒng)已經(jīng)不存在超調(diào),現(xiàn)在只需要解決穩(wěn)定時(shí)間小于2s這個(gè)參數(shù)即可,我們通過(guò)設(shè)置積分環(huán)節(jié)達(dá)到這個(gè)目的,通過(guò)實(shí)驗(yàn)發(fā)現(xiàn),當(dāng)系統(tǒng)的積分環(huán)節(jié)大于200時(shí),穩(wěn)定時(shí)間小于2s。此時(shí)整個(gè)系統(tǒng)的波形如下圖所示。
-
PID
+關(guān)注
關(guān)注
35文章
1467瀏覽量
85094 -
穩(wěn)態(tài)誤差
+關(guān)注
關(guān)注
0文章
8瀏覽量
2082 -
系統(tǒng)
+關(guān)注
關(guān)注
1文章
1006瀏覽量
21275
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論