BLDC回してみたいってツイートしただけなのに！〜気がついたら回っていた〜

今回の記事は本当に日記ですね。自己満足記事です。

# やっとBLDCモータが回った・・・
私は制御ツールベンダ社員かつパワエレネタで記事を書いておきながら
いままで自力でモータを回したことがないことに負い目を感じておりました。（個人の感想です）

ですがその負い目を感じる日々も終わりです。
ついにモータを回せたのでその時やったことを書こうと思います！
まずは回ったときの動画をどうぞ。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おおおおお！回った！ <a href="https://t.co/WCXFIyEG8B">pic.twitter.com/WCXFIyEG8B</a></p>&mdash; griffin921 (@griffin921) <a href="https://twitter.com/griffin921/status/1359349991035129860?ref_src=twsrc%5Etfw">February 10, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

では回すために何をやったかを紹介します。

# ツイートする

オシロスコープとSTのモータ駆動評価ボードを買ったことをツイートしました。
思えばここら辺から始まったのだと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/1f9fda27-7a6f-7df4-cf85-ef329b0b749a.png)
https://www.st.com/ja/evaluation-tools/p-nucleo-ihm001.html

# 絶望する
買ってみたはいいんですが、どうやって回せばいいかわかりません。
「系統連系とモータ制御ってだいたい同じだろ」などと舐めていた私は速攻撃沈しました。

# じたばたしてみる
サンプルプログラムは書き込まれてるので
とりあえず回るのは回るんですがどういう理屈で回ってるのかよくわかりません。
そこで、色々とっかかりを得るためにオシロスコープでいろんなとこの波形をみてみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">STのインプリコードなんですがちゃんと120degズレて電圧出てます。<br><br>ハーフブリッジの中間電圧を見ていると思います。 <a href="https://t.co/E9HPrrbbFW">pic.twitter.com/E9HPrrbbFW</a></p>&mdash; griffin921 (@griffin921) <a href="https://twitter.com/griffin921/status/1332264611408580609?ref_src=twsrc%5Etfw">November 27, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">マイコン購入時ビルドインされてるサンプルを見ながら120°通電の動かし方を理解してsimulinkに落とし込んでECでコード生成してみたいが、サンプルコードはどこで見れるかわからん。<br><br>ので実際の波形みながらどういう実装か予想する。</p>&mdash; griffin921 (@griffin921) <a href="https://twitter.com/griffin921/status/1343418095889596418?ref_src=twsrc%5Etfw">December 28, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

そんなツイートをしているとですね・・・
なぜかアドバイスをくださるモータ制御大好きエンジニアの皆さんがよってきてくださります。なぜか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/1cb0bdd5-8ebb-3296-cc86-28edadbac692.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/c49bb00d-ac85-b980-c9ff-fe44e02ee8df.png)

# だんだんわかってくる
アドバイスいただいた中からなんとなく私がモータの特性というものを理解していないから、どういうインバータ波形をだせば回るのかがわかっていないのだということがわかってきました。分からないところがどこかがわかるとしめたものです。

それに関連する資料をネットで漁ってみました、するとこういう記事にたどりつきました。

**STのモータ制御開発キットで『自力で』モータを回す　Vol.1 強制転流**
https://qiita.com/motorcontrolman/items/5a9c17008314f0224ef9
これはまさにアドバイスいただいた[モータ制御マンさん](https://twitter.com/motorcontrolman)の記事です。
ここでSTMのペリフェラル部分のコード実装についてだいぶ勉強になりました。


**BLモータのベクトル制御を実装する手順**
https://qiita.com/fumiya_sato/items/ecc9f22c6f137f9dc0ac

この記事は私に足りてなかったモータが回る原理についてだいぶヒントを与えてくれました。これでモータ制御の本の内容がちょっとだけわかるようになってきました！

**MATLAB Youtubeチャンネル：モーター制御 Part1 ブラシレスDCモーター入門**
手前味噌になっちゃいますが。。。
これも勉強になりました。
https://www.youtube.com/watch?v=gNpoTPzEkco&list=PLn8PRpmsu08qL-EG3DRMtRyokpXQJyhp7

#モデリングができそうになってくる
せっかくモータのことも理解でき始めたし、MBDを推進している会社で働いてるのでSimulinkでソフトウェアの挙動をモデリングしてそれをコード生成してみることをやってみました。

## モータのモデリング
Simulinkには別途Simscapeという物理モデリングがされたブロックが存在します。ここにBLDCのブロックがありますので、パラメータを入力してバーチャル上に今手元にあるモータに近しいモデルをつくりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/bdc1b6c4-7177-2c76-b590-296c650656d9.png)


パラメータについては[RRいにょさん](https://twitter.com/RR_Inyo)
のこちらの記事を参考にさせて頂きました。ありがとうございます。
https://negligible.hatenablog.com/entry/2020/11/11/195751

##　モータドライバのモデリング
購入したサンプルボートには[L6230](https://www.st.com/ja/motor-drivers/l6230.html)というモータドライバが載っています。
これも特徴としてはPWMの入力と各ハーフブリッジをEnable/Disableにする信号をうまく組み合わせることがモータを回すのに重要なポイントであることが理解でき始めていたので、データシートを参考にしながらしっかりモデリングしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/67973b81-e4c5-8fc1-6d49-c15919e4cefe.png)

## コントローラのモデリング
ここまでくれば回転するために必要な計算をモデリングしていきます。
ここではrpmを指定すれば3相のPWM波形を生成してくれる変調部分をモデリングしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/9ce831ed-5c95-398b-fad7-77c244b931dd.png)


そうやって作られたモデルの全体図がこちらです。
左下のバーはコントローラに入力するrpm値を操作するものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/38a45184-4df0-08fc-9f34-30c2c91a3cb1.png)

グラフの一番下がモータの機械角です。しっかり回ってることが確認できますし、
RPMの値を急激に変えすぎるとモータが脱調してしまうところも確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331637/4fc4581e-a41c-8259-0e72-17937e8d52c7.png)

動画でみるとこんな感じです
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Simulink上ではこんな感じになってて、左の緑色の箱のとこだけコード生成してます。 <a href="https://t.co/PapAJCstAU">pic.twitter.com/PapAJCstAU</a></p>&mdash; griffin921 (@griffin921) <a href="https://twitter.com/griffin921/status/1359353678155534338?ref_src=twsrc%5Etfw">February 10, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## ここまで理解がすすむと回る

ここまできたらしめたもの。
EmbeddedCoderのパワーをフルに使いコントローラ部をコード生成、
予めペリフェラル部だけ作っておいたハンドコードコードといっしょにビルドしました。

その結果まさかの一発動作。
モデルベース開発の神髄をいまさらながら確認することができました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おおおおお！回った！ <a href="https://t.co/WCXFIyEG8B">pic.twitter.com/WCXFIyEG8B</a></p>&mdash; griffin921 (@griffin921) <a href="https://twitter.com/griffin921/status/1359349991035129860?ref_src=twsrc%5Etfw">February 10, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#まとめ

- twitterでモータについてつぶやくと色々教えてくれる
- 情報が断片的でもそれをまとめると自分が知りたかったところに導いてくれる
- モデルにして検討することで　より早く現象を理解することができる
- モータ回るのはとても楽しい

以上です。　


ここにくるまでに助けてくださった皆さん！本当にありがとうございます！
皆さんの助けやツールによる助けによってできてしまった気もしますが、
これからも自分のペースで勉強していきたいなと思っています！