Config_ICUでのIRQの設定について

いつも大変お世話になっております。リューキィです。

現在、RX65N Envision Kitでロータリーエンコーダを使用した試作機の開発をしているのですが、

信号の入力も表示も出来ているのですが、なぜか1回転した時の数字がズレてしまう事が多々発生してしまっています。

ロータリーエンコーダの接続の方法や、接続端子の接触不良等も疑ったのですがどうやら問題なさそうで、次にマイコン側の端子の設定

を疑っている次第です。

13chのD7(IRQ1)とD6(IRQ2)ロータリーエンコーダの信号線は接続しており、

モジュールのConfig_ICUでIRQ1/2ともに立上りエッジのレベル15 フィルタ無しにしてあります。

また、メインソース上で

R_GPIO_PinDirectionSet( GPIO_PORT_D_PIN_1, GPIO_DIRECTION_INPUT );
gpio_err |=R_GPIO_PinControl (GPIO_PORT_D_PIN_1, GPIO_CMD_IN_PULL_UP_ENABLE);
R_GPIO_PinDirectionSet( GPIO_PORT_3_PIN_2, GPIO_DIRECTION_INPUT );
gpio_err |=R_GPIO_PinControl (GPIO_PORT_3_PIN_2, GPIO_CMD_IN_PULL_UP_ENABLE);

で入力端子設定とプルアップ設定も行っております。

(※もしかしたらこれが二重設定とかになっていて邪魔をしているのか??とも思い始めました)

また、ロータリーエンコーダのカウントは

IRQ1が立ち上がった際に、IRQ2の状態を見て0だったらカウントをインクリメント

IRQ2が立ち上がった際に、IRQ1の状態を見て0だったらカウントをデクリメント

としています。(それぞれの立ち上がりを見ずとも、一行目にelseでデクリメントすれば良いのもわかっているのですが、ズレが発生しているので何か問題があるのかもと思い、わざと

分けてあります)

ロータリーエンコーダの1周の分解能は40なので、非常に少ないのですが数回転回すとズレる状態です。

何かわかる方がいらっしゃいましたら、ご指導いただきたく思います。

よろしくお願い致します。

  • そうなんですよね。なんでズレるのかがわからないです。なのでソースがおかしいのかも!?と思い、ソースの画像も付けた次第です。自分が思い描いている感じだと、立ち上がる度にオン/オフしているので、2つの信号の立ち上がりにトルグの立ち上がりと立下りが重なるはずなんですけど。。。

  • もしかして、やっぱり自分が意味を書き違えていますでしょうか???

  • リューキィさん、こんにちは。NoMaYです。

    いやいやいや、これが原因なのですよ。(もう少し正確には、もっと根っこの原因があるのですが、そのせいでこういうことが起きるのです。) その、すみません、失礼を承知で言うと、歴然とマイコンの知識不足、なのですよ。

    次の作業をどうするか考えてみます。

  • リューキィさん、こんにちは。NoMaYです。

    すみません、いや、1msの割り込みは綺麗に入っていたので、まだ何か私も見落としていることがありそうです。

  • NoMaYさん、こんにちは。リューキィです。

    すみません。知識不足なのは100も200も承知なので全然失礼じゃないです。すみません。

    本当にお手数だけお掛けして、申し訳ないです。。。

  • リューキィさん、こんにちは。NoMaYです。

    以下の条件で、もう一度、1msで黄色をトグルさせる写真を何枚か撮って頂けませんか?

    ・ 今日の10:43の写真相当
    つまり
    ・ CMTで1msの割り込みを作る
    ・ それでポート出力をトグルさせる
    ・ MainTask()は動かす
    ただし
    ・ 写真の幅は先ほどの写真のように広げる

    先程のリプライの「1msの割り込みは綺麗に入っていた」は20ms~30msのレベルの割り込み禁止に気を取られていた時の私の理解を書いたものですので、1msの割り込みが正確に1ms毎に入っていたかどうかを、改めて確認したいのです。

  • リューキィさん、こんにちは。NoMaYです。

    > 以下の条件で、もう一度、1msで黄色をトグルさせる写真を何枚か撮って頂けませんか?

    色は、黄色ではなくて、ピンク色ですかね。すみません。

  • リューキィさんこんにちは。

    上に示したサンプルでは、周期的な割り込みを発生させて、エンコーダーの信号をサンプリングして、ソフトによりデコードしています。

    A相、B相を同時にサンプルして、デコードしているので、「ダブったりする」事はありません。

    ただ、サンプリング周期が1000Hzだと1ミリ秒なので、それより短いパルスは検出出来ません。

    エンコーダーを左右に高速で動かした場合や、高速に回転した場合に、1ミリ秒より短い周期になるとミスカウントします。

    その場合、サンプリング周期を上げる必要があります。

    サンプリングでは、1つ前の状態を保持しているので、L->H、(立ち上がり)、H->L(立下り)を検出出来ます。

    A相、B相、2ビット、1つ前の状態2ビット、合計4ビット(16通り)を適切にデコードすれば回転方向を判別する事が出来ます。(ENCODER.hpp の service を参照)

  • NoMaYさん、こんにちは。リューキィです。

    これで良いでしょうか?

    1msタイマでトルグして

    5ms 2ms 1ms の幅で撮影しました。

  • リューキィさん、こんにちは。NoMaYです。

    どうもありがとうございました。はい、それでよいです。他方で、A相とIRQ2の波形では、あんなに歴然と割り込みが遅れているのが見えたのに、この写真では異常が見られませんね。

    ちなみに、ロータリエンコーダを回すと、それに連動して何かの機器が動作して、その機器から通信が入って来たりとか、あるいは、それに連動してRX65N Envision Kitに別の(A相/B相以外の)信号が入って来たりとか、そのようなことはあったりするのでしょうか?


    今思い浮かんだのは、ロータリエンコーダを回しながら先程と同じ写真を撮ってみるとどうなるでしょうか?