読者です 読者をやめる 読者になる 読者になる

CCWO

挫けそうになるブログ

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の設定をします。
f:id:CCWO:20160819165528p:plain
データシート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

としておくのもよいでしょう。