NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

PID_v1.hライブラリ(PID関数の使い方)

■PID関数
 PID_v1.hライブラリのPID関数は指定された入力値(Input)・出力値(Output)・目標値(Setpoint)に対してPID制御を行います。 PIDアルゴリズムはパラレル形式です。

■使用例
 Arduino IDEで使用するPID関数の使用例は以下の通りです。試しにこのプログラムをArduino UNOで実行すると、PID関数でユーザー定義変数(今回はmyPID)にPID制御に必要な変数とパラメータを設定します。3番ピンで発生したPWM信号を直結された2番ピンで測定し、その結果から3番ピンの出力を、設定したDuty比70.6%(180)に近づく様にPIDアルゴリズムを含むCompute関数で求め出力します。また上記と合わせて、現在の入力値(input)と、出力値(output)が図1の様にPCのシリアルモニタ上に出力されます。

/*NOBのArduino日記!_PID制御!PID関数編_20170405*/
#include <PID_v1.h>
double Setpoint, Input, Output;
PID myPID(&Input, &Output, &Setpoint, 0.04, 0.04, 0.04, DIRECT); //初期値設定

// PWMのD比測定
volatile float Duty;
volatile unsigned long UpNew, UpOld, DownNew, DownOld;
void SUB() {
  if (digitalRead(2) == LOW) {
    DownOld = DownNew; DownNew = micros();
    Duty = ((DownNew - UpNew) * 1000) / ((UpNew - UpOld)) * 0.1;
  }
  else {
    UpOld = UpNew; UpNew = micros();
    Duty = ((DownNew - UpOld) * 1000) / (UpNew - UpOld) * 0.1;
  }
}

void setup() {
  pinMode(3, OUTPUT); pinMode(2, INPUT_PULLUP); //3ピン出力2ピン入力設定
  attachInterrupt(0, SUB, CHANGE);
  Serial.begin(9600);
  Setpoint = 180;//目標値設定
  myPID.SetMode(AUTOMATIC);
}//PID関数を実行

void loop() {
  Input = map(Duty, 0, 100, 0, 255); //2ピン入力値取得
  myPID.Compute();
  analogWrite(3, Output);
  Serial.print("Input=");
  Serial.print(Input);
  Serial.print(",Output=");
  Serial.println(Output); delay(100);
}
イメージ 1
図1:プログラム例

イメージ 6

図2:プログラム実行結果

■構文
 PID(&Input , &Output , &Setpoint , Kp , Ki , Kd , Direction)

■パラメータ
 Input    :制御しようとしている変数(double)
 Output  :PIDによって調整される変数(double)
 Setpoint  :維持したい値(double)
 Kp、Ki、Kd:チューニングパラメータ。(double> = 0)
       ※これらはPIDが出力をどのように変更するかに影響します。
 Direction :DIRECTまたはREVERSEのいずれか。
       エラーが出た時に出力がどの方向に動くかを決定、DIRECTが一般的

■戻り値
 ありません

 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【PID制御!】目次に戻る