PID制御学習要約

11135 ワード

レギュレータの説明:
https://wenku.baidu.com/view/3ff4d807ba1aa8114431d928.html
PID制御解釈
[元のアドレス]http://blog.gkong.com/liaochangchu_117560.ashxPIDは比例,積分,微分の略称であり,PID制御の難点はプログラミングではなくコントローラのパラメータ整定である.パラメータ整定の鍵は各パラメータの物理的意義を正確に理解することであり,PID制御の原理は炉温の手動制御で理解できる.本文を読むには深い数学の知識は必要ありません.1.経験のある作業者を比例して電気加熱炉の炉温を手動で制御し、非常に良い制御品質を得ることができ、PID制御は人工制御の制御戦略と多くの類似点がある.次に,作業者がどのように比例制御の考え方で電気加熱炉の炉温を手動で制御するかを紹介する.熱電対で炉温を検出し,温度値をデジタルメータで表示すると仮定した.制御中、作業者は炉温を目で読み取り、炉温の所定値と比較して温度の誤差値を得た.次いで、ポテンショメータを手で操作し、加熱電流を調整し、炉温を所定値付近に保つ.運転者は、炉温が所定値に安定しているときのポテンショメータの略位置(位置Lと呼ぶ)を知り、そのときの温度誤差値に応じて加熱電流を制御するポテンショメータの回転角を調整する.炉温が所定値未満の場合、誤差は正であり、位置Lに基づいてポテンショメータの回転角を時計回りに大きくして加熱電流を大きくする.炉温が所定値より大きい場合、誤差は負であり、位置Lに基づいて反時計回りにポテンショメータの回転角を小さくし、回転角と位置Lの差を誤差に比例させる.上記制御戦略は、PIDコントローラ出力における比例部分が誤差に比例する比例制御である.閉ループには様々な遅延作用が存在する.例えば、ポテンショメータの回転角を調整した後、温度が新しい回転角に対応する定常値に上昇するまで大きな時間遅延がある.遅延要因の存在により、ポテンショメータの回転角を調整した後、すぐに調整の効果が見られないため、閉ループ制御システムの調整が困難な主な原因はシステムにおける遅延作用である.比例制御の比例係数が小さすぎると、すなわち、調整後のポテンショメータの回転角と位置Lとの差が小さすぎて、調整の力が足りず、システム出力量の変化が遅くなり、調整に要する総時間が長すぎる.比例係数が大きすぎると、調整後のポテンショメータの回転角と位置Lの差が大きすぎて、調整力が強すぎて、調整が行き過ぎて、温度が高くなったり低くなったりして、振動します.比例係数を大きくすると,システム反応が感度が高く,調節速度が速くなり,定常誤差を低減できる.しかし,スケール係数が大会を過ぎると超変調量が増大し,発振回数が増加し,調整時間が長くなり,ダイナミック性能が悪くなり,スケール係数が大きすぎて閉ループ系が不安定になる.単純な比例制御では、調整が適切で、誤差を完全に解消することは難しい.2.積分制御PIDコントローラにおける積分は、図1の誤差曲線が座標軸に囲まれた面積(図中の灰色部分)に対応する.PID制御プログラムは周期的に実行され、実行される周期をサンプリング周期と呼ぶ.コンピュータのプログラムは図1の各矩形面積の和で正確な積分を近似し,図中のTSがサンプリング周期である.PID控制学习汇总_第1张图片図1積分演算模式図PID演算のたびに、従来の積分値に基づいて、現在の誤差値ev(n)に比例する微小部分を増加させる.誤差が負の場合,積分の増分は負である.手動で温度を調整する場合、積分制御は、そのときの誤差値に基づいてポテンショメータの角度を周期的に微調整することに相当し、各調整の角度増分値はそのときの誤差値に比例する.温度が設定値を下回ると誤差が正になり、積分項が大きくなり、加熱電流が徐々に増大し、逆に積分項が減少する.したがって誤差がゼロでない限り,コントローラの出力は積分作用によって変化する.積分調整の「大方向」は正しく,積分項は誤差を低減する役割を果たす.システムが安定状態になるまで、誤差は常にゼロであり、比例部と微分部はいずれもゼロであり、積分部は変化せず、定常状態に必要なコントローラの出力値にちょうど等しく、上記温度制御システムにおけるポテンショメータ回転角の位置Lに対応する.従って積分部分の役割は定常誤差を解消し,制御精度を向上させ,積分作用は一般的に必要である.PIDコントローラ出力の積分部分は誤差の積分に比例する.積分時間TIは積分項の分母においてTIが小さいほど積分項の変化速度が速くなり積分作用が強くなるからである.3.PI制御コントローラ出力の積分項は、現在の誤差値と過去の誤差値の累積値に比例するため、積分作用自体が深刻なヒステリシス特性を有し、システムの安定性に不利である.積分項の係数がうまく設定されていないと,その負の作用は積分作用自体で迅速に修正することは困難である.スケール項は遅延せず,誤差が現れるとスケール部分が直ちに機能する.従って積分作用は単独ではあまり用いられず,PIまたはPIDコントローラを構成するために一般的にスケールと微分と組み合わせて用いられる.PIとPIDコントローラは,単純な比例調整に定常誤差があるという欠点を克服するとともに,単純な積分調整応答が遅く,動的性能が悪いという欠点を回避するため広く用いられている.コントローラに積分作用(例えばPIまたはPID制御)がある場合、積分はステップ入力の定常誤差を除去することができ、この場合、比例係数を小さくすることができる.積分作用が強すぎる(すなわち積分時間が小さすぎる)と、微調整ポテンショメータの角度値が大きすぎるたびに、その蓄積作用はシステム出力の動的性能を悪くし、超変調量を増大させ、システムを不安定にする.積分作用が弱すぎる(すなわち積分時間が大きすぎる)と、定常誤差を解消する速度が遅すぎて、積分時間の値が適当になるべきである.4.微分作用誤差の微分は誤差の変化速度であり、誤差の変化が速いほどその微分絶対値が大きくなる.誤差が増大すると、その微分は正である.誤差は減少し,その微分は負であった.コントローラ出力量の微分部分は誤差の微分に比例し,制御量の変化傾向を反映している.経験のある作業者は温度上昇が速すぎるが、まだ設定値に達していない場合、温度変化の傾向により、設定値を超える温度が予想され、オーバーシュートが発生する.そこでポテンショメータの回転角を調節し、加熱電流を早めに低減する.これは、兵士が遠方の移動目標を射撃する際、弾丸運動の時間を考慮して一定の繰り上げ量が必要になるのと同じである.PID控制学习汇总_第2张图片図2のステップ応答曲線図2のc(∞)は、制御量c(t)の定常値または制御量の所望値であり、誤差e(t)=c(∞)−c(t)である.図2の起動プロセスの上昇段階において、制御された量は、その定常状態値を超えていない.しかし、誤差e(t)が減少し続けるため、誤差の微分とコントローラ出力の微分部分が負の値となり、コントローラの出力量が減少し、制御量の上昇を阻害するために予めブレーキ作用が与えられたことに相当するので、オーバーシュート量を減少させることができる.従って微分制御は先頭と予測の特性を有し,超調が現れない前に制御作用を早期に与えることができる.閉ループ制御システムの振動がさらに不安定な根本的な原因は,大きなヒステリシス要因にある.微分項は誤差変化の傾向を予測できるため,この「先端」の役割はヒステリシス要因の影響を相殺できる.適切な微分制御作用は超変調量を減少させ,システムの安定性を増加させることができる.大きなヒステリシス特性を持つ制御対象に対して,PI制御の効果が望ましくない場合,微分制御を増大させて,調整過程におけるシステムの動的特性を改善することが考えられる.微分時間を0に設定すると、微分部分は機能しません.微分時間は微分作用の強弱に比例し,微分時間が大きいほど微分作用が強い.微分時間が大きすぎると、誤差が急速に変化すると、応答曲線に「バリ」が発生する可能性があります.微分制御の欠点は干渉ノイズに敏感であり,システムが干渉を抑制する能力を低下させることである.このため、微分部分に慣性フィルタリングの一環を追加することができる.5.サンプリング周期PID制御プログラムは周期的に実行され、実行される周期をサンプリング周期と呼ぶ.サンプリングサイクルが小さいほど、サンプリング値はシミュレーション量の変化を反映します.しかし、小さすぎるとCPUの演算作業量が増加し、隣接する2回のサンプリングの差はほとんど変化せず、PIDコントローラから出力される微分部分をゼロに近づけるので、サンプリングサイクルを小さくしすぎてはいけない.制御量が急速に変化する場合(例えば、起動中の上昇段階)、サンプリング点数が少なすぎるため、採取されたシミュレーション量の重要な情報が失われないように、十分なサンプリング点数があることを保証しなければならない.6.PIDパラメータの調整方法PIDコントローラパラメータを整定する際、コントローラのパラメータとシステムの動態性能と定常状態性能との定性的関係に基づいて、実験的な方法でコントローラのパラメータを調整することができる.経験のあるデバッグ担当者は、一般的に、より迅速にデバッグ結果を得ることができます.デバッグで最も重要な問題は、システムのパフォーマンスが満足できない場合に、どのパラメータを調整すべきか、そのパラメータを大きくすべきか、小さくすべきかを知ることです.整定が必要なパラメータを減らすために、まずPIコントローラを採用することができる.システムの安全を保証するために、デバッグ開始時に比較的保守的なパラメータを設定する必要があります.例えば、比例係数が大きすぎないように、積分時間が小さすぎないようにして、システムの不安定さやオーバーシュート量が大きすぎる異常を回避します.制御量の出力波形に基づいてシステム性能の情報、例えば超変調量や調整時間を得ることができるステップ所与の信号が与えられる.PIDパラメータとシステム性能の関係により、PIDのパラメータを繰り返し調整する.ステップ応答の超変調量が大きすぎると,複数回の振動を経て安定または根本的に不安定になり,比例係数を低減し,積分時間を増大させるべきである.ステップ応答に超変調量がないが,制御量の上昇が遅すぎ,遷移過程時間が長すぎる場合は,逆方向にパラメータを調整すべきである.誤差の除去速度が遅い場合,積分時間を適切に低減し,積分作用を増強することができる.比例係数と積分時間を繰り返し調整し、超変調量が依然として大きい場合は微分制御を加えることができ、微分時間は0から徐々に増大し、コントローラの比例、積分、微分部分のパラメータを繰り返し調整する.要するに、PIDパラメータのデバッグは総合的で、各パラメータが互いに影響する過程であり、実際のデバッグ過程における複数回の試みは非常に重要であり、必要である.
コード実装:
/****************************  PID  P(  )+I(  )+D(  **************************/
**(1)P  (    ):    e(t) = SP - y(t);        SP--      e(t)--   (          ) y(t)--   (   )
**              u(t) = e(t) * P;        u(t)--   (     ) P--    
**
**(2)PI  (  +  ):  u(t) = Kp*e(t) + Ki∑e(t) + u0
**             u(t)--   Kp--       ki--       e(t)--   u0--      (    )
**
**(3)PD  (    ):     
**                      
**(4)PID  (        ):
**              u(t) = Kp*e(t) + Ki∑e(t)+ Kd[e(t) – e(t-1)] + u0            
**    (         )
**    (            PID  ,      )
****************************  :P(  )--    I(  )--     D(  )--   ************************************
*/
#include
#include
#include"StandardPID.h"
//#include

