
SimpleFOCによるベクトル制御への誘い
前回はSimpleFOCで複数モータのI2Cマルチプレクサでの同一I2Cバスによるエンコーダ回転監視動作を確認しました。
倒立振子や3軸姿勢制御モジュールで動作確認したのですがいずれも電流センスなしのクローズドループ制御で実施しました。
せっかくのSimpleFOCですから ここでは電流センシングを用いたベクトル制御 (FOC)を試してみました。
目次
FOC (Field Oriented Control)
FOCいわゆるベクトル制御はモータ各相の電流と回転位置をセンシングして磁石とコイルによる磁界が直交して一番効率よくトルクを得るよう回転を制御します。
ベクトル制御自体は以前ESP32にて動作を確認しております。
↑ここではベクトル制御を理解し実現できたことで喜ぶにとどまり、クローズドループ制御との比較などをしてご利益の検証をすることを忘れておりました。
ここ最近の製作でもクローズドループ制御で十分に動作する倒立振子や姿勢制御モジュールに満足しその輝きに目がくらみ美しきエンジニア心を忘れておりました。
改めでここでベクトル制御のご利益を自身の体にぶち込みたいと思います。
世の中の人々がわざわざ電流センスしてまでやるんだからご利益がないわけありません。
比較検証
早速 クローズドループ制御とベクトル制御 (FOC) を比較してみました。
FOCの方は高速回転時にも負荷電流の増加が少なく高効率の回転が実現できているのが見て取れます。こころなしか応答もよく感じました。
電流センスなしのクローズドループは100rad/sec以上で電流が急増しました。
初期動作のモータを強制的に回してエンコーダのオフセットを測っていますが、この精度が高速回転時の負荷上昇につながっていると考えられます。
上の実験では以下を使用
モータ
磁気エンコーダ
比較によってクローズドループ制御とベクトル制御の差を明確に体感しました。
制御ブロックが以下のように変わるのですからご利益があって当然です。
先の動画では上記制御ブロックに更に指定回転速度とエンコーダによる実測速度でPI制御して回転速度一定にしています。
使用したMakerbase社製コントローラの電流センシングは以下のとおり3相の内の2相に抵抗を挿入してアンプで検知しています。
FOCのメリットを体に深く刻むことができましたので以下で応用して更に検証します。
倒立振子
早速ベクトル制御 (FOC)を倒立振子に応用します。
コントローラは前節の比較と同様にMakerbase社製のものでモータやエンコーダも同じですので直ぐに電流センシングを追加しての制御への変更が可能です。
FOC
応答いい
ご馳走だわ pic.twitter.com/1Xy4P0DCje— HomeMadeGarbage (@H0meMadeGarbage) October 16, 2024
応答が非常にいいです。
これは是非屈伸型にしてジャンプを楽しみたいですね。忙しなるでオイ
姿勢制御モジュール
以前製作した1軸姿勢制御モジュールをFOC化したいと思います。
ホイールのトルク増し
コレで積載量300g弱 pic.twitter.com/UIuLkQVDoc— HomeMadeGarbage (@H0meMadeGarbage) October 12, 2024
こちらではコントローラにATOMS3を使用してモータドライバにはDRV8311Hモジュールを使用しております。
電流センシング用のピンを追加したいのですがATOMS3には既に余剰のIOピンはない。。
Seeed Studio XIAO ESP32S3
ピン不足を解消するためコントローラに XIAO ESP32S3 を採用します。
壊してしまったATOMS3からIMUセンサMPU6886子基板を取り出して XIAO ESP32S3 に搭載します。
これはもうねぇ定番工作!
無事にIMU搭載完了
ATOMS3のMPU6886子基板をXIAO S3に載せ替え#定番工作 pic.twitter.com/sucl5XEnPp
— HomeMadeGarbage (@H0meMadeGarbage) October 16, 2024
姿勢制御動作(クローズドループ)確認
まずはXIAO ESP32S3でクローズドループによる1軸姿勢制御モジュール動作確認。
問題なく完全移植でけた
まずはXIAO ESP32S3でクローズドループによる1軸姿勢制御モジュール
これをSHISEIGYO-1 FOCと呼ぶのは忍びない pic.twitter.com/WfEtHVHXf0— HomeMadeGarbage (@H0meMadeGarbage) October 16, 2024
しかしこれをSHISEIGYO-1 FOCと呼ぶのは忍びない。。。
電流センシング
FOC制御実現のためにDRV8311Hモジュールの電流センシングピンを配線します。
DRV8311Hの電流センスは駆動トランジスタのローサイドで検出します。
アンプ内蔵のローサイド検出ですのでハードウェア的には簡単に利用できますが、検出には各相のスイッチングタイミングとの同期が必要で仕事が発生します。
しかし、SimpleFOCにはしっかりLowsideCurrentSenseクラスも用意されております。神!
ところが。。。
どうもうまく動かすことができず色々検証したところSimpleFOCのLowsideCurrentSenseと ESP32のWiFiが共存できない疑惑が発生しました。。
ネット検索しても同様の報告はないのですが姿勢制御モジュールでのFOC検証は一旦ペンディングとして調査進めます。
おわりに
ここではSimpleFOCによる電流センスベクトル制御 (FOC)について検証を行いました。
FOCのご利益を脳に刻み倒立振子においてもそのご加護をいただきました。
姿勢制御モジュールにおいては残念ながら新たにESP32によるLowsideCurrentSenseクラスの制約問題が発生したため今後調査進めます。
ローサイド電流検出についてはSimpleFOCを用いないで自身でも実施できるようにして将来のセンサレスベクトル制御実現の夢に繋げたいとも考えております。
それではまた
次の記事
追記
LowsideCurrentSense (2025/2/6)
ESP32によるLowsideCurrentSenseクラスを用いたベクトル制御のリベンジを実施しました。
クローズドループ制御
比較のためにまずは電流センシングなしのDRV8311Hモジュール によるクローズドループ制御を観ます。
DRV8311Hモジュールによる電流センスなしクローズドループ制御
回転速度 70rad/s以上で負荷電流が急激に上昇
それ以上速くすると脱調#SimpleFOC pic.twitter.com/bmNc0fznLR— HomeMadeGarbage (@H0meMadeGarbage) February 6, 2025
前節の比較と同様に回転速度 70rad/s以上で負荷電流が急激に上昇しました。
それ以上速くすると脱調 (ここではモータへの最大印可電圧を3Vとしました)。
コントローラとして潤沢にIOが用意されたESP32のEVAボードを使用。
モータは5010 360KV、磁気エンコーダはAS5600
ベクトル制御 (FOC)
DRV8311Hモジュール のカレントセンス部をESP32に結線してベクトル制御を実施します。
前回はWiFi使用時に動作干渉のあるADC2ピンを使用してしまい (XIAO ESP32S3の余剰ピンが不足してどうしてもADC1ピンを避けなかったんです 😥 ) うまくいきませんでした。
そこで今回はしっかりESP32 EVAボードのADC1ピンを割り当てて動作確認しました。
1 |
LowsideCurrentSense current_sense1 = LowsideCurrentSense(1000.0, 34, 35, 32); |
設定はDRV8311Hモジュール のサンプルコードを参考にした
DRV8311Hモジュールによるベクトル制御 (FOC)
みごとなローサイド電流センシングにより回転速度 100rad/s以上でも負荷電流のおおきな上昇はなし150rad/s以上でも実にエレガントな回転… pic.twitter.com/J6AM4OMdC9
— HomeMadeGarbage (@H0meMadeGarbage) February 6, 2025
みごとなローサイド電流センシングにより回転速度 100rad/s以上でも負荷電流のおおきな上昇なしに回転しました。150rad/s以上でも余裕。
LowsideCurrentSenseではもう一癖あって、
以下のようにセットアップで motor.init()の後に電流センサの設定をしてからmotor.initFOC()の順で記述しないとカレントセンサの初期化に失敗しました。
1 2 3 4 5 6 7 8 9 |
motor.init(); // current sense init hardware current_sense.linkDriver(&driver); current_sense.init(); motor.linkCurrentSense(¤t_sense); //Initialize FOC motor.initFOC(); |
以上、DRV8311Hモジュールによるローサイド電流センシングにおいてもベクトル制御の有用性を確認いたしました。