Raspberry pi + インバータでBLモータを回転させる（インバータからPWM出力）

# 1. はじめに
私を含め、Raspberry piを買ったはいいものの、何をやったらいいかわからず、持て余している方は多いのではないでしょうか。
特に私のかんｋでは、「ハードウェアを動かすこと」に困っている方が多いように思います。
それに加え、私は仕事でBLモータを使ってはいるものの、BLモータが回転するメカニズムがわかっていなかったので、Raspberry piでBLモータを回転させる実験機を作ることにしました。

実験機を作りにあたり、ESCではなくインバータ（本記事ではIHM07M1）を使うことで、
より正確にBLモータが回転するメカニズムを理解できるように努めました。

# 2. 本記事で参考にしたサイト
本記事は以下サイトを参考にしております。作成者の方にはこの場を借りて、お礼を申し上げます。
- [BLモータのベクトル制御を実装する手順](https://qiita.com/fumiya_sato/items/ecc9f22c6f137f9dc0ac#6%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E5%88%B6%E5%BE%A1)
- [Raspberry PiでBLDCモータを120°通電制御する]( https://negligible.hatenablog.com/entry/2021/03/26/035001)

# 3. 本記事のゴールと注意点
BLモータの回転に最もよく使われる方法は「ベクトル制御」だと思われ、私も当初はベクトル制御実装を目指していましたが、
Raspberry piはPWMチャンネルが2つしかなく、BLモータの3相を独立で制御することができません。
よって本記事では「センサード120°制御+電流計測」までを解説します。

# 4. 本記事の構成
前述の「センサード120°制御+電流計測」を全て解説するとなると本文が膨大となるため、タスクとに、下記のように記事を分けます。

1. [BLモータの絶対角計測](https://qiita.com/hiyo_control/items/66affbccbd3b8dbe3892)
2. インバータ（IHM07M1）からのPWM出力（本記事の範囲）
3. [BLモータの3相電流のAD変換と読み取り](https://qiita.com/hiyo_control/items/dc1b8c25310a649aa647)
4. [実験機製作と動作確認](https://qiita.com/hiyo_control/items/b629c0979d1acaa26784)

前半1章～3章で必要な機能の実装方法を述べ、後半4章と5章ではどのように実験機とプログラムを作ったかを述べます。

# 5. インバータ（IHM07M1）からのPWM出力
## 5.1. 使用する機器と配線図
本記事で紹介する機器を以下に示します。

|機器名|型番
|---|---|
|BLモータ       | [A2212 KV1000](https://www.amazon.co.jp/dp/B01DBGY6OA?ref=ppx_yo2ov_dt_b_fed_asin_title)
|インバータ     | [IHM07M1](https://jp.rs-online.com/web/p/power-motor-robotics-development-tools/1438877?msockid=1e660b96eaaf6bc435eb1f5eeb8d6a61)
|DCDCコンバータ | [AE-LTC3111](https://akizukidenshi.com/catalog/g/g111212/)
|DCジャック     | [AE-DC-POWER-JACK-DIP](https://akizukidenshi.com/catalog/g/g105148/)
|ACアダプタ     | [M050200-A010JP](https://akizukidenshi.com/catalog/g/g118205/)
|コンピュータ   | Raspberry pi 4 Model B

上表で示した機器を下図のように接続します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839547/f16650ba-20c7-4356-a9cc-52599baa3864.png" width=90%>

接続図にある、
- IHM07M1の印加電圧
- UVW各相へのPWM
- UVW各相へのEnable

についての補足を下記に示します。

### IHM07M1の印加電圧
[IHM07M1のデータシート](https://www.st.com/content/ccc/resource/technical/document/data_brief/group0/a0/4a/9a/e5/25/17/41/0f/DM00225230/files/DM00225230.pdf/jcr:content/translations/en.DM00225230.pdf)より、J1には8V～48Vの間の電圧を印加することができます。
今回「15V」と決めたのは、手元にあったDCDCコンバータの最大出力電圧が「15V」だったからです。

### UVW各相へのPWM
IHM07M1のJ2からPWMを出すには、Raspberry piからIHM07M1へPWMを加える必要があります。
Rapsberry piでPWM出力のできる端子は下記です。
- PWM Channel 0：GPIO12（32Pin）、GPIO18（12Pin）
- PWM Channel 1：GPIO13（33Pin）、GPIO19（35Pin）

※ [Raspberry piのデータシート](https://datasheets.raspberrypi.com/rpi4/raspberry-pi-4-datasheet.pdf)から引用

上表が示すようにRaspberry piにはPWMチャンネルが2つしかないため、独立で出力できるPWMは2つまでです。
本記事で紹介する「センサード120°制御」は1チャンネルずつPWMを指定するので問題はありませんが、「ベクトル制御」は3チャンネル独立にPWMを指定する必要があるため、Raspberry piの機能ではベクトル制御を実装することはできません。

IHM07M1の回路図より、C10_23、C10_21、C10_33にUWVのPWMを入力する必要があります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839547/353c2ada-ff45-4e93-9e31-cd1cb0381ce7.png" width=70%>

※ 上図は[IHM07M1のデータシート](https://www.st.com/content/ccc/resource/technical/document/data_brief/group0/a0/4a/9a/e5/25/17/41/0f/DM00225230/files/DM00225230.pdf/jcr:content/translations/en.DM00225230.pdf)からの抜粋です

### UVW各相へのEnable
詳しくは後述しますが、「センサード120°制御」のためにはUVW相の「どの相からどの相へ電流を流すか」を指定しなければいけません。それをするために、Enableを使います。

IHM07M1の回路図より、C7_1～V7_3とRaspberry piのGPIOを接続します。GPIOはON/OFFができればいいので、どれを選んでも問題ありません。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839547/7f15ad68-175e-4eb8-8260-64b9ccaaf5c5.png" width=70%>

※ 上図は[IHM07M1のデータシート](https://www.st.com/content/ccc/resource/technical/document/data_brief/group0/a0/4a/9a/e5/25/17/41/0f/DM00225230/files/DM00225230.pdf/jcr:content/translations/en.DM00225230.pdf)からの抜粋です

## 5.2. IHM07M1からのPWM発生確認
IHM07M1にて、
- Enableが正常に動作するか
- J2からPWMが出力されるか

の動作確認をするために、下図の1～6を繰り返すプログラムを作成します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839547/189ad7e0-b004-4ef7-8088-b56f5508503c.png" width=90%>

※ 図は[こちら](https://www.renesas.com/ja/support/engineer-school/brushless-dc-motor-02-inverter-pmw)のサイトから利用させていただきました。

下表のようにPWMとEnableを変化させます。

|No|U相 PWM|V相 PWM|W相 PWM|U相 Enable|V相 Enable|W相 Enable
|---|---|---|---|---|---|---|
|1  |Output|0     |0     |ON |OFF|ON
|2  |Output|0     |0     |ON |ON |OFF
|3  |0     |0     |Output|OFF|ON |ON
|4  |0     |0     |Output|ON |OFF|ON
|5  |0     |Output|0     |ON |ON |OFF
|6  |0     |Output|0     |OFF|ON |ON

今回は「Enterキー」を順番に押すとNo1～No6の順に変化するプログラムを作成し、J2から意図したPWMが出力されるかを確認します。

## 5.3. インバータPWM発生プログラム
著者の作成したインバータPWM発生プログラムは以下Githubリンクにて公開しております。
https://github.com/hiyo-control/02_BL_motor/tree/main/Chapter2_IHM07M1_program

プログラム作成では下記Githubで公開されているコードを参考しました。
https://github.com/RR-Inyo/bldc6p

## 5.4. 動作の様子
J2とオシロスコープを繋ぎ、プログラムを実行するとPWMが確認できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839547/60c2c122-79de-402a-a1fc-efa32953c63b.jpeg" width=70%>

また、J2とBLモータを接続し、Enterキーを押し続けるとBLモータを回転させることができます。
その様子は下記のyoutubeリンクからご覧ください。
<iframe width="560" height="315" src="https://www.youtube.com/embed/tILvd1UYAQU?si=vJyP94_fEtOnfX2F" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>