EPWMモジュールの機能
- EpwmAepwmB出力は次のように機能します。
- シングルエッジ操作
- デュアルエッジ対称操作
- デュアルエッジ非対称操作
- デッドタイムを設定できます
- TZイベントを構成し、HI出力とLO出力の両方の論理状態を設定できます。
- ADCの割り込みイベントまたはSOCイベントを構成できます。
ePWMモジュールの構成と接続先のメインブロックに近づきましょう。
図からわかるように、ePWMモジュールには多くのブロックがありません。したがって、各モジュールが何を担当しているかを検討し、信号から始めることは理にかなっています。
- EPWMxAおよびEPWMxB信号は、おそらく最も明白な出力信号です。通常の論理状態は、出力アクションの構成方法に応じて、HIまたはLOのいずれかになります。
- TZ1 — TZ6 — . , , , . , EPWMxA EPWMxB . , , - , , . . , .
- EPWMxSYNCI EPWMxSYNCO — , , .
- EPWMxSOCAおよびEPWMxSOCB信号-ここでは、名前からすべてが明確になっています。これらのイベントは、ADCのSOCイベントを設定できます。
- EPWMxTZINTおよびEPWMxINT信号-ここでは、TZおよびPWM自体に関連するイベントでの割り込みイベント。たとえば、PWM期間で割り込みを生成します。
次に、
タイムベース(TB)モジュールに移りましょう。モジュールは、各ePWMモジュールのイベント時間を担当します。このモジュールのすべての設定に入るわけではありません。カウンターの操作には3つのモードがあるという事実に注意を払うだけで十分だと思います。
- アップダウンカウントモード
- アップカウントモード
- ダウンカウントモード
また、TBCLKSYNC
カウンター比較(CC)ビットモジュールを設定することによるタイマー同期設定もあります。これにより、デューティサイクルを設定するだけです。
Action-Qualifier(AQ)モジュール-それを介して、イベントの状態を構成できます。また、出力の場合、次のアクションを構成できます。
- HI状態に設定
- LO状態に設定
- 状態反転を実行します
- 何もしません
デッドバンドサブモジュール(DB)モジュール-このモジュールは、PWMチャネルのデッドバンドを設定するために使用できます。トランジスタキーがすぐに切り替わらないことは誰にとっても秘密ではありません。上半分のブリッジキーが閉じる時間がなく、下半分のブリッジキーがすでに開いている状況を回避するために、HI状態への切り替えとLO状態への早期切り替えの遅延を設定します。
トリップゾーンサブモジュール(TZ)モジュール-前述のように、このモジュールは緊急状態の処理に関連付けられています。ここでは、4つのアクションから1つを選択できます。
- HI状態に設定
- LO状態に設定
- ハイインピーダンス状態を設定する
- 何もしません
TZモジュールのアクションをトリガーするイベントは、ソフトウェアとハードウェアの両方でトリガーできます。さらに、割り込み呼び出しが提供されます。
それでは、言葉から練習に移りましょう。
まず、代替epwm関数用にGPIOを構成する必要があります
EALLOW;
// pull-up
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0x000;
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0x000;
// GPIO EPWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0x001;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0x001;
EDIS;
次に、GPIOをすでに構成している場合は、さまざまな設定に進むことができます。PWM動作を構成するには、何を取得するかを決定する必要があります。TBCLK周波数から始めましょう。これは次の式で決定されます。
ここでは、CLKDIVがデフォルトで1であり、HSPCLKDIVではすべてが異なり、デフォルトでは2であることに注意する必要があります。これは、人々が忘れてしまうことがあるため、注意する必要があります。プログラムをRAM(多くの場合、それぞれHSPCLKDIV = 1)にロードする場合、この問題はすぐにはわかりません。
TBCLKのクロック周波数を決定しました。しかし、カウンターがどのように機能するかを選択する必要があります。不況によって、増加することによって、そしておそらくこのように、そしてそれのために、あなたは適切なレジスターを構成する必要があります、例えば:
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
将来的には、マクロに誰もが恐れることがないように、マクロがどこから来たのかを判断します。これらの定義は、DSP2833x_EPwm_defines.hというファイルで定義されています。
次に、特定のTBCTR値に到達したときにGPIOがどのように反応するかを決定する必要があります。十分なオプションがあります。それらを以下の表に示します。
次に、ポートAとBにどのような動作をさせるか、つまり、それらを相互に接続するか、独立して動作できるようにするかを決定する必要があります。ポートAをマスターにしたい場合は、たとえば、ポートAのアクションを書き留めます(カウントアップの場合)。
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;
2番目のポートを独立させたい場合は、次を追加します。
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;
設定の詳細については、上の画像を参照して1つ追加する必要があります。表に示されているよりも少し多くのAQCTLAレジスタがあります。これによって画像が大きく変わることはありませんが、カウンタが目的の値に達した場合、たとえば、トップまたはカウントダウン。ビットについてのより簡単な説明は、システムの.hファイルからの切り取りにあります。
struct AQCTL_BITS { // bits description
Uint16 ZRO:2; // 1:0 Action Counter = Zero
Uint16 PRD:2; // 3:2 Action Counter = Period
Uint16 CAU:2; // 5:4 Action Counter = Compare A up
Uint16 CAD:2; // 7:6 Action Counter = Compare A down
Uint16 CBU:2; // 9:8 Action Counter = Compare B up
Uint16 CBD:2; // 11:10 Action Counter = Compare B down
Uint16 rsvd:4; // 15:12 reserved
};
2つのePWMポートが独立して動作していて、デッドタイムを設定する場合は、レジスタを目的の状態に設定する必要があります。次に例を示します。
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
周辺の説明が決まったので、具体的な例に進みます。
カウントモードでのePWMの構成
これはデッドタイムがなく、ポートAとポートBが独立して動作する例です。Aがアクティブな場合、Bは非アクティブです。
EPwm1Regs.TBPRD = 150000 / 5; // . 150 / 5000
// 50%
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2;
EPwm1Regs.TBPHS.half.TBPHS = 0;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLB.bit.PRD = AQ_SET;
EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;
オシログラムで、得られた結果を確認できます。
これで、デッドタイムを追加してみることができます。これには、次のものを追加します。
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
EPwm1Regs.DBCTL.all = BP_ENABLE + POLSEL_ACTIVE_HI_CMP; // db
EPwm1Regs.DBFED = 300; // = 150 * 2 = 300
EPwm1Regs.DBRED = 300;
デッドタイムは、次の式に従って、頻度と同じ方法でカウントされます。
そして今、私たちは思い通りのデッドタイムを得ました。
ポートAとポートBを解く必要がある場合はどうなりますか?これも行われます。ここではすべてが簡単です。最初の例に戻って最後の4行を削除し、各デューティサイクルを次のレジスタに書き込みます。
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2; // 50%
EPwm1Regs.CMPB = EPwm1Regs.TBPRD / 3; // 33%
今、私たちはそのような絵を持っています。各チャネルのデューティサイクルを個別に設定できます。
減衰モードの場合、すべてがほぼ同じです。アップダウンモードのカウントダウンとは違いがあります。ここで、シム周波数は次の式を使用して計算されます。
デッドタイムについても同じことが言えます。
おそらく、考慮されなかった唯一の重要なことはTZ設定です。では、このモジュールについてもう少し詳しく見ていきましょう。
プログラムでアラームイベントをトリガーするには、次のレジスタを設定するだけで十分です。
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
PWMアラームは、次のコマンドを使用して呼び出してリセットできます。
//
EALLOW;
EPwm1Regs.TZFRC.bit.OST = 0x001;
EDIS;
//
EALLOW;
EPwm1Regs.TZCLR.bit.OST = 0x0001;
EDIS;
ハードウェアでTZ信号を呼び出したい場合は、すべてがさらに簡単になります。TZSELレジスタを使用して、必要なTZを設定しますが、これに加えて、GPIOをTZに構成する必要があります。
結論
誰かがこの記事を面白いと思ったら、私は多かれ少なかれ加速された方法でさらにいくつかの記事を書くことができます。私はcanモジュールを検討する予定です。dmaをしたいと思います。多分私は彼らのライブラリを使ってtiからIQMathに関する小さな記事を書くでしょう。