RZ/A1H OSタイマ割り込みによる矩形波の高速化

GR-PEACH(RZ/A1H)にて500Hzの矩形波を生成したいのですが、387KHzが限界です。

実現方法はあるでしょうか。

以下のコードでOSTM1CMP<=10としても387Khzから周波数が上がりません。

#include "mbed.h"
#include "ostm_iodefine.h"

static void my_ticker_interrupt(void);

main(){


  //init GPIO - DIO0:P2_15
  GPIOPIBC2 = GPIOPIBC2 & 0x7fff;
  GPIOPBDC2 = GPIOPBDC2 & 0x7fff;
  GPIOPM2 = GPIOPM2 | 0x8000;
  GPIOPMC2 = GPIOPMC2 & 0x7fff;
  GPIOPIPC2 = GPIOPIPC2 & 0x7fff;

  GPIOPIBC2 = GPIOPIBC2 & 0x7fff;
  GPIOPM2 = GPIOPM2 & 0x7fff;


  /* Power Control for Peripherals */
  CPGSTBCR5 &= ~(CPG_STBCR5_BIT_MSTP50); /* enable OSTM1 clock STBCR5のbit0 */

  // timer settings
  OSTM1TT = 0x01; /* Stop the counter and clears the OSTM1TE bit. */
  OSTM1CTL = 0; /* Interval timer mode. Interrupt disabled when star counter */
  OSTM1CMP = 0x8; // 387kHzが限界
  OSTM1TS = 0x1; /* Start the counter and sets the OSTM0TE bit. */

  // INTC settings
  InterruptHandlerRegister(OSTMI1TINT_IRQn, my_ticker_interrupt);
  GIC_SetPriority(OSTMI1TINT_IRQn, 5);
  GIC_EnableIRQ(OSTMI1TINT_IRQn);

  while(1){
  }
}

static void my_ticker_interrupt(void){
  GPIOP2 ^=0x8000; //P2_15反転
}

Parents
  • OSTMを使う方法では、これ以上の速度は難しいと思います。(500kHzですよね?)
    代わりにPWMを使った方法はいかがでしょうか?

    ■コード
    #include "mbed.h"

    PwmOut pwm(P4_4);

    int main() {
        pwm.period_us(2);      // 2 us period
        pwm.write(0.50f);      // 50% duty cycle, relative to period
        while(1);
    }

    ■PWM(高速版)として使用できるピン
    PWM(高速版)出力として、下記の端子を選択できます。
    複数ポートでPWMを行う場合、"or"で記載されている組み合わせは排他となります。
    ・P4_4 or P4_5
    ・P4_6 or P4_7
    ・P8_8 or P8_9
    ・P8_10 or P8_11
    ・P8_12 or P8_13
    ・P8_14 or P8_15

    詳細は下記リンクのPwmOut⇒Existing PWMを参照ください。
    https://developer.mbed.org/teams/Renesas/wiki/GR-PEACH_supported_function_map

  • 有難うございます。

    500kHz達成しました。

  • 500kHz超えの矩形波を正確に発生させることができたのですが、矩形波のパルス数を同時に正確に計測する方法はあるでしょうか。

    a) OSTMを使用すると割り込み関数内で出力を反転させて矩形波を生成できます。この時に同時にカウントすればよいのですが、上述の通り380kHzが限界です。

    b) PWMを使用すれば矩形波は >500kHz 可能です。

      TGIA割り込みを使用しても割り込み発生から処理されるまでがPWM周波数により一定とはならない為、正確なカウントが出来ないと思われます。

  • わわいです

    外部回路で、タイマのインプットキャプチャ信号と矩形波出力とANDを取る、ぐらいしか思いつきませんねー

    500KHz以上ともなると、インプットキャプチャ割り込みをかけたところで、割り込みの応答時間で止めるのは無理でしょうね

    ANDゲート一個増えるという話になりますが、どーでしょうか。

  • 500kHz以上では難しいとのこと承知しました。

    お陰様で其々の方法の特徴を知ることができました。(正確な理解までは遠いですが)

    アドバイス頂いた外付け回路等で再考したいと思います。

  • 単純に マルチファンクションタイマ のクロック入力に入れれば良いのでは?

  • チョコです。

    がじぇルネのGR-PEACHをみると位相計数モード(下記URL)があったので,

    マルチファンクションタイマパルスユニット2のカウントクロック入力がサポート

    されているようです。そうならば,外部クロックをカウントさせることは可能な

    はずなので,ハードウェアでカウントできると思われます。

    GR-PEACHはがじぇルネの方がいいかと思います。

    japan.renesasrulz.com/.../3728.aspx

  • ハードウエアマニュアルを探しました。位相計数モードを使用するという事でしょうか? 

     -->今回は1個のパルスをカウントするだけなので、位相計数モード2でアップカウントに設定する。

  • チョコです。

    位相計数モードを使うのではなく,単に端子を外部クロック入力として使用して,

    外部クロックにPWM信号を入力すればカウントしてくれるのではないでしょうか。

    RZ/A1Hのマニュアルの「10.3.1 タイマコントロールレジスタ(TCR)」のところの

    「表10.6 TPSC2~TPSC0(チャネル0)」に外部クロックでカウントなんてあるので,

    普通にカウントできると思います。

  • わわいです

    ああ、単にカウントするってはなしですか。

    特定のパルス数を出力するってのと勘違いしてました。それじゃ前の発言は忘れてくださいませ

    パルス出力をタイマ入力に繋げることができるなら、「マルチファンクションタイマパルスユニット」でカウントできます。

    カウント幅は16ビットですが、タイマ2つをカスケードに設定できるので、そうすれば32ビットカウンタを構成できますねー

  • 皆様、有難うございます。

    トライさせて頂きます。

Reply Children
No Data