程序是自己編的,根據(jù)多方資料改寫了一部分,為增量式PID算法。程序采用浮點(diǎn)形式,如果MCU速度不夠快,可根據(jù)需求轉(zhuǎn)換定點(diǎn)運(yùn)算。
關(guān)鍵變量:ref——設(shè)置的參數(shù);feb——采樣反饋;根據(jù)實(shí)際情況修改這兩個(gè)變量即可。
相關(guān)參數(shù):Kp、Ti、Td、T:根據(jù)各項(xiàng)目的控制對象不同而修改其定義值。
//定義變量
double ref = 0;//設(shè)置參數(shù)
double feb = 0;//采樣反饋
int pwm_var =
0;
//PID調(diào)整量
Uint16 PWM_out = 0; //PWM輸出量
double Uo = 0;
double Ek = 0;
double Ei = 0;
double Ed = 0;
#define Kp
8
//PID調(diào)節(jié)的比例常數(shù)
#define Ti
0.05
//PID調(diào)節(jié)的積分常數(shù)
#define Td
0.02
//PID調(diào)節(jié)的微分時(shí)間常數(shù)
#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
//誤差的閥值,小于這個(gè)數(shù)值的時(shí)候,不做PID調(diào)整,避免誤差較小時(shí)頻繁調(diào)節(jié)引起震蕩
#define Emin 3
//調(diào)整值限幅,防止積分飽和
#define Umax 100
#define Umin -100
//輸出值限幅
#define Pmax 15500
#define Pmin 200
///////////////////////////////////////////////////////////////////
//////
PID運(yùn)算
///////
void pid_ctrl(void)
{
Ek = ref -
feb;
//差值運(yùn)算
if( fabs(Ek) < Emin )
//誤差的閥值(死區(qū)控制??)
{
pwm_var =
0;
}
else
{
Uo = Kpp*Ek
+ Ki*Ei + Kd*Ed;//PID計(jì)算
Ed =
Ei;
Ei =
Ek;
pwm_var =
(int)Uo;
//強(qiáng)制轉(zhuǎn)化調(diào)整量,PWM為整數(shù)
if(pwm_var
>= Umax)pwm_var =
Umax;
//調(diào)整值限幅,防止積分飽和
if(pwm_var
<= Umin)pwm_var =
Umin;
//調(diào)整值限幅,防止積分飽和
}
PWM_out +=
pwm_var;
//調(diào)整PWM輸出
if(PWM_out > Pmax)PWM_out =
Pmax;
//輸出值限幅
if(PWM_out < Pmin)PWM_out =
Pmin;
//輸出值限幅
TBCCR1 = PWM_out;//輸出給寄存器,改變PWM占空比
}
///////////////////////////////////////////////////////////////////
調(diào)用示例:
void main(void)
{
ref = 120.6;
while(1)
{
feb =
adc_sample();
pid_ctrl();
}
}
另外附上:PID調(diào)節(jié)經(jīng)驗(yàn)總結(jié)(搜索資源)
PID控制器參數(shù)選擇的方法很多,例如試湊法、臨界比例度法、擴(kuò)充臨界比例度法等。但是,對于PID控制而言,參數(shù)的選擇始終是一件非常煩雜的工作,需要經(jīng)過不斷的調(diào)整才能得到較為滿意的控制效果。依據(jù)經(jīng)驗(yàn),一般PID參數(shù)確定的步驟如下:
(1)確定比例系數(shù)Kp
確定比例系數(shù)Kp時(shí),首先去掉PID的積分項(xiàng)和微分項(xiàng),可以令Ti=0、Td=0,使之成為純比例調(diào)節(jié)。輸入設(shè)定為系統(tǒng)允許輸出最大值的60%~70%,比例系數(shù)Kp由0開始逐漸增大,直至系統(tǒng)出現(xiàn)振蕩;再反過來,從此時(shí)的比例系數(shù)Kp逐漸減小,直至系統(tǒng)振蕩消失。記錄此時(shí)的比例系數(shù)Kp,設(shè)定PID的比例系數(shù)Kp為當(dāng)前值的60%~70%。
(2)確定積分時(shí)間常數(shù)Ti
比例系數(shù)Kp確定之后,設(shè)定一個(gè)較大的積分時(shí)間常數(shù)Ti,然后逐漸減小Ti,直至系統(tǒng)出現(xiàn)振蕩,然后再反過來,逐漸增大Ti,直至系統(tǒng)振蕩消失。記錄此時(shí)的Ti,設(shè)定PID的積分時(shí)間常數(shù)Ti為當(dāng)前值的
150%~180%。
(3)確定微分時(shí)間常數(shù)Td
微分時(shí)間常數(shù)Td一般不用設(shè)定,為0即可,此時(shí)PID調(diào)節(jié)轉(zhuǎn)換為PI調(diào)節(jié)。如果需要設(shè)定,則與確定Kp的方法相同,取不振蕩時(shí)其值的30%。
(4)系統(tǒng)空載、帶載聯(lián)調(diào)
對PID參數(shù)進(jìn)行微調(diào),直到滿足性能要求。
|
程序是自己編的,根據(jù)多方資料改寫了一部分,為增量式PID算法。程序采用浮點(diǎn)形式,如果MCU速度不夠快,可根據(jù)需求轉(zhuǎn)換定點(diǎn)運(yùn)算。
關(guān)鍵變量:ref——設(shè)置的參數(shù);feb——采樣反饋;根據(jù)實(shí)際情況修改這兩個(gè)變量即可。
相關(guān)參數(shù):Kp、Ti、Td、T:根據(jù)各項(xiàng)目的控制對象不同而修改其定義值。
//定義變量
double ref = 0;//設(shè)置參數(shù)
double feb = 0;//采樣反饋
int pwm_var =
0;
//PID調(diào)整量
Uint16 PWM_out = 0; //PWM輸出量
double Uo = 0;
double Ek = 0;
double Ei = 0;
double Ed = 0;
#define Kp
8
//PID調(diào)節(jié)的比例常數(shù)
#define Ti
0.05
//PID調(diào)節(jié)的積分常數(shù)
#define Td
0.02
//PID調(diào)節(jié)的微分時(shí)間常數(shù)
#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
//誤差的閥值,小于這個(gè)數(shù)值的時(shí)候,不做PID調(diào)整,避免誤差較小時(shí)頻繁調(diào)節(jié)引起震蕩
#define Emin 3
//調(diào)整值限幅,防止積分飽和
#define Umax 100
#define Umin -100
//輸出值限幅
#define Pmax 15500
#define Pmin 200
///////////////////////////////////////////////////////////////////
//////
PID運(yùn)算
///////
void pid_ctrl(void)
{
Ek = ref -
feb;
//差值運(yùn)算
if( fabs(Ek) < Emin )
//誤差的閥值(死區(qū)控制??)
{
pwm_var =
0;
}
else
{
Uo = Kpp*Ek
+ Ki*Ei + Kd*Ed;//PID計(jì)算
Ed =
Ei;
Ei =
Ek;
pwm_var =
(int)Uo;
//強(qiáng)制轉(zhuǎn)化調(diào)整量,PWM為整數(shù)
if(pwm_var
>= Umax)pwm_var =
Umax;
//調(diào)整值限幅,防止積分飽和
if(pwm_var
<= Umin)pwm_var =
Umin;
//調(diào)整值限幅,防止積分飽和
}
PWM_out +=
pwm_var;
//調(diào)整PWM輸出
if(PWM_out > Pmax)PWM_out =
Pmax;
//輸出值限幅
if(PWM_out < Pmin)PWM_out =
Pmin;
//輸出值限幅
TBCCR1 = PWM_out;//輸出給寄存器,改變PWM占空比
}
///////////////////////////////////////////////////////////////////
調(diào)用示例:
void main(void)
{
ref = 120.6;
while(1)
{
feb =
adc_sample();
pid_ctrl();
}
}
另外附上:PID調(diào)節(jié)經(jīng)驗(yàn)總結(jié)(搜索資源)
PID控制器參數(shù)選擇的方法很多,例如試湊法、臨界比例度法、擴(kuò)充臨界比例度法等。但是,對于PID控制而言,參數(shù)的選擇始終是一件非常煩雜的工作,需要經(jīng)過不斷的調(diào)整才能得到較為滿意的控制效果。依據(jù)經(jīng)驗(yàn),一般PID參數(shù)確定的步驟如下:
(1)確定比例系數(shù)Kp
確定比例系數(shù)Kp時(shí),首先去掉PID的積分項(xiàng)和微分項(xiàng),可以令Ti=0、Td=0,使之成為純比例調(diào)節(jié)。輸入設(shè)定為系統(tǒng)允許輸出最大值的60%~70%,比例系數(shù)Kp由0開始逐漸增大,直至系統(tǒng)出現(xiàn)振蕩;再反過來,從此時(shí)的比例系數(shù)Kp逐漸減小,直至系統(tǒng)振蕩消失。記錄此時(shí)的比例系數(shù)Kp,設(shè)定PID的比例系數(shù)Kp為當(dāng)前值的60%~70%。
(2)確定積分時(shí)間常數(shù)Ti
比例系數(shù)Kp確定之后,設(shè)定一個(gè)較大的積分時(shí)間常數(shù)Ti,然后逐漸減小Ti,直至系統(tǒng)出現(xiàn)振蕩,然后再反過來,逐漸增大Ti,直至系統(tǒng)振蕩消失。記錄此時(shí)的Ti,設(shè)定PID的積分時(shí)間常數(shù)Ti為當(dāng)前值的
150%~180%。
(3)確定微分時(shí)間常數(shù)Td
微分時(shí)間常數(shù)Td一般不用設(shè)定,為0即可,此時(shí)PID調(diào)節(jié)轉(zhuǎn)換為PI調(diào)節(jié)。如果需要設(shè)定,則與確定Kp的方法相同,取不振蕩時(shí)其值的30%。
(4)系統(tǒng)空載、帶載聯(lián)調(diào)
對PID參數(shù)進(jìn)行微調(diào),直到滿足性能要求。
程序是自己編的,根據(jù)多方資料改寫了一部分,為增量式PID算法。程序采用浮點(diǎn)形式,如果MCU速度不夠快,可根據(jù)需求轉(zhuǎn)換定點(diǎn)運(yùn)算。
關(guān)鍵變量:ref——設(shè)置的參數(shù);feb——采樣反饋;根據(jù)實(shí)際情況修改這兩個(gè)變量即可。
相關(guān)參數(shù):Kp、Ti、Td、T:根據(jù)各項(xiàng)目的控制對象不同而修改其定義值。
//定義變量
double ref = 0;//設(shè)置參數(shù)
double feb = 0;//采樣反饋
int pwm_var =
0;
//PID調(diào)整量
Uint16 PWM_out = 0; //PWM輸出量
double Uo = 0;
double Ek = 0;
double Ei = 0;
double Ed = 0;
#define Kp
8
//PID調(diào)節(jié)的比例常數(shù)
#define Ti
0.05
//PID調(diào)節(jié)的積分常數(shù)
#define Td
0.02
//PID調(diào)節(jié)的微分時(shí)間常數(shù)
#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
//誤差的閥值,小于這個(gè)數(shù)值的時(shí)候,不做PID調(diào)整,避免誤差較小時(shí)頻繁調(diào)節(jié)引起震蕩
#define Emin 3
//調(diào)整值限幅,防止積分飽和
#define Umax 100
#define Umin -100
//輸出值限幅
#define Pmax 15500
#define Pmin 200
///////////////////////////////////////////////////////////////////
//////
PID運(yùn)算
///////
void pid_ctrl(void)
{
Ek = ref -
feb;
//差值運(yùn)算
if( fabs(Ek) < Emin )
//誤差的閥值(死區(qū)控制??)
{
pwm_var =
0;
}
else
{
Uo = Kpp*Ek
+ Ki*Ei + Kd*Ed;//PID計(jì)算
Ed =
Ei;
Ei =
Ek;
pwm_var =
(int)Uo;
//強(qiáng)制轉(zhuǎn)化調(diào)整量,PWM為整數(shù)
if(pwm_var
>= Umax)pwm_var =
Umax;
//調(diào)整值限幅,防止積分飽和
if(pwm_var
<= Umin)pwm_var =
Umin;
//調(diào)整值限幅,防止積分飽和
}
PWM_out +=
pwm_var;
//調(diào)整PWM輸出
if(PWM_out > Pmax)PWM_out =
Pmax;
//輸出值限幅
if(PWM_out < Pmin)PWM_out =
Pmin;
//輸出值限幅
TBCCR1 = PWM_out;//輸出給寄存器,改變PWM占空比
}
///////////////////////////////////////////////////////////////////
調(diào)用示例:
void main(void)
{
ref = 120.6;
while(1)
{
feb =
adc_sample();
pid_ctrl();
}
}
另外附上:PID調(diào)節(jié)經(jīng)驗(yàn)總結(jié)(搜索資源)
PID控制器參數(shù)選擇的方法很多,例如試湊法、臨界比例度法、擴(kuò)充臨界比例度法等。但是,對于PID控制而言,參數(shù)的選擇始終是一件非常煩雜的工作,需要經(jīng)過不斷的調(diào)整才能得到較為滿意的控制效果。依據(jù)經(jīng)驗(yàn),一般PID參數(shù)確定的步驟如下:
(1)確定比例系數(shù)Kp
確定比例系數(shù)Kp時(shí),首先去掉PID的積分項(xiàng)和微分項(xiàng),可以令Ti=0、Td=0,使之成為純比例調(diào)節(jié)。輸入設(shè)定為系統(tǒng)允許輸出最大值的60%~70%,比例系數(shù)Kp由0開始逐漸增大,直至系統(tǒng)出現(xiàn)振蕩;再反過來,從此時(shí)的比例系數(shù)Kp逐漸減小,直至系統(tǒng)振蕩消失。記錄此時(shí)的比例系數(shù)Kp,設(shè)定PID的比例系數(shù)Kp為當(dāng)前值的60%~70%。
(2)確定積分時(shí)間常數(shù)Ti
比例系數(shù)Kp確定之后,設(shè)定一個(gè)較大的積分時(shí)間常數(shù)Ti,然后逐漸減小Ti,直至系統(tǒng)出現(xiàn)振蕩,然后再反過來,逐漸增大Ti,直至系統(tǒng)振蕩消失。記錄此時(shí)的Ti,設(shè)定PID的積分時(shí)間常數(shù)Ti為當(dāng)前值的
150%~180%。
(3)確定微分時(shí)間常數(shù)Td
微分時(shí)間常數(shù)Td一般不用設(shè)定,為0即可,此時(shí)PID調(diào)節(jié)轉(zhuǎn)換為PI調(diào)節(jié)。如果需要設(shè)定,則與確定Kp的方法相同,取不振蕩時(shí)其值的30%。
(4)系統(tǒng)空載、帶載聯(lián)調(diào)
對PID參數(shù)進(jìn)行微調(diào),直到滿足性能要求。
|
程序是自己編的,根據(jù)多方資料改寫了一部分,為增量式PID算法。程序采用浮點(diǎn)形式,如果MCU速度不夠快,可根據(jù)需求轉(zhuǎn)換定點(diǎn)運(yùn)算。
關(guān)鍵變量:ref——設(shè)置的參數(shù);feb——采樣反饋;根據(jù)實(shí)際情況修改這兩個(gè)變量即可。
相關(guān)參數(shù):Kp、Ti、Td、T:根據(jù)各項(xiàng)目的控制對象不同而修改其定義值。
//定義變量
double ref = 0;//設(shè)置參數(shù)
double feb = 0;//采樣反饋
int pwm_var =
0;
//PID調(diào)整量
Uint16 PWM_out = 0; //PWM輸出量
double Uo = 0;
double Ek = 0;
double Ei = 0;
double Ed = 0;
#define Kp
8
//PID調(diào)節(jié)的比例常數(shù)
#define Ti
0.05
//PID調(diào)節(jié)的積分常數(shù)
#define Td
0.02
//PID調(diào)節(jié)的微分時(shí)間常數(shù)
#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
//誤差的閥值,小于這個(gè)數(shù)值的時(shí)候,不做PID調(diào)整,避免誤差較小時(shí)頻繁調(diào)節(jié)引起震蕩
#define Emin 3
//調(diào)整值限幅,防止積分飽和
#define Umax 100
#define Umin -100
//輸出值限幅
#define Pmax 15500
#define Pmin 200
///////////////////////////////////////////////////////////////////
//////
PID運(yùn)算
///////
void pid_ctrl(void)
{
Ek = ref -
feb;
//差值運(yùn)算
if( fabs(Ek) < Emin )
//誤差的閥值(死區(qū)控制??)
{
pwm_var =
0;
}
else
{
Uo = Kpp*Ek
+ Ki*Ei + Kd*Ed;//PID計(jì)算
Ed =
Ei;
Ei =
Ek;
pwm_var =
(int)Uo;
//強(qiáng)制轉(zhuǎn)化調(diào)整量,PWM為整數(shù)
if(pwm_var
>= Umax)pwm_var =
Umax;
//調(diào)整值限幅,防止積分飽和
if(pwm_var
<= Umin)pwm_var =
Umin;
//調(diào)整值限幅,防止積分飽和
}
PWM_out +=
pwm_var;
//調(diào)整PWM輸出
if(PWM_out > Pmax)PWM_out =
Pmax;
//輸出值限幅
if(PWM_out < Pmin)PWM_out =
Pmin;
//輸出值限幅
TBCCR1 = PWM_out;//輸出給寄存器,改變PWM占空比
}
///////////////////////////////////////////////////////////////////
調(diào)用示例:
void main(void)
{
ref = 120.6;
while(1)
{
feb =
adc_sample();
pid_ctrl();
}
}
另外附上:PID調(diào)節(jié)經(jīng)驗(yàn)總結(jié)(搜索資源)
PID控制器參數(shù)選擇的方法很多,例如試湊法、臨界比例度法、擴(kuò)充臨界比例度法等。但是,對于PID控制而言,參數(shù)的選擇始終是一件非常煩雜的工作,需要經(jīng)過不斷的調(diào)整才能得到較為滿意的控制效果。依據(jù)經(jīng)驗(yàn),一般PID參數(shù)確定的步驟如下:
(1)確定比例系數(shù)Kp
確定比例系數(shù)Kp時(shí),首先去掉PID的積分項(xiàng)和微分項(xiàng),可以令Ti=0、Td=0,使之成為純比例調(diào)節(jié)。輸入設(shè)定為系統(tǒng)允許輸出最大值的60%~70%,比例系數(shù)Kp由0開始逐漸增大,直至系統(tǒng)出現(xiàn)振蕩;再反過來,從此時(shí)的比例系數(shù)Kp逐漸減小,直至系統(tǒng)振蕩消失。記錄此時(shí)的比例系數(shù)Kp,設(shè)定PID的比例系數(shù)Kp為當(dāng)前值的60%~70%。
(2)確定積分時(shí)間常數(shù)Ti
比例系數(shù)Kp確定之后,設(shè)定一個(gè)較大的積分時(shí)間常數(shù)Ti,然后逐漸減小Ti,直至系統(tǒng)出現(xiàn)振蕩,然后再反過來,逐漸增大Ti,直至系統(tǒng)振蕩消失。記錄此時(shí)的Ti,設(shè)定PID的積分時(shí)間常數(shù)Ti為當(dāng)前值的
150%~180%。
(3)確定微分時(shí)間常數(shù)Td
微分時(shí)間常數(shù)Td一般不用設(shè)定,為0即可,此時(shí)PID調(diào)節(jié)轉(zhuǎn)換為PI調(diào)節(jié)。如果需要設(shè)定,則與確定Kp的方法相同,取不振蕩時(shí)其值的30%。
(4)系統(tǒng)空載、帶載聯(lián)調(diào)
對PID參數(shù)進(jìn)行微調(diào),直到滿足性能要求。
|
|