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です。

    ロータリーエンコーダは素手で回しているのでしょうか?ステッピングモータ(?)みたいなので、正確に停止位置を制御出来るようなもので回しているのでは無くて、素手で直接回しているのでしょうか?

    ズレは1カウントなのでしょうか?それとも突然、3カウントとかズレるのでしょうか?上の問いにも関係しますが、もし素手で回しているとしたら、回している最中に、デバッグ用にprintfみたいなので表示させているカウント数が、それまで1ずつ増えていったのが、突然、3、とか、4、とか増えてしまう、ということなのでしょうか?それとも、ステッピングモータ(?)みたいなので、くるくるっと、例えば正確にぴったり4回転とかさせた時に回し終わった時、カウント数を確認してみると、想定よりも、3、とか、4、とか増えてしまっている、というような症状でしょうか?

    これまで投稿された中で、分圧して、という言い回しが実際にあったのですが、どう分圧されているのでしょうか?


    正直なところ、ロータリーエンコーダを触ったことがありませんので、(マイクロテック・ラボラトリー社のブログみたいなのから)推測でME○-30-40-Pというのは内部構造は光学式なのかな、光学式でチャッタリングは起きないと思っているけれども、素手で直接回している場合など、内部構造上の何かの境目あたりで出力信号がバタつくのは当たり前だったりするのかな、とかも疑いつつも、ごめんなさい、ちょっと分からないのが正直なところでした。(ただ、マイクロテック・ラボラトリー社に直接問い合わせてみて、チャッタリングとかバタつきとか、何の言及も無かったのでしたら、そういうものは起きないのだろうなぁ、とも思っていたりしているのですけれども。)

    私がリプライするのは、このあたりまでにして、すみません、これ以後、他の人からのリプライを待って頂くのが良いのかな、と思います。(オシロでのデバッグが出来ないとなりますと、あとはもう経験/知識しか無いだろうと思われますので、実際にロータリーエンコーダを扱っている人などからのリプライを待って頂くのが良いのかな、と思いました。)

  • こんにちは、 さん、NoMay さん

    RX65N Envision Kit で利用可能なポートでは、位相計数モードに必要な「MTCLKx」をアサイン出来ないのではないでしょうか?

    ---

    IRQのエッジ割り込みが入った時に、別の割り込み処理(DRW2D、タッチデバイスのSCIなど)が起こっていて、IRQの割り込み処理が遅延されると、割り込み処理で、別の端子の状態を読みにいった時に、エッジが起こった時間の状態では無い可能性があり、正しいカウントが出来ないのではないかと思われます。

    エッジが発生した時に、同時にサンプリングする必要があると思います。

    ---

    エンコーダーをサービスするなら、一回転40くらいなら、タイマー割り込み(1000Hzくらい?)を使って、A相、B相の状態をサンプリングして、ソフト処理した方が簡単だと思います。

    この方式なら、多少遅延しても、A相、B相を同時にサンプリングするので、問題が起こる可能性は少ないです。

    なので、できれば、A相、B相は、同じポートに接続して、同時に読み出す必要があります。

    以下のリンクにR8C用ですが、サンプルがあります。

    ※エンコーダーは、安い機械式ですが、考え方は同じです。

    https://github.com/hirakuni45/R8C/tree/master/ENCODER_sample

    上記プログラムは、エンコーダーテンプレートを使っています。

    https://github.com/hirakuni45/R8C/blob/master/chip/ENCODER.hpp

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

    その後、どうでしょうか?既に解決済みでしょうか?前回の後、hirakuni45さんからアドバイスがあったものの、他には、発生しているトラブルの原因の特定に繋がりそうな、また、その原因の回避策に繋がりそうな、そういうリプライは無かったですね。

    実は、あれから何か調査方法はないかと以下のスレッドで私は考えていたのですが、ちょっと難易度が高いかな、という案しか思い浮かばなかったのですが、今しがた、難易度は低めだろう、と思われる案が思い浮かびました。

    難易度は低めだろう、と思われる調査方法案

    (1) 今のプログラムとは別にもうひとつプログラムを作る
    (2) LCDの表示とかそういったものをバッサバッサと捨てて、ロータリエンコーダの信号を調べることのみに専念するプログラムを作る ← 重要
    (3) 1μsec程度でカウントアップするフリーランカウンタをRXスマートコンフィグレータのCGコンポーネントで作る
    (4) まずはロータリエンコーダのA相の信号をP32(IRQ2-DS)とPD1(IRQ1-DS)に入れる
    (5) P32(IRQ2-DS)では立ち上がりエッジのみ検出し、PD1(IRQ1-DS)では立下りエッジのみ検出する
    (6) 検出したら上記の(3)のフリーランカウンタの値をメモリにどんどん残していく
    (7) 文房具屋さんへ行って方眼紙を買ってくる
    (8) 買ってきた方眼紙上で上記の(6)で集めたデータをプロットしてロータリエンコーダの信号の波形を手作業で描いてみる
    (8') 最近、日本で、未だにFAXが使われているとか、未だにフロッピーディスクが使われているとか、話題になったけれども気にしない ← 重要
    (8'') たぶん、ロボットを多用した最先端の自動車工場でも、人手で何かをやっている作業は存在する(と思うのだけれども)
    (9) A相の確認が出来たらB相についても確認する

    (10) もし波形にバタつきが見られたら、それを証拠にロータリエンコーダのメーカさんに原因として考えられることを聞く
    (11) そして波形にバタつきが見られたら、それで症状の説明が付くか考察する
    (12) また波形にバタつきが見られたら、機械式ロータリエンコーダのチャタリング除去と同じやり方を実装してみる

    (X) バタつきが見られなかったら、その時は、また、何か考える

    [メモ]

    あれこれ考えていた別スレッド

    FIT R_SCI_RXモジュールでprintfをfrom inside interrupt routine内から行えるかどうか考えてみるスレッド
    community-ja.renesas.com/cafe_rene/forums-groups/tools/f/forum21/9610/fit-r_sci_rx-printf-from-inside-interrupt-routine/46949#46949
     

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

    いつもいつもありがとうございます。別件の締切が差し迫った仕事が山積みになり、そちらに明け暮れていました。

    ロータリーエンコーダですが、どうもギアの嚙み合わせでのバタつきやノイズ等もかなり影響しているのでは?というところで作業が止まっています。それらを確認するために配線の整理をしたりしていたのですが、また別でコンパイル中にエラーログが出るようになり、それを解析してみようと試行錯誤してたところ、ぐちゃぐちゃになっている状態です。エラーログ自体が意味不明な表示が多いので、難易度が高いです。。。話がそれてすみません。

  • >バタつきやノイズ等もかなり影響しているのでは?

    メカスイッチで2相信号を作り、片側のスイッチをガチャガチャ動かせば良いのです。

    カウント値が1だけ前後して元に戻れば問題無し。

    カウント値が2以上変化したら問題有り。

  • 改行ミスりました。。。

    ご教授ありがとうございます。今エラーでまともに動かない状態になってしまっているので、動くようになったら試してみたいと思います。これからもよろしくお願い致します。

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

    やっと別件が落ち着いてエンコーダの作業が再開出来、頂いたアドバイスを読み込んでいました。

    オシロスコープが手に入ったので、エンコーダの信号を見てみたところバタつきやチャタリング等も見受けられず、オシロは信号を拾っているが、画面の数値はバタついているような現象(低速回転時は問題ないが高速回転の場合は現象が発生する)だったので、hirakuni45さんからご指摘頂いた割込み同士のトラブルを現在疑っております。

    しかし、サンプルのプログラムを見てもイマイチ要領を掴めずにいるのですが、簡単な段取りとしてはどの様なものなのでしょうか?同時に2端子をサンプリングするのはわかるのですが、回転時や回転速度でダブったりするのはどう解消しているのかが理解出来ていません。力不足で申し訳ございません。よろしくお願い致します。

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

    オシロが手に入ったので、エンコーダの信号を見てみました。

    結果としては、あくまでマイコンに接続してエンコーダを回してみた状態での計測ですが、エンコーダからの信号は問題なく出ている様子でした。しかし、つながったマイコンのカウント表示は低速回転時にはズレは感じませんでしたが、高速回転させると明らかにおかしくなってしまいました。(増減が互い違いに入っているのか、なかなか数字が進まない状態)

    オシロ側の信号のバタつきやノイズは見受けられずだったので、hirakuni45さんからご指摘頂いた割込み処理の方を確認しようと思っています。しかし、ハードルの高さも感じているので、何か良いアドバイスをお持ちではないでしょうか?

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