- RXマイコンのソフト開発(1)クロック設定とLチカ
- RXマイコンのソフト開発(2)スイッチのチャタリング対策
- RXマイコンのソフト開発(3)スピーカーから音を出す
- RXマイコンのソフト開発(4)UART送信でHelloWorld
- RXマイコンのソフト開発(5)ADCでバッテリーの電圧測定
- RXマイコンのソフト開発(6)RSPIでMPU6000から角速度取得
- RXマイコンのソフト開発(7)モータドライバーDRV8836の動作
- RXマイコンのソフト開発(8)磁気式エンコーダーAS5047
RXマイコン(RX631)のソフト開発の7回目です。今回は、モータドライバーのDRV8836を動作させたいと思います。制御はしないです。ただ動かすだけです。ギアが噛み合うかも確かめたいと思います。
環境
- パソコン: Windows10 64 bit
- ターゲットデバイス: R5F5631PDDFL(RX631 48ピン)
DRV8836の周辺回路
作成したDRV8836の周辺回路図は図1です。
各ネットの RX631 への接続先は以下です。
- NSLEEP → P15
- M_PHASE_L → PE4
- M_ENBL_L → PB1/MTIOC4C
- M_PHASE_R → PB0
- M_ENBL_R → PB3/MTIOC4A
DRV8836は制御の仕方に IN/IN モードと PHASE/ENABLE モードがありますが、作成した回路はPHASE/ENABLE モードで使う回路となっています。xIN1(xENABLE)にPWM波形を入れて、DUTY比を変えることで速度を変更します。また、xIN2(xPHASE)にHIGH、LOWを入れて、回転方向を変更します。
プログラムフロー
プログラムの処理の流れは図2です。
クロックの初期化とCMT0の初期化を行って、MTU4を初期化します。その後、メインルーチンに入り、スイッチが押されたら、片方のモータをDUTY比50%で回転させるか、逆回転させるか、停止させるかします。その後、status変数を変更します。
プログラム
重要なプログラム部分だけ示します。全てのソースコードはGitHubの「7_drv8836」フォルダの中にあります。
メイン関数
main.c:メイン関数のソースコード
#include "define_wakaba.h" #include "interface.h" #include "iodefine.h" #define NSLEEP PORT1.PODR.BIT.B5 #define M_PHASE_R PORTB.PODR.BIT.B0 #define M_PHASE_L PORTE.PODR.BIT.B4 #define MOTOR_START MTU.TSTR.BIT.CST4 void main(void){ unsigned char status = 0; init_rx631(); // Overall Initialization NSLEEP = 1; // Sleep mode stop while(1){ if(g_sw_chg){ // Enter when SW is pressed g_sw_chg = 0; if(status==0){ // Rotate motor M_PHASE_R = 0; MTU4.TGRA = 249; // Duty M_ENBL_R MTU4.TGRC = 249; // Duty M_ENBL_L MOTOR_START = 1; status = 1; } else if(status==1){ // Reverse rotation of motor M_PHASE_R = 1; status = 2; } else if(status==2){ // Motor Stop MTU4.TGRA = 500; // Duty M_ENBL_R MTU4.TGRC = 500; // Duty M_ENBL_L status = 0; } } } }
メイン関数では、RX631の初期化を行い、P15(NSLEEP)をHIGHにすることで、DRV8836のスリープモードを解除します。スイッチが押されてフラグ(g_sw_flag)が立ったら、フラグを下げて、status に応じて、モーターを回転させたり、逆回転させたり、停止させたりします。回転させるときは、M_PHASE_R で回転方向を決めて、MOTOR_START (MTU.TSTR.BIT.CST4) を1に設定して、タイマーを動作させて、PWM波形を出力させます。
補足:モーターを停止させるとき、MTU4.TGRX=500 とさせることで、コンペアマッチさせず、HIGHにならないようにしています。
MTU4の初期化
初期化関数のソースコードが以下です。MTU に関してはユーザーズマニュアルの p.765「23. マルチファンクションタイマパルスユニット 2(MTU2a)」に記述があります。初期化の方法は RXマイコンのソフト開発(3)スピーカーから音を出す とほとんど同じです。
init_rx631.c:初期化関数のソースコード
#include "init_rx631.h" #include "iodefine.h" /*** Function Declaration ***/ static void init_clock(void); static void init_cmt0(void); static void init_cmt1(void); static void init_mtu4(void); /*---- RX631 Initialization ----*/ void init_rx631(void){ SYSTEM.PRCR.WORD = 0xA503; // Unprotect // MainCLK, SUBCLK and RTC Initialization init_clock(); // CMT0 and CMT1 Initialization init_cmt0(); // MTU4 Initialization init_mtu4(); SYSTEM.PRCR.WORD = 0xA500; // Reprotect } ~略~ /*---- MTU4 Initialization ----*/ void init_mtu4(void){ MSTP(MTU) = 0; // MTU Module Stop Release MPC.PWPR.BIT.B0WI = 0; // PFSWE bit write enable MPC.PWPR.BIT.PFSWE = 1; // PmnPFS Register write enable MPC.PB3PFS.BIT.PSEL = 0x02; // set to MTIOC4A MPC.PB1PFS.BIT.PSEL = 0x02; // set to MTIOC4C MPC.PWPR.BYTE = 0x80; // Reprotect PORTB.PMR.BIT.B3 = 1; // set to Peripheral PORTB.PMR.BIT.B1 = 1; // set to Peripheral PORTB.PDR.BIT.B0 = 1; // M_PHASE_R: OUT PORTE.PDR.BIT.B4 = 1; // M_PHASE_L: OUT PORT1.PDR.BIT.B5 = 1; // NSLEEP: OUT MTU4.TMDR.BIT.MD = 0x2; // PWM mode1 MTU.TOER.BIT.OE4A = 1; // MTIOC4A Output Enable MTU.TOER.BIT.OE4C = 1; // MTIOC4C Output Enable MTU4.TIORH.BIT.IOA = 0x2; // Initial output LOW, Compare match HIGH MTU4.TIORH.BIT.IOB = 0x1; // Initial output LOW, Compare match LOW MTU4.TIORL.BIT.IOC = 0x2; // Initial output LOW, Compare match HIGH MTU4.TIORL.BIT.IOD = 0x1; // Initial output LOW, Compare match LOW MTU4.TCR.BIT.TPSC = 0x0; // PCLK/1 MTU4.TCR.BIT.CKEG = 0x0; // count by riging edge MTU4.TCR.BIT.CCLR = 0x2; // Clear by compare match TGRB MTU4.TGRA = 249; // Duty M_ENBL_R MTU4.TGRB = 499; // PWM period MTU4.TGRC = 249; // Duty M_ENBL_L MTU4.TGRD = 499; // PWM period }
モジュールストップを解除して、端子機能を変更して、MTU4の設定をしています。
スピーカーのときと異なる点は主に以下です。
- MTIOC4A、MTIOC4Cの出力許可を出す
- コンペアマッチしたときの出力の仕方を変える
- PWM波形の周波数とDUTY比の設定をする
MTIOC3Aに関しては出力許可をするためのレジスタはありませんでしたが、MTIOC4xに関してはTOERレジスタを設定しないと出力許可されないので設定します。
また、初期設定のときに端子がLOWになってほしいので、TIORHレジスタやTIORLレジスタの設定を変更しています。
最後に、TGRXレジスタを設定して、PWM波形の周波数を100kHz、DUTY比を50%にしています。
プログラムの実行
プログラムを実行させて、スイッチを押したところ、図3のようにモーターを回転させることができました(写真ではわかりにくいですが...)。
おわりに
今回でDRV8836を動作させることができました。次回は磁気式エンコーダーを動かしたいと思います。