目次

モータドライバ動作確認

 モータドライバは、モータが単方向だけの
 回転でよいとして、次の回路を利用。



 PWMの波形を出力できるピンを、結線図から探します。




 ポート2の4、5ビットが、PWM波形を出力できると
 見えるので、出力に設定して、タイマーA2の初期化
 を考えます。

 ポート2の4、5ビットを出力に設定するには
 次の値をP2DIRレジスタに設定することに。

P2DIR c@ $30 or P2DIR c!{enter}

 タイマーA2の構成をブロック図で確認します。



 タイマーは、16ビットのカウンタなので
 0から65535まで変化。カウンタを動かす
 クロックは、4ソースから選べます。

 MSP430では、タイマーはSMCLKを使うのが
 最も簡単なので、TASSELには、2進数で
 10を指定。

 カウンタをUPモードで利用すると、計数は
 次のような動作になります。



 このタイミングチャートからわかることを
 要約してみます。

 UPモードに設定すると、カウンタTAxRの値を
 インクリメントし、TAxCCR0に格納した値と
 一致すると、0に戻る。
 これを繰り返す。

 TAxCCR0には固定値(DUTY比で100%)を設定し
 PWM波形を生成するには、TAxCCR1からTAxCCR6
 のどれかにDUTY比を設定すれば、波形生成が
 可能と理解できます。

 アウトプトコンペア処理は、数種あります。
 タイミングチャートは、以下。



 PWM波形生成は、OUTPUT Mode 7 : Reset/Setを
 選択すればよいよう。

 モード設定やクロックソースを指定するには
 TAxCTLレジスタの該当ビットに値を設定する
 ことになります。

 レジスタの内部構成は、以下。



 TASEL = 10 として、SMCLKを指定。

 ID    = 11 として、SMCLKを8分周。

 MC    = 10 として、UPモードを指定。

  TACLR = 0  で、ハードウエアにカウンタリセットを一任。

 TAIE  = 0  で、割込みは使わない。

 TAIFG = 0  で、割込みを使わないので、クリア。

 まとめると、16進4桁で$02E0となります。

 アウトプットコンペアのために設定は、TAxCCTLn
 レジスタに値を格納。

 レジスタの内部構成は、以下。



 CM    = 00 として、No captureを指定。

 CCIS  = 11 として、キャプチャでVCCを入力。

 SCS   = 0  として、非同期キャプチャを指定。

 SCCI  = 0  として、SCSに関係する内容で指定。

  CAP   = 0   で、コンペアマッチを指定。

 OUTMOD= 111 で、Reset/Setを指定。

 CCIE  = 0   で、割込みを使わない。

 CCI   = 0   で、0を入力と指定。

 OUT   = 0   で、0をデフォルトで0出力。

 COV   = 0   で、オーバーフローなしと指定。

 CCIFG = 0   で、割込みを一時保留しない。

 まとめると、16進4桁で$30E0となります。

 PWMのDUTY比は、TA2CCR0に1000を格納。
 TA2CCR1、TA2CCR2には、使いたいDUTY比の10倍
 の値を格納としておきます。

 モーター関係の初期化は、次のワードで対応。

: INIT.PWM
  P2SEL c@         \ (get current mode)
  $30 or           \ (change mode)
  P2SEL c!         \ (enable peripheral control)
  $02E0 TA2CTL !
  $30E0 TA2CCTL1 ! \ (right Reset/Set)
  $30E0 TA2CCTL2 ! \ (left Reset/Set)
  0     TA2R !     \ (clear counter)
  1000  TA2CCR0 !  \ (duty ratio maximum)
  0     TA2CCR1 !  \ (right duty ratio)
  0     TA2CCR2 !  \ (left duty ratio)
;

 P2SELレジスタは、ピンを内蔵モジュールに
 接続するとき、該当ビットに論理値'1'を設定。
 '0'のままだと、I/Oになってしまいます。

 左右のDUTY比を設定するワードは、以下。

: PUT.LEFT 10 * TA2CCR2 ! ;

: PUT.RIGHT 10 * TA2CCR1 ! ;

 10倍して、1%単位での回転数を指定できる
 ようにしておきます。

 ドライバとの接続は、以下。

P2.5 (output) left motor driver
P2.4 (output) right motor driver

 Arduinoとは、次のように接続。

PB2 (output) left motor driver
PB1 (output) right motor driver

 Arduinoでは、PWM出力があるピンを使います。

 実機がないときには、次の基板上にあるフル
 カラーLEDを使い、出力信号が正しいのか確認。



 ArduinoベースのAmForthでは、次のように
 FastPWMモードを利用して処理します。

variable LEFTD
variable RIGHTD

: PWM_LEFT LEFTD c@ 8 lshift 100 / OCR1BL c! ;

: PWM_RIGHT RIGHTD c@ 8 lshift 100 / OCR1AL c! ;

: SET_DUTY PWM_LEFT PWM_RIGHT ;

: PWM_START $A1 TCCR1A c! $0D TCCR1B c! ;

: PWM_STOP
  0 0 LEFTD c! RIGHTD c!
  SET_DUTY 8 TCCR1B c! 0 TCCR1A c!
  PORTB c@ $F9 AND PORTB c!
;

 左右のモータのDUTY比を変数LEFTD、RIGHTDに
 格納してから、ワードSET_DUTYでハードウエア
 に即したレジスタに値を格納。

 モータドライバひとつにEnableとControlの
 2信号が必要な場合、フルカラーLEDで混色
 により、規定通りの信号が出ているのかを
 目視確認できます。

 LPC1114ベースのMecripsのForthでは、次の
 ワードで動作確認。

$3FF $50018000 \ P1 all outputs

: PUT.LEFT
 8 lshift $50013FFC @
 $300 XOR OR $50013FFC !
;

: PUT.RIGHT
 4 lshift $50013FFC @
 $030 XOR OR $50013FFC !
;

 ポート1のP1.4、P1.5、P1.8、P1.9と
 不連続でのビット割当のため、シフト
 とマスクを使い、該当ビットだけに
 信号が出るようにしてます。


目次

inserted by FC2 system