忍者ブログ

Fグループ電子工作講座

秋月電子SH7125ボードで始めるマイコン開発

エンコーダ入力(MTU TCLK)

関連:ロータリーエンコーダとは
インクリメンタル型エンコーダの入力を設定します。

端子の選定

エンコーダ入力可能な端子は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シリーズが都合が良さそうなのですが試してません。→試しました

PR

コメント

プロフィール

HN:
ぼんどF博士
性別:
男性
自己紹介:

最新コメント