CCWO Embedded Space

CCWOの日々の開発を発信するブログ

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)の設定手順を見ていきます。

  1. モジュールスタート(消費電力低減機能の解除)
  2. ピンの設定
  3. MTU1,2,7,8の設定
  4. ユーザ関数の定義

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の設定
f:id:CCWO:20160822184307p:plain
データシート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の記事