いつも大変お世話になっております。リューキィです。
現在、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なので、非常に少ないのですが数回転回すとズレる状態です。
何かわかる方がいらっしゃいましたら、ご指導いただきたく思います。
よろしくお願い致します。
上記のタイマーでの割込みは、特にメインの中身はいじらずに(単純に今までのメインにタイマースタートを入れただけです)この状態になりました。
先ほどのはカウンタクリアがコンペアマッチBでされていたので、間が大きいでした。今回の物が1ms毎の画像です。
それとついでに、A相・B相の波形も撮影しまし。
リューキィさん、こんにちは。NoMaYです。main()を弄りに行ったところで、「上記解決しました」、で波形が取れるようになって、その写真はまだ送られてきていなのですけれども、添付し忘れていた、ということはないですか?あと、くだんの1msの波形のチェックにより、割り込みが長期間禁止になっているのでは無かったようだ、という判断に辿り付きますが、その場合、昨日撮った写真の波形と辻褄が合わなくなります。(と私は考えています。)そこで、次に確認したいのは、もっと素朴にIRQの立ち上がりエッジの割り込み処理の先頭で素朴にポート出力をトグルするようにしてみるとどうなるのかです。IRQ割り込みがごっそりとすっぽ抜けているのかどうかを、もうすこし確実に明確に把握したい、ということですIRQ1(情報が分からないですがA相と仮定しておきます)が立ち上がった際に → 割り込み処理の先頭で素朴にポート出力をトグルするIRQ2(情報が分からないですがB相と仮定しておきます)が立ち上がった際に → 何もしない1msの波形のチェックを見て以降の予想IRQ1割り込みがごっそりとすっぽ抜けているのではないけれども、A相のパルスの立ち上がりからハイ幅の半分以上は遅れてから、IRQ1の割り込みが発生している(ハイ幅の半分以上は遅れてからポート出力がトグルする)ことがあるのではなかろうか。つまり、IRQ1の発生がB相の立ち上がり以降にずれ込んでいることがあるのではないだろうか。(これが先日のhirakuni45さんの指摘です。)
NoMaYさん、こんにちは。リューキィです。
上の写真は解決した後に撮影したものです。記載しなくてすみません。
自分もIRQ2を使っているのですが、その端子の入力が怪しいのか?と予測を立てて、今度は1ms毎で端子を読み込んで、状態をトルグしてみました。以下の画像がその結果です。
IRQ2(これでA相の立ち上がりを見ています)とタイマでチェックをし続けた結果がほぼ揃っていました。なので、入力が取れていない事は無さそうです。
A相・B相の入力端子はP32(IRQ2)・P33(IRQ3)を使用しています。
20ms幅でも撮影してみました。
リューキィさん、こんにちは。NoMaYです。ごめんなさい、そちらが何を試したのか以下の文面では分からなかったです。何のタイミングでトグルさせたのでしょうか?「端子を読み込んで」とは書かれていますが、それだけでは文面から読み取れないのですが、私がお願いしたことに相当する(←これの意味は私のIRQの番号の勘違いを訂正した上での)写真になりますか?> 今度は1ms毎で端子を読み込んで、状態をトルグしてみました。以下の画像がその結果です。そして、その写真はMainTask()を動かして(これまでの通常の使用時)での写真ですよね?ああっ、私の方もお願いした時、MainTask()を動かして(これまでの通常の使用時)での、というセンテンスを書き忘れていますね。すみませんでした。
言葉足らずで申し訳ございません。
試したのは、1ms毎のタイマでの割込みが可能かは計測出来たので、今度はそのタイマでIRQ2の入力の状態を見て、きちんと入力が取れているのか(端子の入力自体に何かしら制限があったりしないのか?)を確認したくてやってみました。その結果がトルグが重なっている分です。(黄色線はあくまでセンサーからの信号、ピンク線は1ms毎に端子の入力状態を見て、入力がなされていれば出力・切れれば停止を繰り返しました。計測が1ms毎なので若干のズレが生じる事はあるようですが、高速で回してもおおむね揃っていました。)MainTask等は通常通り動かしていました。
NoMaYさんからのお願いが来る前にやったので、行き違いになっています。
以下が単純に立上りの割り込みにトルグを入れた結果です。
NoMaYさんから頂いた事をちゃんと自分が理解しているか不安なのでソースの画像も付けます。
見づらかったので、幅を変えた物です。
基本的に、今まではIRQ2が立ち上がった時に、IRQ3の状態(HIGH or LOW)を見て、++ or --をしていたんですが、通常IRQ3の立ち上がりも見る必要があるんでしょうか??
リューキィさん、こんにちは。NoMaYです。ちょっと待って下さい。幅を広げた写真ですが、これはIRQ2の割り込み処理でポート出力(ピンク色)がトグルしているタイミングが、ロータリエンコーダのA相のパルス(黄色)のハイ幅の半分より後になっていますよね?(なっている箇所が幾つもありますよね?)ひょっとして、この文章の意味が既に分からない、の?か??も???、、、