はじめに
ブラシレスモーターを制御するための回路とソフトウェアについて、MCUを主軸に解説します。MCUのメーカーを変えても同じ事が出来るように、各社のペリフェラルの違いや特徴について複数回に分けて解説します。今回はルネサスエレクトロニクス社製 RL78/G14です。
なお接続方法やプログラムソースコード全文、モーター操作用PCアプリは著者の Githubに掲載しました。本記事の内容を実際に試してみる際にご参照下さい。
本連載の特徴
1.MCU評価ボード以外は一緒
本連載では、MCU評価ボードのみを入れ替えていき、同じハードウェアでブラシレスモーターを制御します。以下の写真の通り、前回のSTM32からMCU評価ボードのみ変更しています。
2.アプリケーション層は(出来るだけ)変えない
ハードウェアだけではなく、ソフトウェアも出来る限り共通化しています。上図の境界線上のML_madeが筆者作成のソフトウェアで、境界線下のMCUメーカー製がメーカー提供のドライバもしくはレジスタです。
MCUメーカーごとの差異をInterface層で吸収することで、Common層の変更を最小限に留めています。今回のRL78の場合、初期化以外のペリフェラルドライバは少ないので、Interface層でレジスタを直接読み書きしています。
RL78とは
RL78の特徴
ルネサスエレクトロニクス株式会社(以下ルネサス)のMCUラインナップ中、最もローエンドな8/16ビットCPUシリーズです。低消費電力と豊富な周辺機能が特徴です。
RL78低消費電力8/16ビットMCU | Renesas
RL78 モータ制御ソリューション | Renesas
実はちゃんと触ったのは今回が初めてでした。検討はしていたのですが、armと比べてコスパが悪そうな印象があったためです。
使ってみて印象ががらりと変わりました。豊富な周辺機能がMCUの性能を底上げしており、CPU性能だけでは見えないすばらしいパフォーマンスを発揮します。
使用するMCUと評価ボード
使用するMCUは RL78/G14 シリーズです。
RL78のモーター制御用ラインナップの中では比較的高性能なシリーズで、なんとローエンドシリーズにも関わらずベクトル制御が可能です。
評価ボードは RL78/G14 Fast Prototyping Board を使用しました。
デバッガ付きで安価な評価ボード という縛りで選定すると、モーター制御用MCUラインナップではRL78/G14しか選択肢が無かった という事情もあります。
(本当はRX13TやRL78/G1Fが触りたかったです。この辺のラインナップが増えてくれることを期待しています)
コアスタッフオンライン様で購入可能(2024年6月時点)です。
開発環境
IDEは e2studio を使用しました。
GUIでのペリフェラル設定や、最新ドキュメントの更新・閲覧など、近年主流のなんでも入りお気楽開発環境です。また無償で利用できます。
接続方法
MCU評価ボードとモータードライバの接続
表の構成はSTM32編と同じです。ここではPWM出力6本と、AD変換3本を接続しています。
モータードライバボードのシャント抵抗のみ、元の7mΩから47mオームに変更しています。モーター電流が少ないので、抵抗値が少ないと電流検出の分解能が下がるためです。
DRV8305は優秀で、SPI通信で電流検出アンプの増幅率を変更できます。本当はシャント抵抗を変更するよりアンプの増幅率を上げた方が素直ですが、シャント抵抗を変更した方が作業としては簡単なので、シャント抵抗を変更しました。
MCU評価ボードとモーターの接続
モーターのホールセンサ出力を、RL78の外部割込みピンで読みとります。ピンはどこでも良かったのですが、ホールセンサへ電源供給する都合で、電源ピンに近いP75~P77にしました。
その他の接続
モータードライバとモーター、モータードライバと安定化電源の接続は、紙面に収まりきらないためここでは説明を省略します。著者GitHubの接続図をご参照下さい。
後から気が付いたのですが、RL78/G14のボードにはVCP(Virtual COM Port)がありませんでした。そのためPC側アプリとの接続用に、別途USB-シリアル変換モジュールを利用しています。
フェーズ1:ホールセンサ読み取り
ここではブラシレスモーターのホールセンサ読み取りを実現する方法を解説します。
利用するピンと機能
利用するピンはP75~P77の3ピンで、ペリフェラルは外部割り込み(INTP9~11)とタイマー(TAU0 ch.0)を利用します。RL78ではホールセンサ入力を意図した機能は無いので、外部割込みとタイマーをソフトウェア上で組み合わせる必要があります。
実装と動作
e2studioのタイマー設定は以下としました。詳しい内容は著者GitHubのプロジェクトファイルをご参照下さい。
[外部割り込み設定] ※INTP0~8は未使用のため非表示
3つの外部割込みを有効にして、両エッジを選択するだけです。簡単でした。
[TAU0設定]
TAU0のチャネル0をインターバル・タイマに設定します。ここも簡単です。
[TAU0 ch.0設定]
チャネル0をインターバル・タイマに設定したので、インターバル・タイマの設定を行います。
ここでびっくりしたのですが、タイマーカウントの分周比設定が無く、1カウントが何秒か設定出来ません。e2studioでインターバル時間を設定すると、勝手に分周比を決めてくれるようです。
今回は自分で1カウント時間を決めたかったので、コード上で別途分周比を設定しました。
[ソフトの動作イメージ]
各関数の呼び出し関係とざっくり何をしているのかを示しています。青枠がSTM32編からの変更部分で、黒枠はSTM32編と同じ処理となっています。
外部割込みはピン毎に割り込み要因が分かれていますが、本ソフトでは同じ処理を行うので、INTP9~11で共通の TIM_HallProcess() を呼び出しています。
タイマーキャプチャ値読み出しを行うドライバは生成されないので、ユーザー自身がレジスタ(TCR00)からキャプチャ値を読み出します。
RL78のおススメポイント・イマイチポイント
e2studioの設定画面は、あまり複雑な設定が必要ない場合は簡単で使いやすいです。ただ少し凝った設定を行う場合はユーザー側でコードを変更する必要があります。
この辺りは好みの問題です。私としては、複雑に生成されたコードを一生懸命読み解くくらいなら、自身でコーディングする方がシンプルで良いです。e2studioは”良い塩梅”だと思います。
あまりペリフェラルのレジスタを触ることに慣れていない方には、少し面倒に感じるかもしれません。
フェーズ2:オープンループでモーター制御
フェーズ1で検出したローターの位置に応じて、電力を供給するコイルを切り替える方法を解説します。
利用するピンと機能
利用するピンはP10~15の6ピンで、ペリフェラルはタイマー(TMRD)を利用します。TMRDは6本の補相PWM出力や短絡防止時間設定、各種条件による割り込みが可能です。また後述するELCとの組み合わせでAD変換起動も出来ます。
実装と動作
[TMRD0設定(機能)]
ブラシレスモーター制御では補相PWMモードを選択します。
[TMRD0設定(設定)] ※カウントソース設定・PWM出力設定以外は省略
ここでは初期値からPWM出力設定しか変更していません。周期100us(=10kHz)のPWM出力としました。
本シリーズでは短絡防止時間は未使用です。モータードライバ側でハードウェア的に短絡防止機能が入っているので、そちらに任せているためです。
アクティブレベル幅は1%としていますが、この値はコード上では使わないので適当です。
[ソフトの動作イメージ ホールセンサ割り込み時]
フェーズ1の処理を一部掘り下げた図となります。こちらでも最後のPWM出力以外はSTM32編から処理は変わっていません。
PWM出力ON/OFFや出力相設定もドライバは生成されないので、ユーザー自身でレジスタを制御します。
[ソフトの動作イメージ 10ms経過時]
フィードバック処理関連はSTM32編から大幅に変わってしまいました。STM32編では10ms経過時の割り込みでフィードバック演算を行っていましたが、RL78では演算負荷が重くなってしまったので、ポーリング処理に変更しています。
10ms毎に割り込みでフラグを立てます。ポーリング処理でフラグが立ったことを確認したら、速度フィードバック処理等々を行いPWMデューティ比を設定します。
RL78のおススメポイント・イマイチポイント
モーター制御に必要なPWM出力機能は、必要十分に揃っています。モーター制御専用品なので必須条件ですが。
フィードバック演算がポーリング処理になったのは、MCUの問題では無く筆者の運用の問題なので、気にしないで下さい。
PWMデューティ比の設定が分かりづらいのが難点でした。レジスタ値(TRDGR**)が小さくなるほど、デューティ比が大きくなるため、ユーザー側で逆算が必要になります。また100%・0%出力も出来ないようです。
フェーズ3:モーター電流検出
モーター回転時の電流を測定します。ADコンバータとPWMを同期することで、スイッチングノイズを回避して電流を測定します。
利用するピンと機能
利用するピンはP20~P22、ペリフェラルはADコンバータ(ANI0~2)を利用します。また以下2つのペリフェラルを使用することで、AD変換開始から変換結果の転送まで自動的に行います。
[ ELC (イベント・リンク・コントローラ) ]
機能: 各周辺機能が出力するイベントを周辺機能間で相互に接続(リンク)する
利用方法: TMRDアンダーフロー割り込み要求(※)でAD変換を開始する
(※)実際に割り込みを発生させる必要は無い。割り込み要求だけで良い。すごい。
[ DTC (データ・トランスファ・コントローラ) ]
機能: CPUを介さずにメモリとメモリ間のデータ転送を行う
利用方法: AD変換完了割り込み要求(※)でAD変換結果を平均化用配列に転送する
実装と動作
[AD変換設定 (上半分 一部省略)]
トリガ・モード設定で変換開始条件を設定します。今回はELCをトリガに設定します。
[AD変換設定 (下半分 一部省略)]
動作モード設定でAD変換のチャネル選択・変換動作を設定します。ワンショット・セレクトは指定されたチャネルのみ、1回だけAD変換します。
AD変換完了割り込みは行いません。変換結果はDTCを通じてバッファに転送されます。
[ELC設定]
AD変換開始にチェックし、ELCからAD変換開始イベント出力を有効にします。イベント発生元をタイマRD1アンダーフローにする事で、TMRDアンダーフロー割り込み要求でAD変換を開始します。
[DTC設定]
DTC設定です。DTCD0~23はどれを利用しても問題ありません。ここで起動要因をA/D変換にすることで、AD変換完了後にデータ転送を行います。
別タブのDTCD0で転送元/転送先アドレス等を設定しますが、ここでは説明は省略します。もし興味がありましたら、 テキスト筆者のNoteで解説していますのでご参照下さい。
[ソフトの動作イメージ]
ELCとDTCを用いた処理の流れを以下に表します。
TMRDのアンダーフローによってELCが起動し、AD変換を開始します。
AD変換終了後、DTCが変換結果を取り出し、平均化用配列dtc_buf [8] に転送します。一回転送するごとに配列の要素数を+1し、8回転送すると先頭要素に戻ります。
これらの動作がすべてペリフェラルによって行われ、CPUは介在しません。
RL78のおススメポイント・イマイチポイント
ELCとDTCは非常に強力な機能です。他のメーカーでも似たような機能はありますが、連携・転送の対象や設定の柔軟性が高く、CPUを介さずに行える事が他社よりも多いと感じます。
AD変換は令和基準で考えると若干貧弱です。分解能10ビットで変換速度も最速で2us強のため、高速・高分解能な電流フィードバック制御を行うには物足りません。
まとめ
RL78/G14でブラシレスモーター制御はアリか?
間違いなくアリです。e2studioによるペリフェラル設定が分かりやすく、ELCやDTCといった強力なペリフェラルで16ビットCPUとは思えない性能を発揮します。初めての方でも比較的導入のハードルは低いと感じます。
不満点としては、
- 評価ボードの選択肢が少なく、場合によってはデバッガの別途購入が必要
- PWMデューティ比の設定が分かりづらい
- AD変換性能が貧弱
などがありました。しかし前述のメリットが霞むほどではありません。
実際には、より後にリリースされたRL78/G1Fの方が使いやすくなっているでしょう。しかしG14の方がROM容量やピン数等のバリエーションは多いので、実際のアプリケーションに合わせた選択肢が多いです。
次回は?
テキサス・インスツルメンツ社製 MSPM0を解説します。Arm® Cortex®-m0+ベースのローエンドシリーズです。また2023年にリリースした最新シリーズです。本連載でようやく最新のMCUが触れます(泣)。
今回絶賛したELCやDTCと似たような機能が充実しており、純粋な性能としてはRL78を大幅に上回っていると感じます。ただ開発環境やドキュメントに少し癖があり、慣れるまで少し苦労しました。
今回解説したプログラムをベースに、ペリフェラルに関わる部分のソフト(ML_***.c)のみ変更して同じ動作を行います。これにより出来るだけ同じ土俵で各メーカーの差を明確にしていきます。次回こそ共通部分の大幅変更が無いように頑張ります。
こちらも是非
“もっと見る” ブログ
【フーリエ級数編6:フーリエ級数実践編】イメージでしっかりつかむ信号処理〜基礎から学ぶFFT〜
オイラーの公式は本当に重要&有用なものなので、しつこいようですがもう少しその意味を掘り下げておきたいと思います。話が脱線しているように見えるかもしれませんが、オイラーの公式と複素数についてしっかりイメージを固めておくことがこの後の話で大切になってきます。
【フーリエ級数編5:複素フーリエ級数】イメージでしっかりつかむ信号処理〜基礎から学ぶFFT〜
オイラーの公式は本当に重要&有用なものなので、しつこいようですがもう少しその意味を掘り下げておきたいと思います。話が脱線しているように見えるかもしれませんが、オイラーの公式と複素数についてしっかりイメージを固めておくことがこの後の話で大切になってきます。
【フーリエ級数編4:フーリエ係数を求める】イメージでしっかりつかむ信号処理〜基礎から学ぶFFT〜
フーリエ級数で表現したい信号x(t)があるとして、そのx(t)をうまく再現してくれるようなフーリエ係数Ak, Bkを求めることはどうすればできるのでしょうか。