Renesas RX631 エンコーダ
モータ制御等に必要不可欠なエンコーダを計測していきたいと思います。
エンコーダとは、光とスリットによって、回転方向と回転量を計測することができるセンサーです。
広くモータの回転量の制御や回転量の変化を利用し移動量の計測に使用されます。
以下の手順で設定していきます。エンコーダはMTU2(マルチファンクションタイマパルスユニット2)を用います。
1.消費電力低減機能の解除
2.ピンの設定
3.MTU2の設定
4.ユーザ関数の設定(今回、関数は定義しないので省略)
はじめに
1.消費電力低減機能の解除
2.ピンの設定
を一度にみていきましょう。
PWMの設定時に作成したMTU2_initialize関数に続けて位相係数の設定をしていきます。
MTU2_initialize関数
void MTU2_initialize(void){ // MTU1,MTU2 SYSTEM.PRCR.WORD = 0xA502; // Release Protect MSTP(MTU1) = 0; // Wake up MTU1 MSTP(MTU2) = 0; // Wake up MTU2 SYSTEM.PRCR.WORD = 0xA500; // Protect // Set MPC PORT1.PMR.BIT.B4 = 1; // Set P14: Peripheral PORT1.PMR.BIT.B5 = 1; // Set P15: Peripheral PORTC.PMR.BIT.B4 = 1; // Set PC4: Peripheral PORTC.PMR.BIT.B5 = 1; // Set PC5: Peripheral MPC.PWPR.BIT.B0WI = 0; // Release protect MPC.PWPR.BIT.PFSWE = 1; MPC.P14PFS.BIT.PSEL = 2; // Set P14: MTCLKA MPC.P15PFS.BIT.PSEL = 2; // Set P15: MTCLKB MPC.PC4PFS.BIT.PSEL = 2; // Set PC4: MTCLKC MPC.PC4PFS.BIT.PSEL = 2; // Set PC5: MTCLKD MPC.PWPR.BIT.PFSWE = 0; // Protect MPC.PWPR.BIT.B0WI = 1; // MTU1, MTU2 Encoder Settings 位相係数モード1 MTU1.TMDR.BIT.MD = 4; // MTU1 位相係数モード1 MTU2.TMDR.BIT.MD = 4; // MTU2 位相係数モード1 MTU1.TCNT = 0x0000; // Clear MTU1 count MTU2.TCNT = 0x0000; // Clear MTU2 count MTU.TSTR.BIT.CST1 = 1; // Start MTU1 count MTU.TSTR.BIT.CST2 = 1; // Start MTU2 count // MTU4(設定省略) }
まず、SCI、Timer割り込み同様に、消費電力低減機能のアクセスロックを解除し、消費電力低減機能を解除し、再度ロックします。
つぎに、SCI同様にMPCのアクセスロックを解除し、ピンに周辺機能を割り当て、再度ロックし、下準備を完了します。
3.MTU2の設定
MTU2の設定をします。
データシートp.837の図23.29を参考に設定します。
ここで、MTU2の中には、MTU0~6のユニットがあり、今回は位相係数モードが使用できるMTU1,2を用います。
まず、MTU1とMTU2を位相係数モード1に設定し、MTUのカウントをクリアし、MTUのカウントをスタートさせます。
これでMTUの設定は完了です!
また、4.ユーザ関数の定義ですが今回関数等は設定しないので省略します。
次にmain文にて
#include <stdio.h> #include "iodefine.h" #include "machine.h" void main(void) { while(1){ printf("MTU1:%6d\tMTU2:%6d\n", MTU1.TCNT, MTU2.TCNT); } }
エンコーダを接続し、TeraTerm等でデバッグできれば成功です!
エンコーダの値が収納されるTCNTレジスタは16ビットのレジスタであることには頭に入れておきましょう。
ここで、可読性をあげるために、
#define MTU1.TCNT ENCODER0 #define MTU2.TCNT ENCODER1
としておくのもよいでしょう。
20160818の記事