C言語

モータ制御とウォッチドッグ制御の実装

モータ制御は、モータドライバに指示を出す処理となります。
ウォッチドッグ制御は、ウォッチドッグクリアを行うのみの処理となります。
モータ制御もウォッチドッグ制御も、メイン処理から呼び出します。メイン処理から直接マイコンの制御レジスタへの制御は行わない設計としているため、これらの制御を通じてマイコンへ指示を行います。

モータ制御の実装

「DrMotorCtrl.c」ファイルにモータ制御ドライバ処理を実装していきます。
このモータ制御ドライバには、前方向に動くように指示する関数(G_DrMotorCtrl_Forward関数)、後ろ方向に動くように指示する関数(G_DrMotorCtrl_Back関数)、右方向に動くように指示する関数(G_DrMotorCtrl_Right関数)、左方向に動くように指示する関数(G_DrMotorCtrl_Left関数)、停止する関数(G_DrMotorCtrl_Stop関数)で構成します。
実装内容は次のようにします。

#include "iodefine.h"
#include "DrMotorCtrl.h"

#define U1S_DRMOTORCTRL_EBA_ENB_ON          ((U1)(0x03U))       /* EBA,ENB=HI  */
#define U1S_DRMOTORCTRL_EBA_ENB_OFF         ((U1)(0xFCU))       /* EBA,ENB=LO  */

void G_DrMotorCtrl_Forward( void )
{
    P7_bit.no2 = U1_HI;                     /* IN1:HI */
    P1_bit.no2 = U1_LO;                     /* IN2:LO */
    P1_bit.no1 = U1_HI;                     /* IN3:HI */
    P0_bit.no3 = U1_LO;                     /* IN4:LO */
    TRDSTR |= U1S_DRMOTORCTRL_EBA_ENB_ON;   /* EBA,ENBのPWM開始 */
    return;
}

void G_DrMotorCtrl_Back( void )
{
    P7_bit.no2 = U1_LO;                     /* IN1:LO */
    P1_bit.no2 = U1_HI;                     /* IN2:HI */
    P1_bit.no1 = U1_LO;                     /* IN3:LO */
    P0_bit.no3 = U1_HI;                     /* IN4:HI */
    TRDSTR |= U1S_DRMOTORCTRL_EBA_ENB_ON;   /* EBA,ENBのPWM開始 */
    return;
}

void G_DrMotorCtrl_Right( void )
{
    P7_bit.no2 = U1_LO;                     /* IN1:LO */
    P1_bit.no2 = U1_HI;                     /* IN2:HI */
    P1_bit.no1 = U1_HI;                     /* IN3:HI */
    P0_bit.no3 = U1_LO;                     /* IN4:LO */
    TRDSTR |= U1S_DRMOTORCTRL_EBA_ENB_ON;   /* EBA,ENBのPWM開始 */
    return;
}

void G_DrMotorCtrl_Left( void )
{
    P7_bit.no2 = U1_HI;                     /* IN1:LO */
    P1_bit.no2 = U1_LO;                     /* IN2:HI */
    P1_bit.no1 = U1_LO;                     /* IN3:HI */
    P0_bit.no3 = U1_HI;                     /* IN4:LO */
    TRDSTR |= U1S_DRMOTORCTRL_EBA_ENB_ON;   /* EBA,ENBのPWM開始 */
    return;
}

void G_DrMotorCtrl_Stop( void )
{
    P7_bit.no2 = U1_LO;                     /* IN1:LO */
    P1_bit.no2 = U1_LO;                     /* IN2:LO */
    P1_bit.no1 = U1_LO;                     /* IN3:LO */
    P0_bit.no3 = U1_LO;                     /* IN4:LO */
    TRDSTR &= U1S_DRMOTORCTRL_EBA_ENB_OFF;  /* EBA,ENBのPWM開始 */
    return;
}

前方向に動かすG_DrMotorCtrl_Forward関数は、すべてのモータを前方向に動くように指示します。
後ろ方向に動かすG_DrMotorCtrl_Back関数は、すべてのモータを後ろ方向に動くように指示します。
右方向に動かすG_DrMotorCtrl_Right関数は、左側のモータを前方向に、右側のモータを後ろ方向に動くように指示します。
左方向に動かすG_DrMotorCtrl_Left関数は、右側のモータを前方向に、左側のモータを後ろ方向に動くように指示します。
停止するG_DrMotorCtrl_Stop関数は、すべてのモータを停止します。

TRDSTRレジスタのビット0を1にすると、TRD0カウントを開始し、0にすると、TRD0カウントを停止します。
また、TRDSTRレジスタのビット1を1にすると、TRD1カウントを開始し、0にすると、TRD1カウントを停止します。
このカウンタを開始することにより、EBA、ENBへPWM出力を開始します。

次に、ヘッダーファイルの実装内容を次に示します。

#ifndef DRMOTORCTRL_H
#define DRMOTORCTRL_H

#include "common.h"

extern void G_DrMotorCtrl_Forward( void );
extern void G_DrMotorCtrl_Back( void );
extern void G_DrMotorCtrl_Right( void );
extern void G_DrMotorCtrl_Left( void );
extern void G_DrMotorCtrl_Stop( void );

#endif

ヘッダーファイルは、関数プロトタイプ宣言を追加しているのみとなります。

ウォッチドッグ制御の実装

「DrWdtCtrl.c」ファイルにウォッチドッグ制御ドライバ処理を実装していきます。
ウォッチドッグ制御ドライバ処理は、ウォッチドッグタイマをクリアする関数(G_DrWdtCtrl_WdtTimClr関数)のみとなり、 ヘッダーファイルも関数プロトタイプ宣言のみです。

#include "iodefine.h"
#include "DrWdtCtrl.h"

#define U1S_DRWDTCTRL_CLAR            ((U1)(0xACU))

void G_DrWdtCtrl_WdtTimClr( void )
{
    WDTE = U1S_DRWDTCTRL_CLAR;
    return;
}
#ifndef DRWDTCTRL_H
#define DRWDTCTRL_H

#include "common.h"

extern void G_DrWdtCtrl_WdtTimClr( void );

#endif

ウォッチドッグタイマクリア処理は、WDTEレジスタに0xACを書き込むことにより、ウォッチドッグタイマクリアを行うことができます。

簡単ではありますが、モータ制御とウォッチドッグ制御の実装については以上となります。

-C言語