Renesas RX621 エンコーダ
RX621では最大4つエンコーダを計測することができるので、MTU1,2,7,8を位相係数モード1に設定していきます。
hardware_setup.cにて以下のMTU2_initialize関数にMTU9(PWM)の設定に続けて設定していきます。
MTU2_initialzie関数
void MTU2_initialize(void) { // MTU1,2,7,8 MSTP(MTU1) = 0; // Wake up MTU1 MSTP(MTU2) = 0; // Wake up MTU2 MSTP(MTU7) = 0; // Wake up MTU7 MSTP(MTU8) = 0; // Wake up MTU8 PORTC.ICR.BIT.B0 = 1; // Enable PC0 receive buff PORTC.ICR.BIT.B1 = 1; // Enable PC1 receive buff PORTC.ICR.BIT.B2 = 1; // Enable PC2 receive buff PORTC.ICR.BIT.B3 = 1; // Enable PC3 receive buff PORTC.ICR.BIT.B4 = 1; // Enable PC4 receive buff PORTC.ICR.BIT.B5 = 1; // Enable PC5 receive buff PORTC.ICR.BIT.B6 = 1; // Enable PC6 receive buff PORTC.ICR.BIT.B7 = 1; // Enable PC7 receive buff IOPORT.PFDMTU.BIT.TCLKS = 0; // PC0-3 Enable MTCLK-A IOPORT.PFCMTU.BIT.TCLKS = 1; // PC4-7 Enable MTCLK-B MTU1.TMDR.BIT.MD = 4; // MTU1 Phase coefficient MTU2.TMDR.BIT.MD = 4; // MTU2 Phase coefficient MTU7.TMDR.BIT.MD = 4; // MTU7 Phase coefficient MTU8.TMDR.BIT.MD = 4; // MTU8 Phase coefficient MTUA.TSTR.BIT.CST1 = 1; // Count Start MTUA.TSTR.BIT.CST2 = 1; // Count Start MTUB.TSTR.BIT.CST1 = 1; // Count Start MTUB.TSTR.BIT.CST2 = 1; // Count Start // MTU9 = PWM Mode 1(省略) }
となります。
それではMTU1,2,7,8(位相係数モード1)の設定手順を見ていきます。
- モジュールスタート(消費電力低減機能の解除)
- ピンの設定
- MTU1,2,7,8の設定
- ユーザ関数の定義
1.モジュールスタート
MSTP(MTU1) = 0; // Wake up MTU1 MSTP(MTU2) = 0; // Wake up MTU2 MSTP(MTU7) = 0; // Wake up MTU7 MSTP(MTU8) = 0; // Wake up MTU8
消費電力低減機能を解除します。RX631のようにアクセスロックはないので、そのまま解除します。
MSTPCTRレジスタがiodefine.hでMSTP(****)というようにデファインされているのでこれを使用します。
2.ピンの設定
PORTC.ICR.BIT.B0 = 1; // Enable PC0 receive buff PORTC.ICR.BIT.B1 = 1; // Enable PC1 receive buff PORTC.ICR.BIT.B2 = 1; // Enable PC2 receive buff PORTC.ICR.BIT.B3 = 1; // Enable PC3 receive buff PORTC.ICR.BIT.B4 = 1; // Enable PC4 receive buff PORTC.ICR.BIT.B5 = 1; // Enable PC5 receive buff PORTC.ICR.BIT.B6 = 1; // Enable PC6 receive buff PORTC.ICR.BIT.B7 = 1; // Enable PC7 receive buff IOPORT.PFDMTU.BIT.TCLKS = 0; // PC0-3 Enable MTCLK-A IOPORT.PFCMTU.BIT.TCLKS = 1; // PC4-7 Enable MTCLK-B
使用するピンの受信バッファを有効にし、PC0-7をMTCLKに割り当てます。
3.MTU1,2,7,8の設定
データシートp.943の表18.49、図18.30を参考に設定します。
MTU1.TMDR.BIT.MD = 4; // MTU1 Phase coefficient MTU2.TMDR.BIT.MD = 4; // MTU2 Phase coefficient MTU7.TMDR.BIT.MD = 4; // MTU7 Phase coefficient MTU8.TMDR.BIT.MD = 4; // MTU8 Phase coefficient MTUA.TSTR.BIT.CST1 = 1; // Count Start MTUA.TSTR.BIT.CST2 = 1; // Count Start MTUB.TSTR.BIT.CST1 = 1; // Count Start MTUB.TSTR.BIT.CST2 = 1; // Count Start
MTU1,2,7,8を位相係数モードに振り当てます。
次に、MTU1,2,7,8のカウントを開始します。エンコーダの計測データは16bitのレジスタであるMTU1,2,7,8.TCNTにそれぞれ収納されます。
これでエンコーダの測定が開始されました。
main文にて
#include "iodefine.h" #include "machine.h" #include <stdio.h> void main(void) { static unsigned int i; while(1){ printf("MTU1.TCNT:%6d\tMTU2.TCNT:%6d\tMTU7.TCNT:%6d\tMTU8.TCNT:%6d\d", MTU1.TCNT, MTU2.TCNT, MTU7.TCNT, MTU8.TCNT); for(i = 0; i < 65000; i++) nop(); } }
TeraTerm等に表示して、エンコーダを回して計測ができていれば成功です!
TCNTのままで扱いにくい場合にはマクロしたり、一度タイマー割り込みでバッファしておくのもいいかと思います。
また、書き込みとデバッグに同様のCOMを使用していると、両立はできないので、かならずどちらかの接続は解除して下さい。
20160822の記事