一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

增量式PID算法

 幾木夕 2014-08-09
    程序是自己編的,根據(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         //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         //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         //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         //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),直到滿足性能要求。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    日本熟妇五十一区二区三区| 欧美一区二区三区高潮菊竹| 欧美精品在线播放一区二区| 操白丝女孩在线观看免费高清| 乱女午夜精品一区二区三区| 国产亚洲欧美一区二区| 黄片免费播放一区二区| 大胆裸体写真一区二区| 四十女人口红哪个色好看| 日本欧美在线一区二区三区| 日韩欧美一区二区亚洲| 一区二区福利在线视频| 欧美日韩视频中文字幕| 黑鬼糟蹋少妇资源在线观看| 国产一区二区三区丝袜不卡| 麻豆蜜桃星空传媒在线观看| 日韩精品中文字幕在线视频| 亚洲av熟女一区二区三区蜜桃 | 日韩人妻中文字幕精品| 国产成人精品午夜福利| 精品偷拍一区二区三区| 91久久国产福利自产拍| 国产一区二区久久综合| 日韩视频在线观看成人| 亚洲熟女一区二区三四区| 中文字日产幕码三区国产| 国产精品日韩精品一区| 成人午夜爽爽爽免费视频| 日韩一区二区三区嘿嘿| 欧美日本精品视频在线观看| 中文字幕人妻综合一区二区| 91超频在线视频中文字幕| 黑丝国产精品一区二区| 国产精品二区三区免费播放心| 千仞雪下面好爽好紧好湿全文| 国产女优视频一区二区| 五月综合婷婷在线伊人| 国产日韩欧美专区一区| 欧美日韩国产一级91| 欧美成人免费视频午夜色| 国产精品不卡高清在线观看 |