RL78 F13/F14を使っています。初心者です。
パルス幅検出のところで質問がございます。
以下の仕様のセンサを使用して車輪の速度、回転方向を検出したいと考えております。
使用する汎用のマイコンで2入力のうち、1つはTAU0のパルス幅検出機能にも対応していたのですが、
もう一つの端子は入力のみの機能しかありませんでした。
ですので、コード生成機能を使って、パルス割り込みを入れることは出来たのですが、
この割り込みはエッジを検出したときに入るフローで間違いないでしょうか?
割り込みに入った時にポートのH/Lを検出して傾転方向のフラグを立てているのですが、
稀にフラグが反転してしまいます。プログラムがおかしいのか、マイコンの性能的なものなのか分かりません。
私の頭ではこのようなやり方しか思いつきませんが、
他に何か良い方法があれば、教えていただけると助かります。
以下、割り込み時の処理
◆やっていること
①車輪0km/h判定のタイマクリア(200msパルス割り込みに入らないと0km/hと判定)
②回転方向のフラグセットP1.5がOFF(1)を検出すれば、フラグセットする。(フラグがクリアされたときにはメイン関数で計算した車輪速に-1をかける)
=============================================
/************************************************************************************************************************ Function Name: r_tau0_channel2_interrupt* Description : This function is INTTM02 interrupt service routine.* Arguments : None* Return Value : None***********************************************************************************************************************/__interrupt static void r_tau0_channel2_interrupt(void){ if ((TSR02 & _0001_TAU_OVERFLOW_OCCURS) == 1U) /* overflow occurs */ { g_tau0_ch2_width = (uint32_t)(TDR02 + 1U) + 0x10000U; } else { g_tau0_ch2_width = (uint32_t)(TDR02 + 1U); }
/* Start user code. Do not edit comment generated here */ T1ms_AB = Speed_Sensor_Clear; //車輪0km/h判定タイマセット if(P1.5 == D_IN_OFF) { CW_FG = 1; } else CW_FG = 0; /* End user code. Do not edit comment generated here */}
=====================================
AB相インクリメントエンコーダですね。位相計数モードをサポートしたタイマ RGを積んだやつならもう少し楽ができたんじゃないかと思います。フラグと言っているのはポートの入力値が思っている値じゃないと言うことでしょうか?多重割り込みが有効化されずにタイマの割り込みハンドラの開始が遅れてしまっているのではないかと思います。
早速のご返答ありがとうございます。
便利な機能があるのですね。RL78しか使ったことが無かったので、知りませんでした。
仰っている通り、割り込みに入った時にポートの状態が思った通りになりません。
初心者過ぎて解決の仕方の検討がつかないのですが、割り込み処理のレベルを上げるのは効果がありますか?
チョコです。
>RL78しか使ったことが無かったので、知りませんでした。
RL78にもRL78/G14、RL78/G1F、新しいところではRL78/G24などタイマRG(G24はRG2)を搭載したデバイスは存在しますよ。
もう少し、時間についての情報がないとコメントしようがないですね。
以上
ご連絡ありがとうございます!
そうなのですね。F14ばっかり使っていたもので…
時間というのはパルス幅のことでしょうか?パルス幅は最小200μsecぐらいになります。
>パルス幅は最小200μsecぐらい
と言うことは、デューティ50%なら、パルス間隔は400μsecで、エッジ検出から逆相の変化までは100μsecですね。
割り込みそのもの受付け時間は最大で16クロックなので、他の割り込みのせいでエッジ検出割り込みがこの程度の期間ペンディングされていなければ、逆相はほとんど問題なく取り込めるはずです。(マイコンのせいとは言えません。)
たまに逆になるのは、ノイズ・フィルタで除けないジッターの影響があるかもしれない(それでもパルス幅情報が若干変動するくらい)し、本当に逆転しているかもしれません。
センサーを介したハードの振動はどの程度でしょうか。ここらの波形情報(細かな時間情報)がなければ、正確なことは言えません。
RX231の位相計数タイマで行っていた処理を、RL78(タイマRGなし)に移植した際
端子A、端子B(両方端子割り込み(INTPxに割り当て)、端子割り込みは両エッジ設定)を使い
・端子Aの割り込み関数
if(端子A == 0)
{
//端子Aのfallエッジ(↓)
if (端子B == 0) g_counter--;
else g_counter++;
}
else
//端子Aのriseエッジ(↑)
if(端子B == 0) g_counter++;
else g_counter--;
(端子Bの割り込み関数も同様)
カウントアップの条件は
端子A=H 端子B=↑, 端子A=L 端子B=↓, 端子A=↑ 端子B=L, 端子A=↓ 端子B=H の4条件
カウントダウンの条件は
端子A=H 端子B=↓, 端子A=L 端子B=↑, 端子A=↑ 端子B=H, 端子A=↓, 端子B=L の4条件
上記の様な処理を行えば、簡易位相計数タイマが実現出来るのかと思います。回転方向(カウンタがインクリメントされるか、デクリメントされるか)、他のタイマを使い一定期間内に何カウント動くかで回転数の検出ができるかと思います。(DCモータの回転数検出に使いましたが、8個の穴の空いたエンコーダディスクとの組み合わせで、10,000rpm程度の速度であれば、ハードウェアの位相計数タイマと同じ様な値が取得できました。)
tfさんのコメントのように、他のプログラムや割り込み等の影響がなければ、ソフトでも十分できるはずです。(ただし、「パルス幅は最小200μsecぐらい」なので、5kHzだと考えると若干高速かも。)
KKさんのようにタイマでパルス間隔測定を使えば、速度情報も同時に得ることはできるはずです。
わわいです
本来こういう場合、位相計数モードのタイマを使い、AB相カウントさせるようにします
そうしておけば、一定時間ごとにカウント値を読み出し差分を出すだけで速度方向が出せます
パルスごとの割り込みを生成させる必要もなく、速度を出すためのオーバーヘッドをほとんどなくせます
わわいさん、使おうとしているMCUにそのような機能がないので、残念ながらそれはできません。
それをパルス間隔測定機能+ポートでできないかの議論になっています。
いやまー、こういう場合のオーソドックスな実装法を提示しておかなくちゃ、とおもっただけで。
#選定のMPUが悪いです、と書くわけにも行かないとかなんとか