

NXPで販売されているMC33932/MC33926というモータドライバを使って、適当なモータを動かしていきたいと思います。
今回は、いつものFRDM-K64Fではなくて、TWR-KE18Fという5V系のNXPマイコンMKE18F512VLL16が搭載された開発ボードを使います。これ、タワーシステムという名称のとおり、下の写真のように開発ボード(写真赤色のボード)の両端をコネクタにさして、タワー構造になります。

そして、空いているスロットに、モータドライバだとかADの拡張ボードだとか、通信用ボードだとかを差し込み、機能拡張が簡単にできるよってものです。
要は、Arduinoのシールド的なものですね。
ただ、こっちの方が、見た目がかっこいい☆彡
拡張ボードは、いろいろとラインナップされているので、用途に合わせて、買い足していけば、やれる機能が増えてきます。
さて、冒頭のモータドライバのICは、この拡張ボードのひとつTWR-MC-MVHB1EVBに搭載されているものです。

写真上の長方形型のICがMC33932で正方形型のがMC33926です。MC33932はDCモータを二個駆動でき、MC33926はDCモータを一個駆動できて、合計3個のモータをこのボードで制御できます。
ドライバ的にはほぼ同じスペックっぽいですね。違いとしては、MC33926の方は、スルーレートの変更、回転方向の切り替え機能がついているぐらいです。
入力電圧(連続): 5.0V~28.0V
入力電圧(瞬間): 5.0V~40.0V
出力電流(最大): 5.0A
電流制限 : 6.0A (±1.5A)
PWM周波数(最大):11kHz
説明書では、用途的に、電子制御スロットルや排気バルブとかになっていますが、DCサーボで上の電流値を満足するものなら、基本なんでも動きます。
下がUser’s Guide から抜粋した絵。MC33926とMC33932は電源は別々にとる必要がありそうですね(Power Connector)。モータは、OUT1/OUT2かOUT3/OUT4につながります。電源・モータは、ボード上緑のコネクタ(なんていうんでしたっけこれ)が出ているので、これにそれぞれ繋げます。

今回は、ドライバ作成のためのテストですが、実際に動かすものがないとつまらないので、近くに転がってたラジエター用の冷却ファンでもまわしてみることにします。下の画像は配線の参考です。

最初、SDKでボードのサンプルコードとかないかなと探してみたんですが、見つかりませんでした。
NXPにも問い合わせしてみましたが、このボード自体の開発は、結構古くて、最新の開発環境であるMCUXpresso上で動作するサンプルコードは今のところないそうです。
(図面みると確かに2006年に出図してますね。)
CodeWorrierとかKenetis Design Studioとか前の開発環境では、サンプルコードはあるみたいですが、いまさら古い環境をいれ直してもな~ってことで、今回は、ドライバをいちから作ることにしました
ピン配をしらべる
今回はMC33932とMC33926でひとつずつモータを動かすことにします。
TWR横からみると、下のような感じで、ボード同士が、つながりますので、何と何がつながっているのか、訳わかりません。

ボードは、両面のエッジコネクタがPCI EXPRESSでつながる仕様になっています。PCI EXPRESSは下絵にあるような感じで、裏表、上下でサイドA,B,C,Dとなって、ピン番号が割り振られています。
ボードに出てる主な信号がどの端子にでてるか書き出してみます。左がドライバの入出力で、真ん中がエッジコネクタの端子番号、右がKE18F(マイコン)の端子名になってます。

PCIエクスプレスのピン番号を中心に、モータドライバとマイコンのデータシートを行ったり来たりすれば、上のような整合表をつくることができます。
データシートのリンクを貼っておきます。モータドライバ。
こっちは、マイコンの回路図。ダウンロードには、登録が必要です。
上のリンクで、ページの下部にPrinted Circuit Boards and schematicsがあるので、それをみます

信号のなかみを理解する
ボードから色々な信号が出てますが、内容を整理しときます。
IN1, IN2
それぞれMOSFETを介して、OUT1とOUT2につながります。ロジックがHighでモーター電源とつながり、Lowで出力用のGNDとつながります。実際これは、KE18FのFlexタイマーモジュールにつながっていて、マイコンからPWM信号を出して、DUTY制御することになります。
D1
Highで、OUT1とOUT2がハイインピーダンス状態になり、モータの制御が とまります。
EN
Highで、モータの制御が有効になります。Lowだと、OUT1とOUT2がハイインピーダンスになります。D1との違いは、Lowだとスリープモードにはいり、電力消費を抑えます。
FB
HBの消費電流をアナログ信号で出力します。実際、マイコンのADで使えるように、電流の0.24%を出力します。
SFbar
HBのステータスフラグです。モータが駆動されていると、Highになります。
モータの動作モードに合わせた、各信号の状態をデータシートから抜粋しました。ここで、Zはハイインピーダンス、XはHigh か Lowかどっちかです。

ENをHigh、D1をLowにした状態で、IN1とIN2にPWM信号を入力すれば、とりあえず、モータは回せることが分かります。
ドライバの作成
こんなマニアックなボードのドライバを必要としてる人は、ほとんどいないとおもいますが、一応公開しときます。あくまでも参考用なので、MC33932はモータAしか使えません。モータBを使いたい場合は、これをベースに拡張してください。
ざっくりと使い方を説明
事前にドライバmvhb.hとmvhb.cを既存のプロジェクトに追加しときます。
メインプログラムで、ヘッダファイルをインクルードします。
#include "mvhb.h"
HBの設定用のコンフィグを定義します。これは、MVHB33926とMVHB33932でそれぞれ用意したので、個別に定義します。
// MVHB configuration
MVHB33926_config_t HBConfig;
MVHB33932_config_t HBConfig_dual_A;
コンフィグの中身は、
初期設定をGetDefaultConfig関数でコンフィグに格納します。
MVHB33926_GetDefaultConfig(&HBConfig);
MVHB33932_GetDefaultConfig(&HBConfig_dual_A);
次に初期化関数を下のように呼びます。
MVHB33926_Init(&HBConfig);
MVHB33932_Init(&HBConfig_dual_A);
ここら辺で、TWR-MC-MVHB1EVBに必要な信号をマイコン側で定義しています。
その後で、StartPWM関数で、FTMをスタートさせて、PWM信号を出力します。初期の目標Dutyは0%になります。
MVHB_StartPWM(&HBConfig,&HBConfig_dual_A);
実際のPWM信号のDuty設定は、PWMUpdate関数を使います。第一引数が目標Duty(プラスが正転、マイナスが逆転です。第二引数で、PWMを変更したいモータを指定します。
PWMUpdate( 20.0f ,MVHB33926)
PWMUpdate( -10.0f ,MVHB33932_motorA);
実際に動作させてみた
こんな感じでちゃんと動いてます。KE18Fのボードには、ポテンショメータが実装されているので、下は、ボテンショメータの位置によって、DUTY比を変更して、ファンスピードを変えた時の様子です。ちょっと分かりにくいですね;

Happy DCモータ!