###前提・実現したいこと
PIDライブラリを用いずにarduinoでモーターのPID制御をしたいと考えています。
目標値はanalogReadで150とし、最終的には現在ソースコードにて出来上がっているRCフィルタをかけてグラフ描画を考えております。
使用モーターはFA130RA、arduino uno、モータードライバーTA7291Pで、現在値を200でanalogWriteしたものを発電側のモーターに同期し、発電側のモーターのアナログ値をRCフィルタで処理、描画するところまで仕上げております。
motor同士の接続はチューブで先をつなげることで回転数の動機を図っております。
###発生している問題
無知で大変失礼ですが、analogReadで値を取得した後のプログラム処理が分からず困っています。
操作量=Kp×偏差+Ki×偏差の累積値+Kd×前回偏差との差
記号で表すと、
MVn = MVn-1 + ΔMVn
ΔMVn = Kp(en-en-1) + Ki en + Kd((en-en-1) - (en-1-en-2))
MVn、MVn-1:今回、前回操作量 ΔMVn:今回操作量差分
en,en-1,en-2:今回、前回、前々回の偏差
という流れで組み立てたいと考えております。
###該当のソースコード
//宣言
int analogPin=A0;//analogPin
float eNow;//少数実数型で変数の宣言
float valueOld;//少数実数型で変数の宣言
//セットアップ関数
void setup() {
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
Serial.begin(9600);
}
//ループ関数
void loop() {
float valueOld = 0;//フィルタ計算初期値valueOldに0を代入
analogWrite(9,LOW);
analogWrite(10,200);//モーターを回転させる
//記録をスタート
Serial.println("start");//スタートをプリントする
// 配列数を明示して配列宣言を開始
int value[400]; //変数が400個入るvalueと言う名前の箱を作る
for (int i = 0; i < 400; i++){ // ループ処理 for文以下の処理を400回繰り返す
value[i] = analogRead(A0);//iの要素をA0から流れる電圧の値に設定し、読み取る
delay(5);//5msec間隔で電圧を記録していく
}
analogWrite(9,LOW);
analogWrite(10,LOW);//モーターを制止させる
//記録を終了する
//記録を元にRCフィルタ処理を施す
for(int i = 0; i < 400; i++){ //for文ループ処理 以下の処理を400回繰り返す
eNow = 0.97 * valueOld + 0.03 * value[i];//フィルタ係数を0.97とし、eNowへ書き出す
valueOld=eNow;//書き出し終了後、次回処理へ向けてeNowを更新しておく
Serial.println(eNow);//eNowの結果をプリントする
}
Serial.println("end");//400個のRCフィルタを完了し、ループ関数が1セットしたことをendでプリントして知らせる
回答1件
あなたの回答
tips
プレビュー