はじめに
ブラシレスモーターを制御するための回路とソフトウェアについて、MCUを主軸に解説します。MCUのメーカーを変えても同じ事が出来るように、各社のペリフェラルの違いや特徴について複数回に分けて解説します。今回はSTマイクロエレクトロニクス社製 STM32F0です。
なお接続方法やプログラムソースコード全文、モーター操作用PCアプリは著者の Githubに掲載しました。本記事の内容を実際に試してみる際にご参照下さい。
STM32とは?
STM32の特徴
総括的な特徴はメーカーホームページをご参照下さい。
STM32 Arm Cortex 32bitマイクロコントローラ
STM32ファミリ
私の主観としては、”モーター制御用途でも十分使用可能な超汎用MCU”です。現状最も人に勧められるMCUの1つです。2つめのリンク stmcu.jpは、ログインする事でリファレンスマニュアルやペリフェラルの使い方に関する日本語資料が閲覧できますので、ユーザー登録をおススメします。
使用するMCUと評価ボード
今回はSTM32F0シリーズのF030R8を選定しました。評価ボードは”Nucleo-F030R8”です。
STM32F0 Series – Arm Cortex-M0
NUCLEO-F030R8 – STM32 Nucleo-64
STM32F0シリーズはSTマイクロエレクトロニクス社製MCUの中でもエントリークラスに位置しています。入手可能な評価ボードの中で最もローエンド品を選択しました。
開発環境
項目 | 名称 | メーカー |
---|---|---|
統合開発環境 | IAR Embedded Workbench for Arm | IARシステムズ |
コード生成ツール | STM32CubeMX | STマイクロエレクトロニクス |
最初からSTM32しか使わないのであれば、メーカーより全部入りの統合開発環境 STM32CubeIDE がリリースされていますので、こちらの方がおススメです。今回はメーカーをとっかえひっかえしますので、出来るだけ汎用的に使えるようIAR Embedded Workbench for Armを選択しました。
接続方法
MCU評価ボードとモータードライバの接続
MCU評価ボードからモータードライバへの回転指令(黄)と、モータードライバで検出した電流信号(赤)を接続します。各ピンの具体的な機能は次章で説明します。
EN_GATE(青)はモータードライバ自身のON/OFF信号となります。今回は常時ONとしますが、ここをOFFにすることで待機時の消費電力を削減する事が出来ます。GND(灰)を接続することで、MCU評価ボードとモータードライバの基準電位を合わせます。
MCU評価ボードとモーターの接続
モーターのローター位置を検出するホールセンサ信号(緑)を接続します。3.3V(赤)とGND(灰)は、MCU評価ボードからモーターのホールセンサへ電源を供給します。モーターの6~8ピンはMCU評価ボードでは無く、モータードライバと接続します。
その他の接続
モータードライバとモーター、モータードライバと安定化電源の接続は、紙面に収まりきらないためここでは説明を省略します。著者GitHubの接続図をご参照下さい。
フェーズ1 : ホールセンサ読み取り
ここではブラシレスモーターのホールセンサ読み取りを実現する方法を解説します。
利用するピンと機能
利用するピンはPC6〜8の3ピンで、ペリフェラルはTIM3を利用しました。TIM3はホールセンサを読み取るための機能が備わっており、信号が切り替わるごとに割り込みとタイマーカウント値キャプチャが出来ます。
実装と動作確認
STMCubeMXのTIM3設定は以下としました。著者GitHubに設定ファイル(.ino)も入っていますので、詳しい内容は設定ファイルをご参照下さい。
プリスケーラを480(0からカウントするので-1している)にすると、10us毎にタイマーがカウントアップします。プリスケーラ値は細かくするほど時間分解能が上がりますが、最大カウント値が制約となり最低回転数読み取りとのトレードオフになります。
ソフトの動作イメージです。各関数の呼び出し関係とざっくり何をしているのかを示しています。
ホールセンサの信号が変化するたびに、大きく2つの作業を行います。
1.3つのホールセンサ信号からローターの位置と回転方向を判定
2.ホールセンサの信号が切り替わる時間間隔から回転速度を判定
表中のグレー枠(Commutation())は次フェーズで説明します。
また上記とは別に、一定時間以上ホールセンサ割り込みが無い場合に回転が止まったと判定する処理も行っています。
STM32のおススメポイント・イマイチポイント
ホールセンサを読み取る機能があると説明しましたが、今後説明するモーター制御専用MCUと比較するとそこまで充実した機能ではありません。今回ホールセンサの読み取り、回転方向検出はソフトウェアで実装していますが、他メーカーでは上記機能がペリフェラルに組み込まれており、ソフト作成が不要な物もあります。
フェーズ2 : オープンループでモータ制御
フェーズ1で検出したローターの位置に応じて、電力を供給するコイルを切り替える方法を解説します。
利用するピンと機能
利用するピンはPA8〜10、PB13~15の6ピンで、ペリフェラルはTIM1を利用しました。TIM1は6chのPWM出力を行うための便利な機能が多くあります。また別のタイマーやADコンバータとの連携機能も充実しています。
実装と動作確認
STMCubeMXのTIM1設定は以下としました。特にTIM1は機能が多く、全設定画面を載せきれないため最上部のみ載せています。
Channel1で”PWM Generation CH1 CH1N”を選択すると、自動的に補相出力(片方がONだともう片方はOFF)となります。カウンターモードはセンターアラインモード(カウントアップとカウントダウンを繰り返すモード)を選択しました。フェーズ4で説明する電流検出で都合が良いためです。
ソフトの動作イメージです。フェーズ1で説明しなかったCommutation()関数が使われます。
ホールセンサ割り込みをきっかけに、PCから指令された回転方向に応じてどのピンに対してPWMを出力するか決めています。ここでは回転速度には関与しません。
上記とは別に、10ms毎に回転速度を制御する処理を行います。
PCから指令された回転速度とモーターの回転速度を比較し、PI制御を行っています。PI制御で演算した結果でPWMのデューティ比を決めています。
STM32のおススメポイント・イマイチポイント
モーター制御に必要なPWM出力機能は最強クラスと言えます。またSTM32CubeMXの強力な設定機能で大体の機能はほぼコーディング不要で実現出来ます。しかしTIM1に限りませんが、STM32CubeMXの設定はリファレンスマニュアルのレジスタ設定と異なる表現になっているため、細かく使おうとすると自動生成コードを読解する必要があります。気に入らない部分は、HALドライバを使わず直接レジスタを編集するのもアリです。
フェーズ3 : モータ電流検出
モーター回転時の電流を測定します。ADコンバータとPWMを同期することで、スイッチングノイズを回避して電流を測定します。
利用するピンと機能
利用するピンはPA0,1,4の3ピンで、それぞれADC_IN0,1,4を利用しました。TIM1からの信号をトリガーにAD変換を開始する事が出来ます。また今回は使いませんでしたが、AD変換結果をDMAで直接RAMに転送することも出来ます。
実装と動作確認
STMCubeMXのADC設定は以下としました。Mode(図左)については使用するチャンネルを選択しているだけです。
External Trigger Conversion Source を”Timer 1 Trigger Out event”にすることで、TIM1に同期してAD変換を開始する事が出来ます。
ソフトの動作イメージです。AD変換完了割り込みを利用することで、TIM1同期信号発生(TIM1 Update event)からAD変換完了までソフト側で介入せず、ペリフェラルだけで完結しています。
モータードライバの回路の都合上、PWM出力ONのタイミングでのみ電流測定が可能です。そのためPWM出力OFF時はAD変換結果を破棄しています。
AD変換するチャネルは、ホールセンサ割り込み時の出力パターン設定時に合わせて設定しています。
STM32のおススメポイント・イマイチポイント
AD変換は正直かなりクセがあり、使用方法の理解に苦労します。ただ理解すれば指定したチャネルを順番にAD変換してくれたり、AD変換結果が指定範囲から外れると割り込みを掛けてくれたりと中々便利な機能があります。
まとめ
STM32でブラシレスモーター制御はアリか?
今までSTM32を使ったことがある人、今後別件でもSTM32を使う予定がある人には間違いなくおススメです。またあまりMCUに慣れていない人でも、Web上に日本語も含めて情報がたくさんあるので導入ハードルが低いでしょう。
ただしモーター制御に特化した機能というと、少し物足りないと言えます。ただ汎用MCUとして考えた場合、STM32ほどモーター制御用機能が組み込まれたMCUは少ないです。何の用途でも安定して80点 という印象です。
次回は?
ルネサスエレクトロニクス社製 RL78/G14を解説します。モーター制御専用MCUだけあって機能が充実しています。16bitMCUではありますがベクトル制御も可能なほどパワフルです。
今回解説したプログラムをベースに、ペリフェラルに関わる部分のソフト(ML_***.c)のみ変更して同じ動作を行います。これにより出来るだけ同じ土俵で各メーカーの差を明確にしていきます。
こちらも是非
“もっと見る” ブログ
【フーリエ級数編6:フーリエ級数実践編】イメージでしっかりつかむ信号処理〜基礎から学ぶFFT〜
オイラーの公式は本当に重要&有用なものなので、しつこいようですがもう少しその意味を掘り下げておきたいと思います。話が脱線しているように見えるかもしれませんが、オイラーの公式と複素数についてしっかりイメージを固めておくことがこの後の話で大切になってきます。
【フーリエ級数編5:複素フーリエ級数】イメージでしっかりつかむ信号処理〜基礎から学ぶFFT〜
オイラーの公式は本当に重要&有用なものなので、しつこいようですがもう少しその意味を掘り下げておきたいと思います。話が脱線しているように見えるかもしれませんが、オイラーの公式と複素数についてしっかりイメージを固めておくことがこの後の話で大切になってきます。
【フーリエ級数編4:フーリエ係数を求める】イメージでしっかりつかむ信号処理〜基礎から学ぶFFT〜
フーリエ級数で表現したい信号x(t)があるとして、そのx(t)をうまく再現してくれるようなフーリエ係数Ak, Bkを求めることはどうすればできるのでしょうか。