久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

增量式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è)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(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ā)表

    請遵守用戶 評論公約

    類似文章 更多