50日後にセンサレスベクトル制御してみたい俺 (後編)

Home > Advent Calendar > 50日後にセンサレスベクトル制御してみたい俺 (後編)
すき 1
うんこ 0

HomeMadeGarbage Advent Calendar 2022 |8日目

前回からの続きです。

50日後にセンサレスベクトル制御してみたい俺 (前編)

ここからいよいよベクトル制御を目指していきます。

 

 

システム構成

回路構成は以下の通りです。

クローズドループ正弦波駆動の時の構成に電流センサを追加したのみです。
変数調整用にと可変抵抗を繋げていますがここでは使用せず、BlynkレガシーアプリでBLEで変数調整しました。

部品

 

磁気エンコーダでベクトル制御を目指す

いよいよベクトル制御 (センサあり)を目指していきます。

各種書籍も読みました。

 

逆Park変換、逆Clarke変換で3相の印可電圧を算出します。
演算に用いた位相は磁気エンコーダによるものを使用しています。
なんとなく回りましたね。

 

コロナになっちまいました。。

 

ミニぷぱで遊んでサボっちまいました。。

 

電圧観測。

カクカクだったので別コア(core0)のシリアル出力で電圧観測

 

逆Park変換、逆Clarke変換で電圧は生成できてるようだが、
どうも高速が回転ができない。。。

低速では回転し、Iqを指定しての追従もできる。

電流センス値を加算平均でフィルタするなど試したが効果出ず。。高速回転ができない。。

 

おすすめしてもらった書籍購入。藁にもすがる思いで。。。

こちらの書籍では駆動電圧が全波の正弦波で説明がされておりました。
前出の2冊では半波の正弦波での駆動が紹介されておりました。
半波より全波の正弦波のほうが回転がなめらかであることは経験によって実感しておりました。

 

早速、書籍に従って逆Clarke変換で得た電圧を全波正弦波の振幅として印可しました。
回転はなめらかになりましたが、相変わらず高速回転ができません。。

とんでもないミスに気付く

高速回転が全くできないので、ここでの設計思想である制御のループ時間を管理せずに2コアでセンシングと回転制御をわけてガンガン回すという方針が間違いなのではと思いはじめループ時間を観てみました。
すると磁気エンコーダのセンシングに非常に時間がかかっていることが判明しました。

磁気エンコーダ AS5048のライブラリとして以下を使用していたのですが、ESP32使用時に50msecのディレイが挿入されておりました。。。(AS5048A.cpp L.367)
https://github.com/eborghi10/AS5048A

以前クローズドループ正弦波駆動をこのエンコーダを使用して実施した際にうまくいかなかったのも、この遅延のせいだったのか…!

センサありベクトル制御

エンコーダの50msecのディレイをなくして、回転させてみました。
高速回転が実現できました!しかし指定の回転速度追従は出来ずパラメータ調整が必要そうです。

 

Iqを指定してドライバに印可する電圧を観測してみました。
Iqを大きくすると振幅が大きくなりVddとGNDでサチっている様子が分かります。

モータにより大きな振幅の電圧を供給できるように3次調波加算 (HIP型変調)を施しました。
これによって相間に印可できる上限電圧は大きくなります。

 

ここでのセンサありベクトル制御のブロック図は以下の通りです。

上図の各PI制御のパラメータを調整して、指定した回転速度に対する応答性向上を目指しました。

なかなかよくなってきました。

更に応答を良くするために磁気エンコーダに加えて電流センシングもcore1からcore0に変えて以下のように完全分業にすることにしました。

  • core0:電流センシング、磁気エンコーダからロータ位置と回転速度検出とPI制御、シリアル出力
  • core1:3相-2相変換、逆Park-Clarke変換、3次調波加算、PWM出力

 

まだ改善の余地はありそうですが、遂にセンサありベクトル制御ができました!!

センサレスベクトル制御

なんとかセンサありのベクトル制御ができました。
遂にセンサレスを目指します。

センサレスベクトル制御の書籍群を紐解くとモータの位置の推定にはモータの定数が必要になるとのことでした。
ちょっとこの時点でテンションが落ち気味。。これってモータ変わるたびに特性把握が必要になるってことだよね。。

