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なので、非常に少ないのですが数回転回すとズレる状態です。

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

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

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

    入手されたオシロは何chのものでしょうか?

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

    2CHでした。

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

    では、以下のようにした場合の波形が見たいです。

    (1) ポート出力を1本確保する
    (2) ロータリーエンコーダの回転角をカウントアップする時に(1)のポート出力をトグルする
    (3) ロータリエンコーダのA相の信号波形と(1)の波形を同時にオシロに表示させて異常個所を探す

    (4) オシロにどれくらいのデータバッファがあるか分からないが適切にトリガを掛ける方法が咄嗟に分からないので暫くの間は闇雲に探してみる

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

    すみません。。。

    ⑴と⑵の意味がわかっていません。。。⑴は今のA相とB相はP32とP33なので大丈夫なのでしょうか??

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

    うっ、、、文章を考えます。

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

    申し訳ないです。。。

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

    よくよく考えてみれば、今まで会社にオシロが無かったぐらいなのですから、伝わらないですよね。すみません。あと、以下の文章ですが、私自身はA相やB相の立ち上がりや立下りと回転軸の右回転や左回転の関係を暗記出来ているのでは無いので、もしかしたら、以下の文章のA相をB相としないと話がおかしい、とかあるかも知れません。あるいは、右回転というのは左回転と書き換えないと話がおかしい、とか。

    (1) ポート出力を1本確保する

    RX65N Envision KitのArduinoコネクタに未使用の端子があるかどうか?
    あればそれを使います。無ければ、何とかしてRX65N Envision Kitのボード上から出力として使えるマイコンの端子を1つ引き出します。

    RXスマートコンフィグレータで、その端子を出力に設定します。

    (2) ロータリーエンコーダの回転角をカウントアップする時に(1)のポート出力をトグルする

    この文章ではそもそもピンと来ないのも無理ないかも知れませんでした。すみません。

    回転角をカウントアップ、というところを、回転角を保持している変数をカウントアップ、とすると伝わるでしょうか。

    たぶん、現在の回転角を保持している変数がある、だろうと思ったのです。
    1回転40パルスですので、1パルスで360度÷40=9度、ですね。
    回転軸を回した時に、何度回転軸が傾いているか(0度~351度)のような状態を保持している変数はありませんか。
    その変数を、インクリメント(もしくはデクリメント)、あるいは+9(もしくは-9)、している箇所がありませんか。
    そこで以下のようにして欲しいということです。たぶん、IRQ割り込みルーチン内だと思っているのですけれども。

        if(回転軸が1パルス(角度9度)右へ回された)
        {
            上記の変数 += 1 もしくは 上記の変数 += 9
            あるいは
            上記の変数 -= 1 もしくは 上記の変数 -= 9
            とか
            そういうことをしている箇所があると思うのだけれども

            以下を追加

            上記の(1)のポート出力 = ~上記の(1)のポート出力(現在の出力がHiならLowへ変更、現在の出力がLowならHiへ変更)
        }

     
    (3) ロータリエンコーダのA相の信号波形と(1)の波形を同時にオシロに表示させて異常個所を探す

    オシロの画面上の本来の期待値波形は、A相の信号の変化と関連して(1)のポート出力が綺麗にトグルする、というものです。
    ですが、現状では、A相の信号の変化とは無関係のような変な位置で、(1)のポート出力が奇妙にトグルすることがある筈なのです。

    それが一体どこなのか、ひとまず把握したいのです。

    たとえば、A相の信号はバタついていないように見えても、通常は(1)のポート出力が綺麗にトグルする箇所でポート出力がバタバタするか、とか。

    (4) オシロにどれくらいのデータバッファがあるか分からないが適切にトリガを掛ける方法が咄嗟に分からないので暫くの間は闇雲に探してみる

    今は闇雲に探してみて下さい。

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

    いつもいつもすみません。本当にありがとうございます。

    大体わかりました!!ちょっとやってみます!

  • 取り急ぎ、オシロで計測してみた画像です。

    黄色がA相の波形

    ピンクがカウントをインクリメントした際のフラグの波形(見づらくてすみません)

    波形そのものにズレがあるのと、立ち上がる毎でオン/オフをしているのですが、明らかに数回飛ばしていたりします。(回転が速いほど飛ばす数が増えている模様)

    またズレの部分ですが、半期ズレているようなので、デクリメントでも同様のオン/オフを入れているので、そちらが作用したのかと。

    回転は同じ方向にしかしていません。今回は手動で回していますが、モーターで回す際は1秒間に2回転回らないくらいの回転速度なので、大体それくらいの間隔で回してみました。(幅が狭い波形は試しでもっと早くまわしています)

    ちなみに、Config_ICUのIRQ2の設定は 

    検出タイプ「立上りエッジ」

    デジタルフィルタ「PCLK/***」(特に根拠なしで試してみただけ)

    優先順位 レベル15

    です。今回の検証にあたって、LCDの割り込みも懸念したので、画面表示上の数字の変更は止めてやってみました。

    ついでにA相・B相の波形も計測してみましたが、きれいに半期でかぶって出ている様に見えました。

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

    > ついでにA相・B相の波形も計測してみましたが、きれいに半期でかぶって出ている様に見えました。

    この写真は添付されていない、ということでよいのですよね。それで、添付されていた写真を見ると、20~30msのレベルの長期間に渡って割り込み禁止になっているような印象がしました。

    それで、LCDパネルに何かを表示させるという動作をさせていない、ということだけでは確証が弱いと思います。main()の中でemWinを起動している箇所をコメントアウトして、ロータリエンコーダのIRQだけが動くだけのようなプログラムを実験用に作って、それでまたオシロで波形を見るとどうなりますでしょうか?

    あと、確認したいのは、もっと素朴にIRQの立ち上がりエッジの割り込み処理の先頭で素朴にポート出力をトグルするようにしてみるとどうなるかです。(IRQの立下りエッジでは敢えて何もしないことにします。わけが分からなくなりそうですので。すみません、この文章の、立ち上がりエッジ、立下りエッジ、というのも、疎覚えです。要はIRQ割り込みがすっぽ抜けているかどうかを、もうすこし確実に明確に把握したい、ということです。)