MTUを使ったパルス出力方法

最近ルネサスのマイコンを触り始めた初心者です。

ぜひ皆様のお力をおかしください。

 

現在 RX220 シリーズを使い、パルス出力を行おうと考えています。

出力されるパルスの周波数はリアルタイムで変化させていきたいのですが、変化させたい周波数の範囲が広く、16bit カウンタでは足りません。

そこで、カスケード接続を使い、32bit カウンタでパルス出力を行おうと思うのですが、如何せん仕様書を見てもよく理解できていません。

 

・コンベアマッチにて出力ピンをトグルしたい

・16bit のカウンタでは可変可能な周波数の範囲が狭い

・上記理由から 32bit タイマを使いたいと思い、MTU1・2 をカスケード接続する方法を試したい

・MTU2 のオーバーフローをトリガに MTU1 をカウントアップさせるが、MTU1 でコンベアマッチを設定すると上位ビットのみでの出力制御になってしまうのでは?

 

例えば、32bit でコンベアマッチできるとして、33FF00h でトグルするよう設定したい場合、MTU1 で 33h、MTU2 で FF00h と設定しても希望する動作にならないと思います。

この場合、MTU1 のカウンタが 33h に到達した時点で MTU1 で指定できるピンがトグルし、MTU2 のカウンタが FF00h に到達した時点で MTU2 で指定できるピンがトグルするという別々の動作が発生するだけだと思われます。

 

ある出力ピンを 32bit の値でコンベアマッチさせトグル出力するには、どういう方法が適切でしょうか?

教えていただければ幸いです。

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

  • リカルド さま

    カスケード接続した MTU を使い、本来マッチングさせたい 32bit の値をカウンタにセットしてカウントダウンさせるということでしょうか?
    確かに、カウントダウンであれば自由な値が設定できそうです。
    仕様書を読んで検討してみたいと思います。
  • わわいです
    タイマ割り込みで波形を出すようにすると、どうしてもジッタ(細かい時間のズレ)が発生するので、それが許容できないと難しくなりますね。
    んで、
    >1000Hz - 500Hz の間も 0.01Hz ステップで段階的に可変させなくてはいけません。
    とのことですが、タイマを使用する限りタイマの駆動クロックの整数倍のパルス幅でしか発生させられませんので、それでそこら辺の仕様を満足できるかまずは計算の必要があります。

    んでもひとつ、
    先の回答では
    >#タイマ0の割り込みルーチンで色々なんやかややるとさらに。。
    と、ぼかした書き方になってますが、割り込みルーチンでタイマキャプチャレジスタの再設定をするなどすると、32ビットどころかそれ以上のカウントが可能となったりします。

    #ここでもぼかした回答になってますが。。
  • fujita nozomu さま

    ご指摘の通り、必ず割り切れる数値とは行きませんし、最終的な目的を考えても今回は近似値であれば問題ないと考えています。
    0.01Hz ステップと言うのは絶対値ではなく、大体これくらいの解像度があれば...と言うような解釈で汲み取っていただければ幸いです。
  • それでは、「1m秒~10秒の範囲、1μ秒刻みで周期を設定」のような仕様で考えるのが現実的と思います。
  • わわい さま

    ありがとうございます。
    現在、TIM0 で 1μsec 間隔程度の出力を作り、 TIM1 でカウントする方向で考えています。
    この方法でも 1kHz 近傍では 1Hz ステップの可変になってしまいますので、このへんは TIM0 との調節でなんとかしていこうと思います。
    大変有意義なご意見、ありがとうございました。
  • fujita nozomu さま

    ご指摘の通り、一定数刻みの周波数を分周して出力する形で考えたいと思います。
    ありがとうございました。
  • ご回答いただいた皆様、ありがとうございました。
    私一人ではこの手の問題にぶつかると何時までも「カスケード接続した MTU 32bit を使った方法」に捕らわれてしまい、先に進めませんでした。
    的確かつ様々な解決策をご提示いただき、大変参考になりました。

    また問題にあたり、今後も解決策をご教示していただきたい事も出てくると思いますが、精進いたしますので何卒よろしくお願いします。
  • sun-tkさん
    NAKAです。すみませんはやとちりで課題が理解できてませんでした!!はずかしぃ~!!
    16bitタイマーの出力を他のタイマーのインプットキャプチャ入力に外部で接続して、タイマー値とインプットされたパルスとの値をコンペアレジスタで調整しちゃう?
    ベテランの先生方が良い意見をくれますので恥の上塗りはやめおきます.....汗)
  • NAKA さま

    いいえ、アドバイスを頂き大変嬉しく思います。
    また何か行き詰まってしまったときに助けていただけると幸いです。
    ありがとうございました。
  • >カスケード接続した MTU を使い、本来マッチングさせたい 32bit の値をカウンタにセットしてカウントダウンさせるということでしょうか?
     
     そうです。アンダーフローした所で自動で初期値に戻れば良いのですが、それが出来なければソフトで再設定することになります。
     ソフトで再設定している時間が誤差になります。割り込みで処理すれば、ほぼ一定の処理時間となりその分を補正したデータを書き込む事も考えられます。
     しかし命令長の長短の関係で割り込みが入ってから割り込みを開始するまで一定とも限りません。
     すなわち、ジッターが生じる訳です。
     精度の良い周期にするために「初段に入れるクロック周期よりも短い時間でソフト処理が完了すれば良いのです。」と書いたのです。
     そこまでシビアな事は言わないと言うのであれば、高い周波数でカウントすれば分解能が良くなります。細かい時間を設定できます。