|
モータドライブ基板Ver.4を制御する |
|
内容
モータドライブ基板Ver.4をR8C/M12Aに接続して、モータ2個、サーボ1個を制御します。モータドライブ基板Ver.4に搭載しているLED 2個の点灯、プッシュスイッチ1個の状態取得も行います。
ワークスペース
r8cm12a_motordrive4_100.zip
ファイルを解凍し、フォルダを「c:\worksapce」に入れてください。
回路
回路を下図に示します。
モータドライブ基板Ver.4
概要
今回は、(株)日立ドキュメントソリューションズで販売されているモータドライブ基板Ver.4を使用して、下表の制御を行うことができます(マイコンカーに取り組んでいる方々はお馴染みなので説明不要かもしれませんが・・・)。
機器名 |
個数 |
説明 |
モータ |
2個 |
DCモータを2個(ここでは、左モータ、右モータと呼びます)、制御することができます。動作は、正転、逆転、停止させることができ、正転、逆転はそれぞれ0〜100%まで1%ごとにスピード制御することができます。 |
サーボ |
1個 |
RCサーボを制御することができます。動作は-90度(左90度)〜+90度(右90度)まで1度単位で制御することができます。 |
LED |
2個 |
プログラムで点灯/消灯できるLEDを2個搭載しています。 ※LEDは3個搭載していますが1個(LED1)は電源ランプで、プログラムで点灯/消灯できません。 |
プッシュ スイッチ |
1個 |
プログラムでON/OFFの状態を検出できるプッシュスイッチを1個搭載しています。 |
|
※左モータ制御、右モータ制御、サーボ制御は、タイマRCによるPWM信号で制御します。タイマRCについては「タイマRCによるPWM出力(3ch)」を参照してください。
モータ制御
DCモータを2個制御することができます。
右モータを制御する端子、内容を下記に示します。
R8C/ M12A 端子 |
ドライブ基板10ピンコネクタ端子 |
説明 |
P1_0 |
5ピン |
右モータへPWM信号を出力します。 ON幅(デューティ比)0%でモータ停止、100%でモータ回転です。回転方向は、回転方向の端子で決まります。 |
P1_4 |
6ピン |
右モータの回転方向を制御します。 "0":正転 "1":逆転 |
|
右モータの制御回路の概要を下図に示します。
左モータを制御する端子、内容を下記に示します。
R8C/ M12A 端子 |
ドライブ基板10ピンコネクタ端子 |
説明 |
P1_2 |
7ピン |
左モータへPWM信号を出力します。 0%でモータ停止、100%でモータ回転です。回転方向は、回転方向の端子で決まります。 |
P1_1 |
8ピン |
左モータの回転方向を制御します。 "0":正転 "1":逆転 |
|
左モータの制御回路の概要を下図に示します。
サーボ制御
RCサーボを制御することができます。
RCサーボを制御する端子、内容を下記に示します。
R8C/ M12A 端子 |
ドライブ基板10ピンコネクタ端子 |
説明 |
P1_3 |
4ピン |
サーボへPWM信号を出力します。 |
|
サーボの制御回路を下図に示します。
サーボコネクタ(CN4)の2ピンの電源電圧は6V以内にする必要があります(サーボの電源電圧)。電源電圧が6V以上のとき、LM350という三端子レギュレータ(電圧を一定にする部品)を使って電圧を6V一定にします。電源電圧が6V以下(電池4本など)の場合、この部分の回路は必要ありません(部品を未実装にして、JP2の1-2間をショートします)。LM350関係の部品を取った回路を下図に示します。
LED制御
LEDを2個、点灯/消灯させることができます。
LEDを制御する端子、内容を下記に示します。
R8C/ M12A 端子 |
ドライブ基板10ピンコネクタ端子 |
説明 |
P1_7 |
2ピン |
LED2を制御します。 "0":LED 点灯 "1":LED 消灯 |
P1_6 |
3ピン |
LED3を制御します。 "0":LED 点灯 "1":LED 消灯 |
|
LED回路を下図に示します。
プッシュスイッチ状態検出
プッシュスイッチ1個の状態を検出することができます。
プッシュスイッチの状態を検出する端子、内容を下記に示します。
R8C/ M12A 端子 |
ドライブ基板10ピンコネクタ端子 |
説明 |
P1_5 |
9ピン |
プッシュスイッチ(SW1)の状態を検出します。 "0":押されているとき "1":離されているとき |
|
プッシュスイッチの回路を下図に示します。
プログラム「r8cm12a_motordrive4.c」の説明
「r8cm12a_motordrive4.c」の中に、main関数と、モータドライブ基板Ver.4に接続されている機器を制御する関数を入れています。
液晶のライブラリのように、モータドライブ基板Ver.4を制御する関数をライブラリファイルに分けてもよかったのですが、今回はマイコンカーのプログラムと同様に、一つのCファイルに入れてみました。時間があれば「motordirve4_lib.c」などのファイル名でライブラリ化してみてください。
プッシュスイッチの読み込み
■関数
書式 |
unsigned char pushsw_get( void ); |
内容 |
プッシュスイッチの状態を読み込みます。 |
引数 |
無し |
戻り値 |
プッシュスイッチの状態 1:ON 0:OFF |
使用例 |
if( pushsw_get() == 1 ) {
// SW ONなら
} else {
// SW OFFなら
}
|
|
LEDの点灯
■関数
書式 |
void led_out( unsigned char led ); |
内容 |
LED(LED2,LED3)を点灯/消灯させます。 |
引数 |
LED2:bit1 LED3:bit0 "0":消灯 "1":点灯 |
戻り値 |
無し |
使用例 |
led_out( 0x0 ); // LED2:消灯 LED3:消灯
led_out( 0x1 ); // LED2:消灯 LED3:点灯
led_out( 0x2 ); // LED2:点灯 LED3:消灯
led_out( 0x3 ); // LED2:点灯 LED3:点灯
|
|
モータ速度制御
■関数
書式 |
void motor( int accele_l, int accele_r ); |
内容 |
左モータ、右モータを制御します。 |
引数 |
左モータ -100:逆転100% 0:停止 100:正転100% 右モータ -100:逆転100% 0:停止 100:正転100% |
戻り値 |
無し |
使用例 |
motor( -50, 50 ); // 左:逆転 50% 右:正転 50%
motor( 100, 100 ); // 左:正転100% 右:正転100%
motor( 0, -30 ); // 左:停止 右:逆転-30%
|
|
サーボ制御
■関数
書式 |
void handle( int angle ); |
内容 |
サーボを制御します。 |
引数 |
サーボ操作角度:-90〜90 -90で左へ90度、0でまっすぐ、90で右へ90度 |
戻り値 |
無し |
使用例 |
handle( 0 ); // 0度(まっすぐ)
handle( -90 ); // 左へ90度
handle( 45 ); // 右へ45度
|
|
シンボル定義
PWM周期やサーボのセンタ値の設定をします。
シンボル |
内容 |
PWM_ CYCLE |
左モータ、右モータ、サーボに加えるパルスのPWM周期を設定します。3つ共通です。設定値は次のようになります。 PWM_CYCLE=制御周期/400ns−1 サーボの周期は標準で16msです。モータは1msくらいが良いのですが、1msだとサーボが動作しないのでサーボの制御周期の16msに合わせます。 PWM_CYCLE=16ms/400ns−1=39999 |
SERVO_ CENTER |
サーボが真っ直ぐになる値を設定します。概ね、真っ直ぐになるサーボのON幅は、1.5msです。よって、SEERVO_CENTERは次の値になります。 SERVO_CENTER=ON幅/400ns−1=1.5ms/400ns−1=3749 ただし、サーボによってセンタ値が異なるため、3749の値で動作させて、ずれに応じてこの値は適宜調整します。 ※この値はサーボによって必ず異なります。動作させているサーボに合わせて必ず調整してください。 |
HANDLE _STEP |
サーボが1度動くときの値です。 サーボに加えるパルスのON幅を設定するレジスタ「trcgrc」に、この値を増減すると、サーボの角度が1度、増減します。サーボに加えるパルス幅とサーボの角度の関係は、一般的に下記のようになります。 0度:1.5ms 左90度:0.7ms 右90度:2.3ms よって、右90度から左90度まで、180度分動作するパルスの差は 180度分のパルスの差=2.3−0.7=1.6ms 1度当たりのパルス幅は、 1度当たりのパルス幅=1.6ms÷180=8.89μs trcgrcは1あたり400ns分のON幅なので、8.89μs分のON幅の値は 1度当たりの値=8.89μs÷400ns=22.22 今回のプログラムでは整数のみを扱うので四捨五入して、22が1度あたりの値となります。 |
|
プログラムを下記に示します。
#define PWM_CYCLE 39999 /* モータPWMの周期 */
#define SERVO_CENTER 3750 /* サーボのセンタ値 */
#define HANDLE_STEP 22 /* 1゜分の値 */
main関数
まず、init関数を呼んで、R8C/M12Aの内蔵周辺機能の初期化を行います。
次に、プッシュスイッチを押すまで、モータドライブ基板のLED 2個を点滅させます。プッシュスイッチを押すと、次に移ります。
void main( void )
{
init(); /* 初期化 */
/* プッシュスイッチを押すまでLEDの点滅 */
while( pushsw_get() == 0 ) { // プッシュスイッチが押されていなければ
led_out( 0x01 ); // whileループを繰り返す
timer( 100 );
led_out( 0x02 );
timer( 100 );
}
/* LED消灯 */
led_out( 0x00 );
次に、motor関数、handle関数を使って、左モータ、右モータ、サーボを動作させます。
/* モータ、サーボ動作 */
while( 1 ) {
motor( 50, 0 );
timer( 2000 );
motor( 0, 50 );
timer( 2000 );
motor( -50, 0 );
timer( 2000 );
motor( 0, -50 );
timer( 2000 );
motor( 0, 0 );
handle( 30 );
timer( 2000 );
handle( -30 );
timer( 2000 );
handle( 0 );
timer( 2000 );
}
}
R8C/M12Aマイコンで、モータドライブ基板Ver.4を制御することができました。製作した装置に組み込んで、自由自在に制御してみましょう!!
|
|