なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

床拭きロボットの製作(4)- エンコーダパルスの誤差

Posted by arms22 on 2017年03月14日 0  0

一定の速度でモータを回した時に速度が少しバラつくので原因を調べてみました。次の図はPID制御をオフにして40%ぐらいの電圧をかけて空転させた時の結果です。横軸は時間(ミリ秒)、縦軸はパルス間隔(マイクロ秒)です。

パルス幅-起動時

パルス間隔は徐々に短くなってきて1800〜1750あたりで安定になります。この時50マイクロ秒ほどパルス間隔に変動があります。

パルス幅-安定時

速度が安定したあたりを拡大すると振幅が一定周期で現れているのがわかります。また1回転先の結果を重ね合わせてみると振幅がピッタリ一致することも確認できました。どうやらエンコーダの誤差のようです。振幅は常に一定なのでパルス間隔の平均をとって1パルスごとの変動率を求めれば簡単に補正できそうですね。

パルス幅-安定時_移動平均ありなし

でも今回は簡単に移動平均をかけて平滑します。パルス間隔を取得するコードに下記の処理を加えます。_pulseWidthが前回までの値で_pulseWidthRawが今回の値。それぞれ0.7と0.3の重みをつけて足しあわせています。

_pulseWidth = _pulseWidth * 70 + _pulseWidthRaw * 30;
_pulseWidth = _pulseWidth / 100;


PID制御-移動平均あり

移動平均をかけた状態でのPID制御の結果です。縦軸の単位がパルス秒に変わっています。速度安定時の制御量の振幅が随分小さくなりました。これで低速時も回転が安定するようになるかも。


参考記事

気まぐれ備忘録 磁気式エンコーダ

該当の記事は見つかりませんでした。