ホーム フォーラム Texas Instruments マイコン C2000 TZ2割り込みが入らない件に関するご相談

このトピックには5件の返信が含まれ、2人の参加者がいます。5 年、 6 ヶ月前 amatsu1 さんが最後の更新を行いました。

6件の投稿を表示中 - 1 - 6件目 (全6件中)
  • 投稿者
    投稿
  • #6147 返信

    amatsu1
    参加者

    TZ2割り込みが入らない件に関するご相談

    いつも大変お世話になっております。

    現在、TMS320F28027にてテクニカルリファレンスマニュアルを拝読しながら、TZ2端子にHigh→Lowをトリガとして、EPWM3AのA出力をパルスバイパルスでLowとする処理を考えています。

    しかし、以下のコードで割り込み及びEPWM3AのA出力がLowになりません。
    お手数ですが、原因についてご教示願います。
    なお、デバックはTBCLKを動かしながら実施しております。

    init(){

    GpioCtrlRegs.GPAMUX2.bit.GPIO16=0;
    GpioCtrlRegs.GPADIR.bit.GPIO16=0;
    EALLOW;
    //TZ割り込み設定 ch3
    Pwm3Regs.DCTRIPSEL.bit.DCALCOMPSEL=0b0001;
    EPwm3Regs.TZDCSEL.bit.DCAEVT2=0b011;          
    EPwm3Regs.TZCTL.bit.DCAEVT2=0b10;    // EVT2発生時にEPwm3AをLowレベルとする。
    EPwm3Regs.TZEINT.bit.CBC=1; // EVT2発生時にTZEINT割り込みをイネーブルにする。
    EPwm3Regs.TZEINT.bit.DCAEVT2=1;
    EPwm3Regs.TZSEL.bit.DCAEVT2=1; // EVT2のパルスバイパルストリップをEPwm3_TZINのイベントソース
    EPwm3Regs.DCFCTL.bit.PULSESEL=0b01; // 周期の最初でマスク開始
    EPwm3Regs.DCACTL.bit.EVT2SRCSEL=0; // とりあえずフィルターは使用しない
    EPwm3Regs.TZFLG.bit.DCAEVT2=0;

    PieCtrlRegs.PIEIER2.bit.INTx3=1; // PIEペリフェラルレベルのイネーブル設定 EPwm3_TZINTはINT2.3
    EPwm3Regs.TZSEL.bit.OSHT4=1; // TZ4発生時に1ショットでトリップ
    EPwm3Regs.TZSEL.bit.OSHT5=1; // TZ5発生時に1ショットでトリップ
    EPwm3Regs.TZSEL.bit.OSHT6=1; // TZ6発生時に1ショットでトリップ
    IER|=M_INT2;
    EDIS;
    }

    // INT2.3
    interrupt void EPWM3_TZINT_ISR(void) // EPWM-3
    {
    EPwm3Regs.TZCLR.bit.DCAEVT2=1; // DCAEVT2の状態をクリア(TRM P253)
    PieCtrlRegs.PIEACK.all|=PIEACK_GROUP2; // PIEグループ2のPIE→CPUへの通知を許可

    }

    • このトピックは amatsu1が5 年、 7 ヶ月前に変更しました。
    #6149 返信
    Yojiro
    Yojiro
    従業員

    amatsu1さん

    TZ2信号の入力設定において、GPAMUX2.bit.GPIO16 に00bを設定されているため、TZ2信号として認識されません。GPAMUX2.bit.GPIO16 = 3; として頂く必要があります。

    他のDigital Compare/Trip Zone/割込みの設定については、問題がないように見受けられます。

     

    GPIO設定をご確認いただけますでしょうか。

    ご確認のほど、よろしくお願いいたします。

    #6161 返信

    amatsu1
    参加者

    いつも大変お世話になっております。

    早急なご対応、誠にありがとうございます。
    GPAMUX2.bit.GPIO16 = 3; としたところ、TZ2割り込みに入るようになりました。
    ありがとうございました。

    ただし、以下の問題が解消されませんでした。

    ①TZ2がHighからLowになった時にPWM出力がHighのままで次の周期でPWM出力が丸々Lowとなる
    ②TZ2がHighからLowになった時にTZ2割り込みが毎回入らず、稀に入った時もHighからLowになってから7usの遅延の後、割り込みが入る

    以上、ご対応何卒宜しくお願い致します。

    • この返信は5 年、 6 ヶ月前に  amatsu1 さんが編集しました。
    #6165 返信

    amatsu1
    参加者

    いつも大変お世話になっております。
    その後こちらでも原因解析した結果、以下の通り状況が変わりましたので、ご連絡致します。

    ①TZ2がHighからLowになった時にPWM出力がHighのままで次の周期でPWM出力が丸々Lowとなる
    →自己解決致しました。
    (EPwm3Regs.TZCTL.bit.TZA=0b10;を加えたところ、TZ2がHighからLow時にPWMがHighからLowになりました。)

    ②TZ2がHighからLowになった時にTZ2割り込みが毎回入らず、稀に入った時もHighからLowになってから7usの遅延の後、割り込みが入る
    →TZ割り込みが入ったことを確認するための目印が違っていました。大変申し訳ございません。
    目印を直して、割り込みクリアレジスタを見直したところ、TZ2がHighからLowになった時に毎回TZ2割り込みが入るようになりました。しかし、以下の問題が残っております。

     ③割り込みが2回入ってしまう。
     ④割り込み発生までに遅延がある。

    なお、最新のコードは以下の通りとなります。

    TZ_init(){

    GpioCtrlRegs.GPAMUX2.bit.GPIO16=3;
    GpioCtrlRegs.GPADIR.bit.GPIO16=0;

    //TZ割り込み設定 ch3
    EPwm3Regs.DCTRIPSEL.bit.DCALCOMPSEL=0b0001;
    EPwm3Regs.TZDCSEL.bit.DCAEVT2=0b011;
    EPwm3Regs.TZCTL.bit.DCAEVT2=0b10; // EVT2発生時にEPwm3AをLowレベルとする。
    EPwm3Regs.TZCTL.bit.TZA=0b10; // EVT2発生時にEPwm3AをLowレベルとする。
    EPwm3Regs.TZEINT.bit.CBC=1;  // EVT2発生時にTZEINT割り込みをイネーブルにする。
    EPwm3Regs.TZSEL.bit.DCAEVT2=1; // EVT2のパルスバイパルストリップをEPwm3_TZINのイベントソースとしてイネーブルにする。
    EPwm3Regs.DCFCTL.bit.PULSESEL=0b01; // 周期の最初でマスク開始
    EPwm3Regs.DCFOFFSET=0; // マスクのオフセット期間は0
    EPwm3Regs.DCFWINDOW=15; // 600:10us = x:240ns(マスク期間)より、 x = 14.4 ≒ 15
    EPwm3Regs.TZCLR.bit.DCAEVT2=1;
    EPwm3Regs.TZCLR.bit.CBC=1; // DCAEVT2の状態をクリア(TRM P253)
    EPwm3Regs.DCACTL.bit.EVT2SRCSEL=0; // とりあえずフィルターは使用しない
    EPwm3Regs.TZFLG.bit.DCAEVT2=0;
    PieCtrlRegs.PIEIER2.bit.INTx3=1; // PIEペリフェラルレベルのイネーブル設定 EPwm3_TZINTはINT2.3
    }
    // INT2.3
    interrupt void EPWM3_TZINT_ISR(void) // EPWM-3
    {
    DINT; //グローバル割り込み禁止
    EALLOW; //書き込み保護解除
    EPwm3Regs.TZCLR.all=0x007F;
    PieCtrlRegs.PIEACK.all|=PIEACK_GROUP2; // PIEグループ2のPIE→CPUへの通知を許可
    //デバッグコード
    GpioDataRegs.GPACLEAR.bit.GPIO18=1;
    GpioDataRegs.GPASET.bit.GPIO18=1;
    //ここまでデバッグコード
    IER|=M_INT2;
    EDIS; //書き込み保護設定
    EINT; //グローバル割り込み許可
    }

    また、具体的な波形は添付の通りとなります。

    大変恐縮ではございますが、ご対応何卒宜しくお願い致します。

    • この返信は5 年、 6 ヶ月前に  amatsu1 さんが編集しました。
    #6194 返信
    Yojiro
    Yojiro
    従業員

    amatsu1さん

     ③割り込みが2回入ってしまう。

    こちらにつきまして、割込みフラグ(TZFLG)をTZCLRレジスタにてクリアしたタイミングにおいて、要因が継続している場合は、再度割り込みフラグがセットされ、割込みが発生いたします。
    そのため、Cycle by cycleをご利用の際に1PWM周期内に割込みを複数回発生させたくない場合は、最初のTZ割込みでは、割込みを禁止(TZEINTにて禁止)し、次のPWMのCTR=0のタイミングで許可(TZEINT[CBC]=1)とする必要があります。

    また、割込み処理の記述を拝見したところ、以下の処理が問題を起こす可能性がございますので、ご確認ください。

    1. グローバル割込みの禁止/許可設定
      割り込みハンドラ実行時は、グローバル割込みは禁止となっており、割込み処理から復帰(リターン)する際に、許可されます。明示的に関数内で許可を行うと、他の割込みが発生する可能性がありますので、DINTおよびEINTは削除いただけますでしょうか。
      また、IER=M_INT2;を実行頂いておりますが、IERは割込みの発生により変化いたしませんので、この処理は必要ありません。
    2. PIEACKレジスタアクセスについて
      PieCtrlRegs.PIEACKレジスタにつきましては、1の書き込みで対象ビット(割込み)要求のクリアと、その要因(PIEIFRx)が残っている場合は、CPUへ割り込み要求を行います。提示いただいたコードでは、”|=”にてPIEACKをクリアしていますが、”|=”では他のレベルの割込みに影響いたします。ORではなく、直接代入”=”をご利用ください。

     ④割り込み発生までに遅延がある。

    割込み発生までの遅延につきましては、通常処理において、割込み禁止が行われている可能性がございます。
    通常(メイン)ループ処理において、割込み禁止を設定されていないか、ご確認いただけますでしょうか。

    また、HRPWMをご利用の場合、SFO関数で使用しているランタイムライブラリの影響で、長期間の割込み禁止区間が発生する場合があります。(最大32サイクル≒540usec)
    SFO関数については、常に実行する必要はありませんが、いつ長期間の割込み禁止となるかわからない状態では、リアルタイム制御として設計が難しくなるものと思います。そこで、ラインタイムライブラリを修正することで、割込み禁止区間を回避する方法がございます。
    詳細につきましては、添付ファイルをご参照いただき、対応いただければと思います。

    ご確認のほど、よろしくお願いいたします。

    Attachments:
    1. SFO_interrupt.pdf
    #6204 返信

    amatsu1
    参加者

    いつも大変お世話になっております。

    >③割り込みが2回入ってしまう。
    ご教示いただいた内容を盛り込んだ結果、
    割り込みが1回となりました。
    ありがとうございました。

    > ④割り込み発生までに遅延がある。
    こちらにつきましては、どうしても対応しなくてはならない事項ではない為、
    一旦保留とさせていただき、時間を見つけて確認させていただきます。

    ご対応、誠にありがとうございました。
    以上、宜しくお願い致します。

6件の投稿を表示中 - 1 - 6件目 (全6件中)