H8CPUの位相カウンタ+ロータリエンコーダの
サンプルプログラム

Copyright(C) 13May2002
coskx

はじめに

この文書はAKI-H8にて,ロータリエンコーダ(位相カウンタ利用)のサンプルプログラムを提示するものである。

【1】 AKI-H8とのロータリエンコーダと接続

図1.2に示すような光学式ロータリエンコーダは回転角を測定するセンサーで,軸が回転するとパルスが発生する。1回転につき,100パルス程度のものから20000パルス程度の分解能を持つものがある。ロータリエンコーダからのパルス信号はA相B相の2つがあり,これにより,回転方向も判別することが出来るようになっている。H8CPUはA相B相の信号を受け取り,回転方向を判断し,UPカウント・DOWNカウントを行なう24ビットカウンタを持っている。図1.1はH8CPUのITUチャネル2を使用する場合の結線を示している。この状態でのプログラム例を以下に示す。

H8_RENCODER.GIF - 2,267BYTES

 図1.1 ロータリエンコーダをAKI-H8に接続した例
(ITUチャンネル2を利用)
ロータリエンコーダの出力はオープンコレクタ出力とする。

ロータリエンコーダの中にはプルアップ抵抗付のものもある。
その場合は図のプルアップ抵抗は不要である。

 図1.2 光学式エンコーダの例(オムロン)

 

【2】 ロータリエンコーダ(インクリメント型光学式エンコーダ)からの信号をH8/3048の持つ位相カウンタで読み取る

ロータリエンコーダ(インクリメント型光学式エンコーダ)からの信号は次のようになっている。正転時と逆転時ではA相B相の信号の位相が異なる。
H8/3048ではITUのチャネル2が位相カウンタとしての動作が出来る。正転時はカウントアップされ,逆転時にはカウントダウンする。
エンコーダ信号の1周期で4つカウントするので,ロータリエンコーダの1回転でのカウントは,仕様の4倍である。(4逓倍カウント)
すなわち,1000pulses/rev(1回転で1000パルス)仕様のロータリエンコーダでは1回転で4000カウントになる。

エンコーダからの信号

 

H8カウンタの取得とシリアルポートへの出力

/**********************************************************
H8カウンタの取得とシリアルポートへの出力 
**********************************************************/
#include <3048fone.h>
#include "h8_3048fone.h"

void initH8CounterCH2(void)
/*ITU channel2を使用*/
{
    ITU.TMDR.BYTE |= 0x40; /*MDF->1 ITU2:counter mode*/
    ITU.TSTR.BIT.STR2=1;
    ITU2.TCNT=0;
}

/* ------------------------------------------------- */
/* READ H8 INNER COUNTER*/
/* ------------------------------------------------- */
int getH8CounterCH2(void)
{
    return ITU2.TCNT;
}

main()
{
    int x,oldx=32767;
    initSCI1();         /*シリアルポート初期化*/
    initH8CounterCH2();    /*H8位相内部カウンタ初期化(ITUchannel2使用)*/
    while(1) {
        x=getH8CounterCH2();   /*位相カウンタの読み出し*/
        if (x!=oldx) SCI1_printf("%d\n",x);  /*シリアルポートへ送信*/
        oldx=x;
        /*シリアルポートから入力があったら、位相カウンタクリア*/
        if (0<chkgetCharSCI1()) initH8CounterCH2();
    }
}