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

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

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

Parents
  • こんにちは。NoMaYです。

    少し脱線しますけれども、RXマイコンのタイマの位相計数モードというのが、これを自動でやってくれるものかな。

    RX65Nグループ、RX651グループ ユーザーズマニュアル ハードウェア編
    R01UH0590JJ0230 Rev.2.30 Pages 2763 2019.06.20
    www.renesas.com/jp/ja/document/mah/rx65n-group-rx651-group-users-manualhardware-rev230#page=1028

    24.3.6.2 カスケード接続32 ビット位相計数モード

    …略…

    カスケード接続32 ビット位相計数モードは、A 相、B 相とZ 相の三相信号の入力が可能です。A 相/B 相に外部入力位相クロックMTCLKA/MTCLKB またはMTCLKC/MTCLKD、Z 相にMTIOC1A をそれぞれエンコーダパルスの信号とします。

    …略…


    [追記]

    カウンタの基礎知識 - コンテック
    www.contec.com/jp/support/basic-knowledge/daq-control/counter/#anc-03

    Google検索: ロータリエンコーダ 位相計数カウンタ OR 位相計数モード
    www.google.com/search?q=ロータリエンコーダ 位相計数カウンタ OR 位相計数モード

    Google検索: ロータリエンコーダ ソフトウェア OR プログラム
    www.google.com/search?q=ロータリエンコーダ ソフトウェア OR プログラム
     

  • こんにちは、 さん、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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Children
No Data