//      
typedef struct PID{
    double SetPoint;            //   
    double Kp;                  //    
    double Ki;                  //    
    double Kd;                  //    
    double LastError;           //       Er[-1]
    double PrevError;           //        er[-2]
    double SumError;            //      
}PID;

/*
**PID    
*/
double PIDCalc(PID *pp, double NextPoint)   
{
    double dError,                              //    
           Error;                               //  
    Error = pp->SetPoint - NextPoint;           //   =   -   (   )
    pp->SumError += Error;                      //  =  +    --     
    dError = pp->LastError - pp->PrevError;     //     =      -     
    pp->PrevError = pp->LastError;              //  “    ”
    pp->LastError = Error;                      //  “    ”
    return (pp->Kp * Error                      //    =      *   
        +   pp->Ki *  pp->SumError              //    =      *     
        +   pp->Kd * dError                     //    =      *     
        );
}
// PID      ,    pp   
void PIDInit (PID *pp)   
{
                                //memset     C / C++    。 s            n 
    memset(pp, 0, sizeof(PID)); //          ch   ASCII ,            ,
}                               //                   ,        s   。

double sensor(void)                 //  
{   
    double shuru;
    scanf("%lf", &shuru);
    return shuru;
}

void actuator(double rDelta)       //  
{
    printf("%lf
"
, rDelta); } int main() { PID sPID; //PID double rOut; // double rIn; // PIDInit(&sPID); // sPID.Kp = 0.5; sPID.Ki = 0.5; sPID.Kd = 0.5; sPID.SetPoint = 100.0; for (;;){ rIn = sensor(); // rOut = PIDCalc(&sPID, rIn); //PID actuator(rOut); // } } #define __StandardPID_H double PIDCalc(PID *pp, double NextPoint); void PIDInit (PID *pp); double sensor(void); void actuator(double rDelta); #endif