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

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

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

 

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

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

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

 

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

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

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

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

 

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

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

 

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

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

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

  • マニュアルでRX220のカスケード動作を見てみました。
    インプットキャプチャを意識した構成で、コンペアマッチには向いていない気がします。
    まずは16ビットで何とかならないか考えてみてはいかがでしょうか。
    具体的な用途や実現したい周波数範囲、周波数のステップ(分解能)が明らかになってくると、アドバイスが得やすいと思います。
  • Higetaka さま

    返信ありがとうございます。
    やはりカスケード接続機能は今回の用途には向かないのですね。
    周波数の範囲としては 0.1Hz - 1000Hz 程度の範囲で、可能な限り細かなステップが理想ですが、0.01Hz ステップ以下にしたいです。
    そんなに高い周波数ではないので、CPU で処理しきれてしまうかもしれません。

    具体的な用途ですが、受け取ったパルスの周波数を指定したパーセンテージ分補正して出力するといったもので、受け取るパルスの周波数はアナログ的に変化します。
  • 周波数レンジを分割できれば、16bitでもそこそこの分解能で実現できそうですね。
    X Hzで2分割して、
    0.1Hz~X Hz 0.01Hz単位
    X Hz~1000Hz 0.1Hz単位 (ここの要求精度がパーセンテージでどの位か)
    なら、できそうな気がします。
    継ぎ目のところをどうするかが悩みどころですが。
  • Higetaka さま

    Higetaka さまのご提案を含め、別の方法を検討してみたいと思います。
    ご回答ありがとうございました。
  • わわいです
    MTUの仕様上、32ビットのコンペアマッチを行うのは無理なのであきらめましょう。
    で、こういう場合では、タイマ0のコンペアマッチ出力とタイマ1のクロック入力を接続しておき、タイマ1のコンペアマッチ出力を出力として使用して、タイマ0とタイマ1の組み合わせで周波数の生成を行うようにします。
    この2つの組み合わせにより、かなり細かい分周比の設定ができるようになります。が、あなたの実装しようとしている仕様上でこれで満足できるかどうかはがんばっていろいろ計算してみてください。
    #タイマ0の割り込みルーチンで色々なんやかややるとさらに。。
  • わわい さま

    タイマ0でカウントアップの周期を調節し
    タイマ1でタイマ0をトリガにしたカウントアップを行う

    という解釈でよろしいでしょうか?
    確かに細かい計算を割り当ててく必要がありますが、なるほどこれなら広い範囲に対応できそうです。
    参考にさせて頂き、一度その仕組で組んでみたいと思います。
    ご回答ありがとうございました。
  • sun-tkさん
    こんにちは、NAKAといいます。勘違いでしたらすみません
     

    0.1Hz~1000Hzくらいであれば、ふつうのI/O portを使って、MTUで1msのインターバル割り込みを作っておいて、割り込みの中で

    unsigned short  c_count;
    extern unsigned short  SET;

    void MTU0_INT(void)
    {
     c_count++;
     if(c_count >= SET)
     {
        c_count = 0;
        Port = ~Port;
     }
    }

    とかして、SETを変更していけばどうでしょうか?

    c_countやSETをunsigned long とかにすれば 0.01Hzどころかとんでもなくゆっくりのパルスも出力できそうですよ!

    SET=1       1000Hz

    SET=10000   0.1Hz

    SET=100000  0.01Hz

  • NAKA さま

    ご回答ありがとうございます。
    私の認識不足なら申し訳ありません。
    ご指摘の方式ですと、例えば SET = 2 で 500Hz になると思うのですが、1000Hz - 500Hz の間も 0.01Hz ステップで段階的に可変させなくてはいけません。
    確かに低い周波数を細かく調節することはできそうですが、今回は上から下まで細かくステップしたいと考えております。
  • RX220については知らないけど、RX621の経験で書きます。
     16ビットカウンタを従属接続にして32ビットカウンタは作れます。
     ダウンカウンタを作って、アンダーフローでの処理を考えます。
     反転で無くてもクロックさえ出れば簡単。もう1段カウンタを追加してそちらで反転させます。
     ハードで作るなら74HC74。
     
     難しいのはカウンタ値の再設定です。自動的に再設定できるような機能が有るかマニュアルをよく読まないと分からない。
     自動的に設定してくれなくても時間的余裕があればソフトで設定できる。
     初段に入れるクロック周期よりも短い時間でソフト処理が完了すれば良いのです。
     そのため初段のクロックはシステムクロックを分周するか、他のカウンタで分周します。
  • > 周波数の範囲としては 0.1Hz - 1000Hz 程度の範囲で、可能な限り細かなステップが理想ですが、0.01Hz ステップ以下にしたいです。

    仕様として、与える周波数は近似値で良いのでしょうか?
    タイマーの仕組みとして、例えば 3Hz のような割り切れない周期の指定は不可能であり、333.333m秒等に近似するのが現実的と思います。