まぁしょうがないのでモータの特性を測ってみました。

  • コイル抵抗:5.6 Ω
    テスタで相間を測定

 

  • インダクタンス:0.76 mH
    nanoVNAで測定。相互インダクタンスは無視

 

  • 誘起電圧定数  Ke = 0.021 V/(rad/s)

以下を参考に計測から導出しました。
ブラシレスモータの逆起電力定数

 

モータ位置の推定方法としては誘起電圧オブザーバという手法を試してみました。
ベクトル制御では磁束方向の電流 (Id) をゼロにするように制御します。したがって回転位置を推定してその際にIdによって誘導される電圧があれば推定角度を修正するという方法です。

以下の書籍を参考に誘起電圧から推定するモータの回転位置の誤差$\Delta \theta$を計算します。

$$\Delta \theta = \frac{V_d – R I_d + \omega L I_q}{\omega  K_e}$$

モータの回転位置の誤差$\Delta \theta$を算出するために推定される回転速度$\omega$が用いられているかなり不安な手法です。。
また2相変換されたコイルの抵抗とインダクタンスをどのように扱っていいのか分からなかったため、測定値をそのまま使ってみました。

正弦波駆動で回してエンコーダのオフセットを導出してセンサありベクトル制御でモータを回転させてモータ位置と回転速度を引き継いでセンサレス動作に移行してみました。

計算した回転位置の誤差$\Delta \theta$をPI制御して推定回転速度$\omega$を算出して、$\omega$に測定したループ時間をかけて推定回転位置$\theta$を出してベクトル制御しているのですが。。
センサレスに移行したとたんに電流が設定した上限まで流れてしまいます。

 

METALLICAの新曲が発表されてそれどころじゃなかった。

 

センサレスベクトルでパラメータいじって何とかしようとしていたらプリドライバ壊れた。。

 

プリドライバ交換して検討進めるが上手くいかず。。

 

どうしてもうまくいかないので以下の書籍の手法を試してみました。

モータの回転位置の誤差$\Delta \theta$を0になるようにPI制御して得られた誤差を、指定した回転速度に加えて推定回転速度を算出する手法でしたがうまくいきません。

 

次に以下の書籍の手法を試してみました。

Idによって誘導される電圧Edを算出して、それをPI制御して推定回転速度$\omega$を導出する手法でしたが
試した途端 ぶっこわれました。。。。

またプリドライバが壊れたようですが在庫が尽きたため、私の50日間はあえなく終了いたしました。

おわりに

残念ながらセンサレスベクトル制御は実現できませんでした。
ダメな要因としては全部ということなのですが、以下にわかる範囲でまとめてみました。

  • コントローラの制御ループ時間可変では無理じゃないか?
    モータ推定位置算出に推定回転速度は入るので算出時にループ時間を観測では誤差が拡がる一方ではないか
  • モータの定数の不確かさ
    モータ定数の測定値が正しくない可能性に加えてq軸に変換した際に測定値がそのまま使えるのか疑問
  • モータの駆動方法に問題がありそう
    センサありからセンサレスにいきなり移行するのは問題ありそう
  • 他の推定方法も要検討必要

こんな感じで惨敗でした。

 

しかしセンサありでのベクトル制御はできたので一定の達成感はございます。
電流を管理して回転が制御できるようになったのは今後の人生において非常に有用であると考えます。

ESP32によるセンサありベクトル制御に関しましては別途ソースコードと合わせていつか報告させていただきます。

 

また磁気エンコーダの測定遅延時間が悪さをしており、ソコに気づくのに多大な時間を要してしまいました。
またクローズドループ正弦波制御からやり直したいと思います。

 

この50日間 結構サボったけどほぼ毎日モータのことを考え、ブラシレスモータと私の距離はかなり縮まったと思います。
以前なら理解できなかったであろうベクトル制御に関する資料や書籍も大体読めるようになりました。

とりあえず50日間は終了しましたが引き続き頑張りたいと思います。
エンジニアリングはマラソンです。

次の記事

ESP32でベクトル制御 ーブラシレスモータ駆動への道9ー

コメントはこちらから

メールアドレスが公開されることはありません。コメントのみでもOKです。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください