1. はじめに
私を含め、Raspberry piを買ったはいいものの、何をやったらいいかわからず、持て余している方は多いのではないでしょうか。
特に私の感覚では、「ハードウェアを動かすこと」に困っている方が多いように思います。
それに加え、私は仕事でBLモータを使ってはいるものの、BLモータが回転するメカニズムがわかっていなかったので、Raspberry piでBLモータを回転させる実験機を作ることにしました。
実験機を作りにあたり、ESCではなくインバータ(本記事ではIHM07M1)を使うことで、
より正確にBLモータが回転するメカニズムを理解できるように努めました。
2. 本記事で参考にしたサイト
本記事は以下サイトを参考にしております。作成者の方にはこの場を借りて、お礼を申し上げます。
3. 本記事のゴールと注意点
BLモータの回転に最もよく使われる方法は「ベクトル制御」だと思われ、私も当初はベクトル制御実装を目指していましたが、
Raspberry piはPWMチャンネルが2つしかなく、BLモータの3相を独立で制御することができません。
よって本記事では「センサード120°制御+電流計測」までを解説します。
4. 本記事の構成
前述の「センサード120°制御+電流計測」を全て解説するとなると本文が膨大となるため、タスクとに、下記のように記事を分けます。
- BLモータの絶対角計測
- インバータ(IHM07M1)からのPWM出力
- BLモータの3相電流のAD変換と読み取り
- 実験機製作と動作確認(本記事の範囲)
前半1章~3章で必要な機能の実装方法を述べ、最後の4章では「どのように実験機を作ったか」と「動作確認結果」を述べます。
5. 実験機製作と動作確認
5.1. 使用する機器と配線図
本記事で使用する機器を以下に示します。
機器名 | 型番 |
---|---|
角度センサ | AS5048A |
電流センサ | ACS712 |
ADコンバータ | MCP3208 |
インバータ | IHM07M1 |
BLモータ | A2212 KV1000 |
DCDCコンバータ | AE-LTC3111 |
DCジャック | AE-DC-POWER-JACK-DIP |
ACアダプタ | M050200-A010JP |
抵抗 | 220Ω |
コンデンサ | 2.2μF |
コンピュータ | Raspberry pi 4 Model B |
上表で示した機器を、過去記事で紹介した図のように接続します。
実際に作った実験機の外観は下図となります。



5.2 センサード120deg制御の実装
IHM07M1の記事でも紹介したように、BLモータはNo1~No6を順に遷移させるだけ(センサレス120deg制御と呼びます)でも回転します。

※ 図はこちらのサイトから利用させていただきました。
ですがより滑らかに回転させるためには、BLモータの角度を計測し、その計測値に応じてNo1~No6を適用させた方が良いです(この方法はセンサード120deg制御と呼びます)。
よってこれより、下記サイトを参考に、センサード120deg制御を実装します。
センサード120deg制御実装を、下表を使って考えます。
No | PWMの向き | モータ変数 |
---|---|---|
1 | U相 → V相 | ? |
2 | U相 → W相 | ? |
3 | V相 → W相 | ? |
4 | V相 → U相 | ? |
5 | W相 → U相 | ? |
6 | W相 → V相 | ? |
この表の「?」を埋める、つまり「モータ変数がいくつの時、PWMをどの相からどの相に流すか(=どのNoを適用するか)」を決めれば、センサード120deg制御を実装できます。
この表の「?」を埋めるためには、モータ変数は以下の2条件を満たすことが好ましいです。
- モータ変数の原点とU相が一致する
- 上表のNo6からNo1に移り変わるとき、モータ変数はリセットする
以下より、上記2条件を満たすモータ変数を求めましょう。
5.2.1 モータ変数の原点とU相が一致させる
まずはNo1~No6の移り変わりとモータ角度(センサ生値)の変化を見てみましょう。
変化を見るには、センサレス120deg制御でモータを動かします。このリンクにあるexeファイルを使っていただければ、No1~No6の移り変わりとモータ角度(センサ生値)の変化をcsvファイルで出力してくれます。

グラフより、この場合はモータ角度(センサ生値)はNo1とNo2の間でリセットすることがわかります。
「モータ変数の原点がU相と一致する」とは、「No4とNo5の間でモータ変数がリセットする」ということなので、下記の処理より「補正後モータ角度」を求めます。
- No4時点とNo5時点のモータ角度(センサ生値)の平均を計算する
- 平均値を差し引いた後の値と、角度センサの最大値とのmodを計算する
先ほどのグラフからNo4とNo5の平均値を計算しましょう。

その結果は下記となります。
$$
\frac{1445+1886}{2} = 1665.5
$$
次に角度センサの最大値も合わせてmodを計算します。AS5048Aは14bitなので、計算式は下記となります。
$$
\text{補正後モータ角度} = \text{mod}(モータ角度(センサ生値)-1665.5, 2^{14})
$$
補正後モータ角度が計算できたので、先ほどのグラフに重ねてみます。

グラフより、補正後モータ角度の原点がNo4とNo5の間、つまりU相と一致したことが確認できました。
5.2.2 No6からNo1に移り変わるときにリセットするモータ変数
直前のグラフを見ると、補正後モータ角度が1周する間に、No1~No6の移り変わりが7周※していることがわかります。
※ これはBLモータの極対数と一致します。今回使用するBLモータのA2212 KV1000の極数は14。極対数はその半分なので7となります。
前述の表を埋めるモータ変数は、No6→No1となるときにリセットされてほしいです。そのような変数は、「補正後モータ角度」と「角度センサ最大値を7で割った値」とのmodをとることで計算できます。
$$
\text{モータ変数} = \text{mod}(補正後モータ角度,\frac{2^{14}}{6})
$$
この計算により得られるモータ変数を、グラフに重ねてみます。

グラフより、モータ変数がNo6→No1でリセットされることを確認できました。
5.2.3 モータ変数とPWMを掛ける向きの決定
下記の条件を満たすモータ変数が求められたので、そのモータ変数とPWMを掛ける向きの対応を決定します。
- モータ変数の原点とU相が一致する
- 上表のNo6からNo1に移り変わるとき、モータ変数はリセットする
まずはモータ変数が0と最大値($2340.6=\frac{2^{14}}{7}$)の時、どの向きにPWMを掛けるべきかを考えましょう。
下図より、モータ変数が原点と最大値を通過するのはNo5のPWMを掛けたときなので、「0と最大値($2340.6=2^{14}/7$)の時はNo5の向きにPWMをにゅうりょくする」ということがわかります。

※ 上図はこちらから使用させていただきました。
No | PWMの向き | モータ変数 |
---|---|---|
1 | U相 → V相 | ? |
2 | U相 → W相 | ? |
3 | V相 → W相 | ? |
4 | V相 → U相 | ? |
5 | W相 → U相 | 0, 2340.6 |
6 | W相 → V相 | ? |
後はNo1~No6それぞれのモータ変数のレンジが
$$
(\frac{2^{14}}{6})*\frac{1}{6}=390.1
$$
であるので、
No | PWMの向き | モータ変数 |
---|---|---|
1 | U相 → V相 | 585.1~975.2 |
2 | U相 → W相 | 975.2~1365.3 |
3 | V相 → W相 | 1365.3~1755.4 |
4 | V相 → U相 | 1755.4~2145.5 |
5 | W相 → U相 | 2145.5~2340.6、0~195.0 |
6 | W相 → V相 | 195.0~585.1 |
となります。この表通りにPWMを掛ければ、より滑らかにBLモータを回転させることができます。
これはセンサーを使った120deg制御なので、「センサード120deg制御」と呼ばれます。
5.3 本記事で使用したプログラム
本記事で使用したプログラムは以下Githubリンクにて公開しております。