ブラシレスモータ駆動への道 爆誕
以前、デジタルおかもちをブラシレスモータを使用して製作しました。
デジタルおかもちは要するに1軸のジンバルのようなもので2軸にも挑戦したいと思ったのですが、使用しているモータが重たいのでさすがに2個搭載は厳しいものがございます。
ちなみに使用したモータは自作の姿勢制御モジュールに使用しているものです。
ドライバとコントローラ内蔵で制御はデジタル信号だけで実施できるので非常に便利なモータです。
将来的に2軸のジンバルを自作してみたいので小型のブラシレスモータを自由自在に制御してみたいと強く思いましたので、ここに”ブラシレスモータ駆動への道”の開設を宣言します。
目次
ブラシレスモータいじり
まずは小型のブラシレスモータと各種コントローラを購入して、自身とブラシレスモータとの距離を縮めることにいたしました。
センサのない3端子のみの小型で軽いブラシレスモータを2種類 購入しました。
コントローラ①
ESCを購入してブラシレスモータを回転させてみました。
かわいいブラシレスモータ買ったので味見
カメラジンバル ブラシレスモータhttps://t.co/PNFIwtlWpY
コントローラも購入
ESCブラシレモータ速度コントローラhttps://t.co/mnR6JynqoVツマミのついたユニット安っぽいけどPWM出力してくれてサーボの味見にも使えそう pic.twitter.com/XdgChbWziN
— HomeMadeGarbage (@H0meMadeGarbage) March 12, 2022
PWM入力でモータ速度を制御できます。
ツマミ付きのPWM出力するコントローラも付属され、50Hz 5%~10%のPWMを出力します。
無事にブラシレスモータを回転させることができましたがESCが何をしているか分からず(分解すればいいのだが。。)、回転方向も変えれず一方方向のみです。
コントローラ②
回転方向を変えれるコントローラも購入し試してみました。
コントローラ買ってみた。
回転方向切り替え遅い
こんなもんなのか?ブラシレスモーターコントローラー 20A DC12V-36Vhttps://t.co/0D75sDmSGP pic.twitter.com/c2NJBkH2w5
— HomeMadeGarbage (@H0meMadeGarbage) April 12, 2022
問題なく動作しましたが回転方向の切り替え応答が遅かったです。
参考: Brushless Motor Controller Board
試しにこのコントローラを用いてIMUセンサ MPU6050で回転を制御する1軸ジンバルにしてみましたが
応答が遅くてダメダメでした。。
応答おそい pic.twitter.com/oJAkWA9UEX
— HomeMadeGarbage (@H0meMadeGarbage) April 18, 2022
手動
乾電池を使用して手で印可方向を変えながらモータを回してみました。
コレをコントローラでやるか#ブラシレスモータ駆動への道 pic.twitter.com/CbMSZyua13
— HomeMadeGarbage (@H0meMadeGarbage) April 20, 2022
手で印可方向を変えるのは大変なので、3Dプリンタで治具を製作しました。
単4電池がすっぽり入る円形の容器を出力し、フチに銅箔テープで3分割した電極を設けました。
電極とブラシレスモータの端子を3対接続して、中で電池を回せば先ほどの手動での作業が容易にできます。
いざ勉強するとなると
余計なことをしてしまう#ブラシレスモータ駆動への道 pic.twitter.com/g6PZcSuR1L— HomeMadeGarbage (@H0meMadeGarbage) April 20, 2022
電池の回転方向や速度に応じてブラシレスモータも回転しています。
要するにこの電圧印可方法をコントローラで自動化してあげればよいということが実感されました。
この道の目標
ブラシレスモータの回し方を実感としても理解できましたので、コントローラの自作を目指します。
現状以下のように段階を経て理解を深め良いコントローラの完成を目指します。
- モータ駆動ドライバの実現
- 簡単な矩形波駆動でモータの回転を確認する
- センサレスでの回転速度制御実現
- 正弦波駆動やベクトル制御など他の制御も学習する
駆動ドライバの製作
ブラシレスモータのコントローラ自作に先立ってまずはモータを駆動するドライバを製作します。
市販コントローラの検証
以下のコントローラのドライバ部を参考に検証します。
ドライバ のローサイド、ハイサイドは意外にも共にNch MOSFET (NCE6990) が使用されていました。
前段にはIR2101というICが載ってブートストラップでハイサイドトランジスタを 駆動していました。
ドライバ製作
検証したコントローラの部品をとって駆動基板を製作します。
1ch
まずは1ch分のMOSFETとIR2101をとって改めて基板に実装してみました。
ゲート抵抗 (100 ohm)やブートストラップのダイオードとコンデンサもそのまま移植しました。
駆動ICのIR2101の入力を制御して出力波形を観測しました。
ドライバの電源は12V、入力にはATOM LiteのIO出力(0-3.3V)を使用しました。
問題なく動作しました。
両サイドのトランジスタがONしないように1usecのデッドタイムを設けています。
3ch
同様に残りの2chも部品をとって3chの駆動基板を完成させました。
3ch分のハイサイド、ローサイド駆動用入力ピン6個と3個の出力ピンと電源(12V)・GNDピンがございます。
矩形波駆動
作製したドライバ基板を用いてブラシレスモータを回してみます。
駆動方法は矩形波駆動を用います。ちょうど先の動画の乾電池をくるくる回した方法を自動化するイメージです。
矩形波駆動は以下のように6個の印可ステートを順に変えてモータを回します。
このステートの変え方を逆にすればモータは逆転します。
参考: 矩形波駆動とは
動作
ATOM Liteの6個のIOをもちいて3chのハイサイド、ローサイドのトランジスタを上記の矩形波駆動のステートでON/OFFさせました。
ATOM Liteのボタンを押すと逆転します。
矩形波駆動
ATOM LiteのボタンON/OFFで正転/逆転
ビリビリ言ってるwwこのドライバを携えて
制御方法を勉強していきたい#ブラシレスモータ駆動への道 pic.twitter.com/UxWPHeDKQm— HomeMadeGarbage (@H0meMadeGarbage) April 21, 2022
各ステートの時間は10usecで駆動しました。
かなり電流が流れるので回転はしていますが振動して元気ですww
PWM駆動
ハイサイドのオンをフルオンではなくPWM デューティ 12.5% (20kHz)にして電流低減を図りました。
ハイサイドのオンをPWM デューティ 10% (20kHz)にして電流低減
なかなか安定した回転はやく自動で指定した回転速度に追従して
負荷に応じて電流制御できるようになりたい#ブラシレスモータ駆動への道 pic.twitter.com/veh6igFdqN— HomeMadeGarbage (@H0meMadeGarbage) April 21, 2022
電源電流も減って回転も落ち着きました。
自動での回転速度追従や負荷に応じたPWM制御などできるようになりたいです。
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
#define Bottun 39 #define uHin 22 #define uLin 19 #define vHin 23 #define vLin 33 #define wHin 21 #define wLin 25 int uPWMCH = 0; int vPWMCH = 1; int wPWMCH = 2; int State = 0; int span = 10; void setup() { pinMode(Bottun, INPUT); pinMode(uLin, OUTPUT); pinMode(vLin, OUTPUT); pinMode(wLin, OUTPUT); digitalWrite(uLin, LOW); digitalWrite(vLin, LOW); digitalWrite(wLin, LOW); 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() { if(State == 0){ ledcWrite(uPWMCH, 128); digitalWrite(uLin, LOW); ledcWrite(vPWMCH, 0); digitalWrite(vLin, HIGH); ledcWrite(wPWMCH, 0); digitalWrite(wLin, LOW); }else if(State == 1){ ledcWrite(uPWMCH, 128); digitalWrite(uLin, LOW); ledcWrite(vPWMCH, 0); digitalWrite(vLin, LOW); ledcWrite(wPWMCH, 0); digitalWrite(wLin, HIGH); }else if(State == 2){ ledcWrite(uPWMCH, 0); digitalWrite(uLin, LOW); ledcWrite(vPWMCH, 128); digitalWrite(vLin, LOW); ledcWrite(wPWMCH, 0); digitalWrite(wLin, HIGH); }else if(State == 3){ ledcWrite(uPWMCH, 0); digitalWrite(uLin, HIGH); ledcWrite(vPWMCH, 128); digitalWrite(vLin, LOW); ledcWrite(wPWMCH, 0); digitalWrite(wLin, LOW); }else if(State == 4){ ledcWrite(uPWMCH, 0); digitalWrite(uLin, HIGH); ledcWrite(vPWMCH, 0); digitalWrite(vLin, LOW); ledcWrite(wPWMCH, 128); digitalWrite(wLin, LOW); }else if(State == 5){ ledcWrite(uPWMCH, 0); digitalWrite(uLin, LOW); ledcWrite(vPWMCH, 0); digitalWrite(vLin, HIGH); ledcWrite(wPWMCH, 128); digitalWrite(wLin, LOW); } if (digitalRead(Bottun) == HIGH) { State++; if(State > 5) State = 0; }else{ State--; if(State < 0) State = 5; } delay(span); } |
おわりに
ブラシレスモータをいじくりつつ、駆動ドライバ基板を製作して矩形波駆動でモータ回転を楽しみました。
徐々に学習を進めて この道の目標を達成しつつ ブラシレスモータのコントローラを完成させたいと考えています。
ここではいわゆるオープンループ制御を楽しみましたので
次回はモータの回転をセンサレスでフィードバックしての回転速度制御を目指します。