title

ロータリーエンコーダーのA相B相信号からCW/CCW信号に変換する その2

マイコンソフトを使用してエンコーダーを使う

ロータリーエンコーダー画像

ロータリーエンコーダからのA相B相のパルス信号をマイコンで処理します。回転方向のデコードに位相差を利用するのはロジックICと変わりません。 位相差を取り出すのには片側のパルスエッジで割り込みをかけその時に反対側の位相はHiであるのかLoであるのかで回転方向を見極めます。

MCUはRL78G13(64pin)を使用します。P13-7とP7-3にエンコーダー、IICバスにLCDが接続されています。

1 r_main.c に R_INTC0_Start(); を追加します。
void R_MAIN_UserInit(void)
{
    /* Start user code. Do not edit comment generated here */
    EI();
    R_INTC0_Start();
    /* End user code. Do not edit comment generated here */
}
			
2 r_cg_intc_user.cに記述します。
void r_intc0_interrupt(void)
{
    /* Start user code. Do not edit comment generated here */
	    if(P7_bit.no3 == 0)
		    encorder_count ++;
	    else if(P7_bit.no3 == 1)
		    encorder_count --;
    /* End user code. Do not edit comment generated here */
}
        

以上でエンコーダーの回転に応じたクリック数のカウントがアップダウンカウンタ"encorder_count"に入ります。 この値を加工すれば表示したりPWMのデューティにすることが出来ます。基本動作は以上です。

3

上記はソフト対策してありません。対策にはエンコーダーの読み直しをします。

まずr_mai.cに関数 wait を追加します。プロトタイプにも追記します。

    ***プロトタイプ宣言***           
    /* Start user code for global. Do not edit comment generated here */
    int16_t encorder_count;
    void delay(unsigned int loop);
    /* End user code. Do not edit comment generated here */
            
    ***関数***            
    /* Start user code for adding. Do not edit comment generated here */
    void delay(unsigned int loop){
        unsigned int	i;
        unsigned int	dummy;
        for (i=0;i < loop;i++) {    //数値は再確認の遅延時間 適切に変更する
            dummy++;
            ;
        }
    }
    /* End user code. Do not edit comment generated here */
        

r_cg_intc_user.cにも追記します。

void r_intc0_interrupt(void)
{
    /* Start user code. Do not edit comment generated here */
    delay(10000);           //2msec程時間待ちします。
    if(P13_bit.no7 == 0){   //割り込みポートを読みます。Loならカウントします
	    if(P7_bit.no3 == 0)
            encorder_count ++;
	    else if(P7_bit.no3 == 1)
            encorder_count --;
    }    
    /* End user code. Do not edit comment generated here */
}
        

3

以上でエンコーダーの計数:カウントアップとカウントダウンはできました。

E1エミュレーターを接続していれば"encorder_count"の値がクリック数に応じ増減するのが見て取れます。

4

一般的には増減のカウントが出来れはその値を利用するだけですがロジック回路のようにCW,CCW,CW/CCWの パルス出力が必要なら

    void r_intc0_interrupt(void)
    {
    
        /* Start user code. Do not edit comment generated here */
        delay(10000);
        if(P13_bit.no7 == 0){		
            if(P7_bit.no3 == 0){
                P7_bit.no0 = 1;
                P7_bit.no4 = 1;
                encorder_count ++;
                delay(1000);
                P7_bit.no0 = 0;
                P7_bit.no2 = 0;
                P7_bit.no4 = 0;
            }
            else if(P7_bit.no3 == 1){
                P7_bit.no1 = 1;
                P7_bit.no4 = 1;
                encorder_count --;
                delay(1000);
                P7_bit.no1 = 0;
                P7_bit.no2 = 1;
                P7_bit.no4 = 0;
            }
        }
        /* End user code. Do not edit comment generated here */
    }
           
            

とします。P7-0からはCWパルス、P7-1からはCCWパルス、P7-2からはCW/CCW方向情報、P7-4からはCW+CCW両方向のパルスが出ます。

5

別章の温度湿度計で使用した表示プログラムの温度の代わりにクリック数"encorder_count"を入れれば数値が表示されます。

MCU内蔵専用ハードウェア

RX220では位相計数モードがあります。ハードウェアマニュアルにはMTU2aの章に「位相計数モードは、 MTU1、 MTU2 の設定により、 2 本の外部クロック 入力の位相差を検出し、 TCNT をアップカウント / ダウンカウントします。~2 相エンコーダパルスの入力として使用できます。」とあります。この機能を 使用すればもっと簡単便利にエンコーダーが利用できると思います。残念ながらまだその機会はありませんが・・。

MCUの機能が多くなり、しかも便利になりました。しかしそれを覚えるのは大変です。