■SetControllerDirection関数
PID_v1.hライブラリのSetControllerDirection関数は、入力値が設定値を超えている場合に出力値を増やすか減らすかを指定します。
自動車でオートクルーズする場合を考えると、現在の車速(入力値)が設定速度(設定値)より高くなるとスピードを落とすために速度(出力値)を減らす必要がありますので「DIRECT」を指定します。
冷蔵庫内を一定温度で冷やす場合を考えると、現在の温度(入力値)が設定温度(設定値)より高くなると温度を下げるために冷却(出力値)を増やす必要がありますので「REVERSE」を指定します。
これはPIDが構築される時に指定しており、制御対象の出力方向が途中で逆に切り替わる事は殆ど無い為、この関数を実際に使用する事は殆ど有りません。
■使用例
Arduino IDEで使用するSetMode関数の使用例は以下の通りです。
試しにこのプログラムをArduino UNOで実行すると、PID関数でユーザー定義変数(今回はmyPID)にPID制御に必要な変数とパラメータを設定します。
setupでSetMode関数を使用し、デフォルトの「MANUAL」から「AUTOMATIC」モードに変更し、SetControllerDirection関数で、初期設定した「DIRECT」から「REVERCE」に出力方向を変更します。(永遠に0.00が出力され、目標値の180に達しません)
3番ピンで発生したPWM信号を直結された2番ピンで測定し、その結果から3番ピンの出力を、設定したDuty比70.6%(180)に近づく様にPIDアルゴリズムを含むCompute関数で求め出力します。
また上記と合わせて、現在の入力値(input)と、出力値(output)が図1の様にPCのシリアルモニタ上に出力されます。
/*NOBのArduino日記!_PID制御!SetControlleDirection編_20170409*/ #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関数を実行 myPID.SetControllerDirection(REVERSE); }//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); }
図2:プログラム実行結果
■構文
myPID.SetControllerDirection(Direction)
■パラメータ
Direction:DIRECT(車の様な)またはREVERSE(冷蔵庫の様な)
■戻り値
ありません。