関連:
ロータリーエンコーダとはインクリメンタル型エンコーダの入力を設定します。
端子の選定
エンコーダ入力可能な端子はTCLKの表記があります。
PA6:TCLKA
PA7:TCLKB
PA8:TCLKC
PA9:TCLKD
TCLKAとTCLKBがペア、TCLKCとTCLKDがペアとして使用します。
車輪型移動ロボットの両輪の回転を計測する場合はTCLKA~TCLKDを全て使用します。
他にはTCLKに対応した端子は無いので、PA6~PA9以外の選択肢はありません。
初期化設定
ソースファイル「intENC.c」を作り割り込み処理に必要なプログラムを書いていきます。
#include "iodefine.h"
//エンコーダ入力初期化void init_Enc()
{
PFC.PAIORL.BIT.B6 = 0x00;
//PA6 入力 PFC.PAIORL.BIT.B7 = 0x00;
//PA7 入力 PFC.PAIORL.BIT.B8 = 0x00;
//PA8 入力 PFC.PAIORL.BIT.B9 = 0x00;
//PA9 入力 PFC.PACRL2.BIT.PA6MD=1;
//PA6をTCLKA入力に設定 PFC.PACRL2.BIT.PA7MD=1;
//PA7をTCLKB入力に設定 PFC.PACRL3.BIT.PA8MD=1;
//PA8をTCLKC入力に設定 PFC.PACRL3.BIT.PA9MD=1;
//PA9をTCLKD入力に設定 STB.CR4.BIT._MTU2=0;
// モジュールスタンバイの解除 MTU2.TSTR.BYTE&=~0x06;
// タイマ1,2停止 MTU21.TMDR.BIT.MD=4;
//ch1 位相計数モード1 MTU22.TMDR.BIT.MD=4;
//ch2 位相計数モード1 MTU2.TSTR.BYTE|=0x06;
//ch1 ch2 start}
設定項目はPWMの時とほぼ同じです。
PMWではCPUクロックカウントして動作していましたが、エンコーダ入力の場合は
TCLKをカウントします。
あとは勝手にカウントしてくれます。
割込みを設定する必要もありません。
しいて言うなら65535以上カウントすると0に戻るため、必要であればオーバーフローTCIV/アンダーフローTCIU割り込みを設定して65535以上の数字に対応するといったところでしょうか。
カウントした値を読むのも簡単です。
//エンコーダの値取得unsigned short get_Enc(short port)
{
if(port==0)
return MTU21.TCNT;
else if(port==1)
return MTU22.TCNT;
else
return -1;
}
ヘッダファイル
ヘッダファイル「
intENC.h」は関数のプロトタイプ宣言を書いておきます。
#if !defined _INTENC_H_
//読み込まれていない(_INTENC_H_が定義されていない)とき読み込む#define _INTENC_H_ 0
void init_Enc();
unsigned short get_Enc(short port);
#endif
作成したソースファイル「
intENC.c」とヘッダファイル「
intENC.h」は
プロジェクトに追加しておきます。
あとは今まで通りメイン関数内でinit_Enc();を実行してエンコーダ値を読みたい時に、get_Enc(0);またはget_Enc(1);を実行するだけです。
注意すべき点は多くのロータリーエンコーダがオープンコレクタ出力(GNDに接続される/どこにも接続されない)であるため5Vが入力されません。オープンコレクタ出力のエンコーダを接続する際は
プルアップが必要です。
また、
秋月のエンコーダはどれも非常に硬くこれを移動ロボットの車輪に付けると車輪の回転を阻害してしまいます。
ちょと高いのですが、
ビュートローバー用エンコーダ拡張セットVer.2がツインギヤーボックスへ使える様です。
アルプス電気の
EC10Eシリーズが都合が良さそうなのですが試してません。→
試しました