50日後にセンサレスベクトル制御してみたい俺 (後編)
HomeMadeGarbage Advent Calendar 2022 |8日目
前回からの続きです。
ここからいよいよベクトル制御を目指していきます。
目次
システム構成
回路構成は以下の通りです。
クローズドループ正弦波駆動の時の構成に電流センサを追加したのみです。
変数調整用にと可変抵抗を繋げていますがここでは使用せず、BlynkレガシーアプリでBLEで変数調整しました。
部品
- ESP32 評価ボード
- プリドライバ IR2302
- ドライバ NMOS 2SK4017
- ブラシレスモータ ポール数:14
- 磁気エンコーダ AS5048
- 電流センサ ACS712
磁気エンコーダでベクトル制御を目指す
いよいよベクトル制御 (センサあり)を目指していきます。
50日後にセンサレスベクトル制御してみたい俺
23日目#ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/azuH067iCi— HomeMadeGarbage (@H0meMadeGarbage) November 8, 2022
50日後にセンサレスベクトル制御してみたい俺
24日目#ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/mvJ1xveYng— HomeMadeGarbage (@H0meMadeGarbage) November 9, 2022
各種書籍も読みました。
逆Park変換、逆Clarke変換で3相の印可電圧を算出します。
演算に用いた位相は磁気エンコーダによるものを使用しています。
なんとなく回りましたね。
50日後にセンサレスベクトル制御してみたい俺
25日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/1st8tg4VZF— HomeMadeGarbage (@H0meMadeGarbage) November 10, 2022
コロナになっちまいました。。
50日後にセンサレスベクトル制御してみたい俺
26日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/iDMTCb2Jtw— HomeMadeGarbage (@H0meMadeGarbage) November 11, 2022
ミニぷぱで遊んでサボっちまいました。。
50日後にセンサレスベクトル制御してみたい俺
27日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/ZB02kTWzYJ— HomeMadeGarbage (@H0meMadeGarbage) November 12, 2022
電圧観測。
50日後にセンサレスベクトル制御してみたい俺
28日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/i7xNXO02Lt— HomeMadeGarbage (@H0meMadeGarbage) November 13, 2022
カクカクだったので別コア(core0)のシリアル出力で電圧観測
50日後にセンサレスベクトル制御してみたい俺
29日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/6C96YgnzLg— HomeMadeGarbage (@H0meMadeGarbage) November 14, 2022
逆Park変換、逆Clarke変換で電圧は生成できてるようだが、
どうも高速が回転ができない。。。
50日後にセンサレスベクトル制御してみたい俺
30日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/npJDoFuMlr— HomeMadeGarbage (@H0meMadeGarbage) November 15, 2022
50日後にセンサレスベクトル制御してみたい俺
31日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/jtwE3zn28w— HomeMadeGarbage (@H0meMadeGarbage) November 16, 2022
低速では回転し、Iqを指定しての追従もできる。
50日後にセンサレスベクトル制御してみたい俺
32日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/X7yqCHK23L— HomeMadeGarbage (@H0meMadeGarbage) November 17, 2022
電流センス値を加算平均でフィルタするなど試したが効果出ず。。高速回転ができない。。
50日後にセンサレスベクトル制御してみたい俺
33日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/dTqwDVagrX— HomeMadeGarbage (@H0meMadeGarbage) November 18, 2022
おすすめしてもらった書籍購入。藁にもすがる思いで。。。
50日後にセンサレスベクトル制御してみたい俺
34日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/h0x36sZ8c7— HomeMadeGarbage (@H0meMadeGarbage) November 19, 2022
こちらの書籍では駆動電圧が全波の正弦波で説明がされておりました。
前出の2冊では半波の正弦波での駆動が紹介されておりました。
半波より全波の正弦波のほうが回転がなめらかであることは経験によって実感しておりました。
早速、書籍に従って逆Clarke変換で得た電圧を全波正弦波の振幅として印可しました。
回転はなめらかになりましたが、相変わらず高速回転ができません。。
50日後にセンサレスベクトル制御してみたい俺
35日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/kmrj9n3tJR— HomeMadeGarbage (@H0meMadeGarbage) November 20, 2022
とんでもないミスに気付く
高速回転が全くできないので、ここでの設計思想である制御のループ時間を管理せずに2コアでセンシングと回転制御をわけてガンガン回すという方針が間違いなのではと思いはじめループ時間を観てみました。
すると磁気エンコーダのセンシングに非常に時間がかかっていることが判明しました。
磁気エンコーダ AS5048のライブラリとして以下を使用していたのですが、ESP32使用時に50msecのディレイが挿入されておりました。。。(AS5048A.cpp L.367)
https://github.com/eborghi10/AS5048A
以前クローズドループ正弦波駆動をこのエンコーダを使用して実施した際にうまくいかなかったのも、この遅延のせいだったのか…!
センサありベクトル制御
エンコーダの50msecのディレイをなくして、回転させてみました。
高速回転が実現できました!しかし指定の回転速度追従は出来ずパラメータ調整が必要そうです。
50日後にセンサレスベクトル制御してみたい俺
36日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/3kyPWHzESk— HomeMadeGarbage (@H0meMadeGarbage) November 21, 2022
Iqを指定してドライバに印可する電圧を観測してみました。
Iqを大きくすると振幅が大きくなりVddとGNDでサチっている様子が分かります。
50日後にセンサレスベクトル制御してみたい俺
37日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/4mnN54P9Je— HomeMadeGarbage (@H0meMadeGarbage) November 22, 2022
モータにより大きな振幅の電圧を供給できるように3次調波加算 (HIP型変調)を施しました。
これによって相間に印可できる上限電圧は大きくなります。
50日後にセンサレスベクトル制御してみたい俺
38日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/GVik7Iw3Y4— HomeMadeGarbage (@H0meMadeGarbage) November 23, 2022
ここでのセンサありベクトル制御のブロック図は以下の通りです。
上図の各PI制御のパラメータを調整して、指定した回転速度に対する応答性向上を目指しました。
50日後にセンサレスベクトル制御してみたい俺
39日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/vlwapE0yzJ— HomeMadeGarbage (@H0meMadeGarbage) November 24, 2022
なかなかよくなってきました。
更に応答を良くするために磁気エンコーダに加えて電流センシングもcore1からcore0に変えて以下のように完全分業にすることにしました。
- core0:電流センシング、磁気エンコーダからロータ位置と回転速度検出とPI制御、シリアル出力
- core1:3相-2相変換、逆Park-Clarke変換、3次調波加算、PWM出力
50日後にセンサレスベクトル制御してみたい俺
40日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/BJuH2nNCmK— HomeMadeGarbage (@H0meMadeGarbage) November 25, 2022
まだ改善の余地はありそうですが、遂にセンサありベクトル制御ができました!!
センサレスベクトル制御
なんとかセンサありのベクトル制御ができました。
遂にセンサレスを目指します。
センサレスベクトル制御の書籍群を紐解くとモータの位置の推定にはモータの定数が必要になるとのことでした。
ちょっとこの時点でテンションが落ち気味。。これってモータ変わるたびに特性把握が必要になるってことだよね。。
まぁしょうがないのでモータの特性を測ってみました。
- 誘起電圧定数 Ke = 0.021 V/(rad/s)
50日後にセンサレスベクトル制御してみたい俺
41日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/zGpjPepTL7— HomeMadeGarbage (@H0meMadeGarbage) November 26, 2022
以下を参考に計測から導出しました。
ブラシレスモータの逆起電力定数
モータ位置の推定方法としては誘起電圧オブザーバという手法を試してみました。
ベクトル制御では磁束方向の電流 (Id) をゼロにするように制御します。したがって回転位置を推定してその際にIdによって誘導される電圧があれば推定角度を修正するという方法です。
以下の書籍を参考に誘起電圧から推定するモータの回転位置の誤差$\Delta \theta$を計算します。
$$\Delta \theta = \frac{V_d – R I_d + \omega L I_q}{\omega K_e}$$
モータの回転位置の誤差$\Delta \theta$を算出するために推定される回転速度$\omega$が用いられているかなり不安な手法です。。
また2相変換されたコイルの抵抗とインダクタンスをどのように扱っていいのか分からなかったため、測定値をそのまま使ってみました。
正弦波駆動で回してエンコーダのオフセットを導出してセンサありベクトル制御でモータを回転させてモータ位置と回転速度を引き継いでセンサレス動作に移行してみました。
50日後にセンサレスベクトル制御してみたい俺
42日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/mNmG3tSZDu— HomeMadeGarbage (@H0meMadeGarbage) November 27, 2022
50日後にセンサレスベクトル制御してみたい俺
43日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/XbX2yInkiM— HomeMadeGarbage (@H0meMadeGarbage) November 28, 2022
計算した回転位置の誤差$\Delta \theta$をPI制御して推定回転速度$\omega$を算出して、$\omega$に測定したループ時間をかけて推定回転位置$\theta$を出してベクトル制御しているのですが。。
センサレスに移行したとたんに電流が設定した上限まで流れてしまいます。
METALLICAの新曲が発表されてそれどころじゃなかった。
50日後にセンサレスベクトル制御してみたい俺
44日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/KfKGw3M3D5— HomeMadeGarbage (@H0meMadeGarbage) November 29, 2022
センサレスベクトルでパラメータいじって何とかしようとしていたらプリドライバ壊れた。。
パワトラではなくプリドライバICが壊れてた
なんか嫌だな。。 #ブラシレスモータ駆動への道 pic.twitter.com/Crg7pwszhP— HomeMadeGarbage (@H0meMadeGarbage) November 30, 2022
プリドライバ交換して検討進めるが上手くいかず。。
50日後にセンサレスベクトル制御してみたい俺
46日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/l3Jli5VmPE— HomeMadeGarbage (@H0meMadeGarbage) December 1, 2022
どうしてもうまくいかないので以下の書籍の手法を試してみました。
モータの回転位置の誤差$\Delta \theta$を0になるようにPI制御して得られた誤差を、指定した回転速度に加えて推定回転速度を算出する手法でしたがうまくいきません。
50日後にセンサレスベクトル制御してみたい俺
47日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/UPLVCbkbWR— HomeMadeGarbage (@H0meMadeGarbage) December 2, 2022
次に以下の書籍の手法を試してみました。
Idによって誘導される電圧Edを算出して、それをPI制御して推定回転速度$\omega$を導出する手法でしたが
試した途端 ぶっこわれました。。。。
50日後にセンサレスベクトル制御してみたい俺
48日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/V4UXIpLpSJ— HomeMadeGarbage (@H0meMadeGarbage) December 3, 2022
50日後にセンサレスベクトル制御してみたい俺
49日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/NYp6yFdfNb— HomeMadeGarbage (@H0meMadeGarbage) December 4, 2022
50日後にセンサレスベクトル制御してみたい俺
50日目 #ブラシレスモータ駆動への道 #50daysBLDC pic.twitter.com/hiyPNSRY4r— HomeMadeGarbage (@H0meMadeGarbage) December 5, 2022
またプリドライバが壊れたようですが在庫が尽きたため、私の50日間はあえなく終了いたしました。
おわりに
残念ながらセンサレスベクトル制御は実現できませんでした。
ダメな要因としては全部ということなのですが、以下にわかる範囲でまとめてみました。
- コントローラの制御ループ時間可変では無理じゃないか?
モータ推定位置算出に推定回転速度は入るので算出時にループ時間を観測では誤差が拡がる一方ではないか - モータの定数の不確かさ
モータ定数の測定値が正しくない可能性に加えてq軸に変換した際に測定値がそのまま使えるのか疑問 - モータの駆動方法に問題がありそう
センサありからセンサレスにいきなり移行するのは問題ありそう - 他の推定方法も要検討必要
こんな感じで惨敗でした。
しかしセンサありでのベクトル制御はできたので一定の達成感はございます。
電流を管理して回転が制御できるようになったのは今後の人生において非常に有用であると考えます。
ESP32によるセンサありベクトル制御に関しましては別途ソースコードと合わせていつか報告させていただきます。
また磁気エンコーダの測定遅延時間が悪さをしており、ソコに気づくのに多大な時間を要してしまいました。
またクローズドループ正弦波制御からやり直したいと思います。
この50日間 結構サボったけどほぼ毎日モータのことを考え、ブラシレスモータと私の距離はかなり縮まったと思います。
以前なら理解できなかったであろうベクトル制御に関する資料や書籍も大体読めるようになりました。
とりあえず50日間は終了しましたが引き続き頑張りたいと思います。
エンジニアリングはマラソンです。