RXマイコンのソフト開発(7)モータドライバーDRV8836の動作

RXマイコン(RX631)のソフト開発の7回目です。今回は、モータドライバーのDRV8836を動作させたいと思います。制御はしないです。ただ動かすだけです。ギアが噛み合うかも確かめたいと思います。

環境

  • パソコン: Windows10 64 bit
    • 統合開発環境: e2studio 2021-01をインストール
    • コンパイラ: Renesas CCRX v3.03.00をインストール
    • 書き込みソフト: Renesas Flash Programmer V3.08.01(無償版) をインストール
  • ターゲットデバイス: R5F5631PDDFL(RX631 48ピン)

DRV8836の周辺回路

作成したDRV8836の周辺回路図は図1です。

図1:DRV8836の周辺回路図
図1:DRV8836の周辺回路図

各ネットの 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です。

図2:プログラムのフローチャート
図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のようにモーターを回転させることができました(写真ではわかりにくいですが...)。

図3:モーターが回転している様子
図3:モーターが回転している様子

おわりに

今回でDRV8836を動作させることができました。次回は磁気式エンコーダーを動かしたいと思います。

参考文献

お問い合わせフォーム プライバシーポリシー

© 2021 Setoti All rights reserved.