オープンループ正弦波駆動 ーブラシレスモータ駆動への道4ー
これまでは矩形波駆動によるブラシレスモータ制御を勉強し
前回は回転速度指定によるセンサレス クローズドループ矩形波制御を実現しました。
ここからはブラシレスモータの正弦波駆動について学びます。
目次
疑似正弦波
正弦波駆動の下準備としまして、まずはESP32で正弦波出力の生成を確認しました。
正弦波を直接出力できませんので、PWMのデューティを時間で変化させて疑似的に正弦波を実現させます。
以下がESP32による疑似正弦波出力の様子です。
正弦波駆動の準備
ESP32でPWMで疑似正弦波を出力
可変抵抗で周期と振幅 調整オシロでPWM出力とフィルタ介した波形見てるけど
測定時間長くしたらサンプリング全然できてなく
平滑化されてきれいな正弦波が観測された。はやくコレでモータ ドライブしたいね#ブラシレスモータ駆動への道 pic.twitter.com/tEyGvxYJ8a
— HomeMadeGarbage (@H0meMadeGarbage) April 29, 2022
可変抵抗を2個接続して正弦波の周期と振幅も変えれるようにしました。
Arduinoコードのコア部は以下のような感じ
1 2 3 4 5 6 |
for(int i = 0; i < 48; i++){ uSine = amp *(1.0 + sin(2.0 * PI / 48 * i)) / 2.0; ledcWrite(uPWMCH, int(uSine)); delay(period / 48); Serial.println(uSine); } |
2個の可変抵抗で正弦波の周期 period と振幅 ampを指定して、正弦波の周期を48分割してPWMのデューティを計算してledcWriteで出力しています。
コレを位相を120°ずらして3出力にしてドライバ駆動すればモータを回せるはずです。
ドライバ基板作製
これまでの正弦波駆動ではパワトラ駆動にはハイサイドとローサイドの入力を指定できるプリドライバIC IR2101を採用していましたが、正弦波駆動のために1入力でハイサイドとローサイドの信号を内部でデッドタイム込みで生成してくれる IR2302 を採用いたしました。
ドライバのNMOSには 2SK4017 を用いました。
1chの構成は以下の通りです。1入力でドライバ駆動できます。
まずは1ch分を作製しました。
コレに先ほどのESP32による疑似正弦波を入力します。
バッチリ動作
ドライバ基板の入力と出力を観測PWMによる疑似正弦波なんだけど
ADALM2000のオシロではサンプリング間に合わず平滑化され正弦波になる動作問題なし残り2ch行ってみよう
ゴールデンウィークをより輝かせるべく#ブラシレスモータ駆動への道 pic.twitter.com/syEBzK8251— HomeMadeGarbage (@H0meMadeGarbage) April 30, 2022
問題なくドライバ出力が確認できましたので残りの2chも作製し、ドライバ完成です。
ESP32で位相を120°ずらした3信号を入力して出力を観測しました。出力は抵抗で1/3に分圧して観測しています。
問題なく疑似正弦波が出力していますが、使用したADALM2000のオシロではサンプリングが間に合わず平滑化され正弦波に観えています。
オープンループ正弦波駆動
ドライバもできたのでいよいよ正弦波駆動を実施します。
構成
構成は以下の通りです。
- ESP32 評価基板
- プリドライバIC IR2302
- NMOS 2SK4017
- ブートストラップ用ダイオード 1N4148W
- ブラシレスモータ
Arduinoコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#define periodPin 36 #define ampPin 39 #define uHin 25 #define vHin 26 #define wHin 27 int uPWMCH = 0; int vPWMCH = 1; int wPWMCH = 2; float uSine, vSine, wSine; int period, amp; void setup() { Serial.begin(115200); ledcSetup(uPWMCH, 20000, 10); ledcAttachPin(uHin, uPWMCH); ledcWrite(uPWMCH, 0); ledcSetup(vPWMCH, 20000, 10); ledcAttachPin(vHin, vPWMCH); ledcWrite(vPWMCH, 0); ledcSetup(wPWMCH, 20000, 10); ledcAttachPin(wHin, wPWMCH); ledcWrite(wPWMCH, 0); } void loop() { period = analogRead(periodPin) * 2; amp = analogRead(ampPin) /4; Serial.println(period); for(int i = 0; i < 48; i++){ uSine = amp *(1.0 + sin(2.0 * PI / 48 * (i % 48))) / 2.0; vSine = amp *(1.0 + sin(2.0 * PI / 48 * ((i + 32) % 48))) / 2.0; wSine = amp *(1.0 + sin(2.0 * PI / 48 * ((i + 16) % 48))) / 2.0; ledcWrite(uPWMCH, int(uSine)); ledcWrite(vPWMCH, int(vSine)); ledcWrite(wPWMCH, int(wSine)); delayMicroseconds(period); } } |
疑似正弦波を生成するためにドライバ駆動ピン(IO25~27)はledcWriteを用いて20kHz PWM出力します。分解能は10ビット(0~1023) (L. 20-28)。
可変抵抗で正弦波の周期と振幅を設定します (L. 32, 33)。
疑似正弦波を48分割して120°位相をずらして出力します (L. 37-46)。
動作
まずは振幅Maxで動作確認しました。
無事にモータの回転を確認できました。低速回転もできていますが遅すぎると停止します。
オープンループ 正弦波駆動
かなり低速で回転させれる
但し遅すぎても早すぎても止まるセンサ導入でうまいこと制御できるのだろうか?#ブラシレスモータ駆動への道 pic.twitter.com/znnWH2Uepu
— HomeMadeGarbage (@H0meMadeGarbage) April 30, 2022
正弦波の振幅を小さく調整するとかなり低速でも回転できました。
オープンループ 正弦波駆動
低速回転はPWM疑似正弦波の振幅を小さく
つまり供給電流の低減で実現できた。この辺をフィードバックして自動化する必要があるな#ブラシレスモータ駆動への道 pic.twitter.com/dvm4ABO9nS
— HomeMadeGarbage (@H0meMadeGarbage) May 2, 2022
おわりに
オープンループでのブラシレスモータ正弦波駆動を確認することができました。
矩形波駆動では出来なかった低速回転が実現され大変満足です。
以下では可変抵抗で回転位置を指定して動作させました。
センサレスなので絶対位置の精度は高くないはずですが、それなりに動いたので驚きました。
可変抵抗で位置指定
これは確実にセンサあったほうが良い#ブラシレスモータ駆動への道 pic.twitter.com/htz2le84e9
— HomeMadeGarbage (@H0meMadeGarbage) May 2, 2022
次回はセンサでフィードバックをかけてクローズドループでの正弦波駆動を楽しみたいと考えています。
今回は高速回転ができませんでしたが、センサ導入でできるようになるのでしょうか?
今のところ なんとなく正弦波駆動は高速回転に向かないような気がしています。
コントローラの速度にも依存するかもしれませんね。
引き続き勉強進めます。