Complementary Waveform Generator(CWG)は、PWM波形のハーフブリッジ、フルブリッジ、およびステアリングを生成します。以前のECCP機能との下位互換性があります。
CWGには次の機能があります。
CWGモジュールは、CWGxCON0レジスタのMODEで指定されているように、6つの異なるモードで動作できます。
回路障害やフィードバックイベントの到着が遅すぎるか、まったく到着しない可能性を防ぐ必要がある場合があります。この場合、障害状態によって損傷が発生する前に、アクティブドライブを終了する必要があります。したがって、すべての出力モードは自動シャットダウンをサポートします。これについては、28.10「自動シャットダウン」で説明しています。
ハーフブリッジモードでは、図28-9に示すように、2つの出力信号が入力の真のバージョンと反転バージョンとして生成されます。さまざまな電源アプリケーションでのシュートスルー電流を防ぐために、2つの出力の間に非オーバーラップ(デッドバンド)時間が挿入されます。デッドバンド制御については、セクション28.5「デッドバンド制御」で説明しています。
未使用の出力CWGxCとCWGxDは同様の信号を駆動し、極性はそれぞれCWGxCON1レジスタのPOLCビットとPOLDビットによって独立して制御されます。
図28-1:簡略化されたCWGブロック図(ハーフブリッジモード)
プッシュプルモードでは、図28-2に示すように、入力のコピーを交互に2つの出力信号が生成されます。この交代により、一部のトランスベースの電源設計を駆動するために必要なプッシュプル効果が生まれます。
プッシュプルシーケンサーは、EN = 0の場合、または自動シャットダウンイベントが発生した場合にリセットされます。シーケンサーは最初の入力パルスによってクロックされ、最初の出力はCWGxAに表示されます。
未使用の出力CWGxCおよびCWGxDは、それぞれCWGxAおよびCWGxBのコピーを駆動しますが、極性はそれぞれCWGxCON1レジスタのPOLCビットおよびPOLDビットによって制御されます。
図28-2:簡略化されたCWGブロック図(プッシュプルモード)
フォワードおよびリバースフルブリッジモードでは、3つの出力が静的な値を駆動し、4番目の出力は入力データ信号によって変調されます。フォワードフルブリッジモードでは、CWGxAはアクティブ状態に駆動され、CWGxBとCWGxCは非アクティブ状態に駆動され、CWGxDは入力信号によって変調されます。リバースフルブリッジモードでは、CWGxCはアクティブ状態に駆動され、CWGxAとCWGxDは非アクティブ状態に駆動され、CWGxBは入力信号によって変調されます。フルブリッジモードでは、順方向から逆方向、またはその逆に切り替わるときにデッドバンド期間が使用されます。このデッドバンド制御については、セクション28.5「デッドバンド制御」で説明し、セクション28.6「立ち上がりエッジとリバースデッドバンド」およびセクション28.7「立ち下がりエッジとフォワードデッドバンド」で詳細を説明します。
モード選択は、CWGモジュールを無効にすることなく、MODE <2:1>を静的に保ちながら、CWGxCON0のMODE <0>ビットを切り替えることにより、順方向と逆方向を切り替えることができます。
図28-3:簡略化されたCWGブロック図(順方向および逆方向のフルブリッジモード)
ステアリングモードでは、データ入力を4つのCWG出力ピンのいずれかまたはすべてにステアリングできます。同期ステアリングモードでは、ステアリング選択レジスタへの変更は、次に立ち上がる入力で有効になります。
非同期モードでは、ステアリングは次の命令サイクルで有効になります。詳細については、セクション28.9「CWGステアリングモード」を参照してください。
図28-4:
簡略化されたCWGブロック図(出力ステアリングモード)
CWG_dataC CWG_dataD
CWGモジュールでは、次のクロックソースを選択できます。
クロックソースは、CWGxCLKCONレジスタのCSビットを使用して選択されます。
CWGは、表28-1の入力ソースから出力波形を生成します。
表28-1:選択可能な入力ソース
番号 | 信号源 | 信号名 | 番号 | 信号源 | 信号名 | 番号 | 信号源 | 信号名 | ||
---|---|---|---|---|---|---|---|---|---|---|
0000 | CWG pin | PPS selection | 0100 | CCP2 | CCP2_out | 1000 | CLC4 | LC4_out | ||
0001 | Comparator C1 | C1_OUT_sync | 0101 | CLC1 | LC1_out | 1001 | PWM3 | PWM3_out | ||
0010 | Comparator C2 | C2_OUT_sync | 0110 | CLC2 | LC2_out | 1010 | PWM4 | PWM4_out | ||
0011 | CCP1 | CCP1_out | 0111 | CLC3 | LC3_out |
入力ソースは、CWGxISMレジスタを使用して選択されます。
各CWG出力ピンには個別の出力イネーブル制御があります。出力イネーブルは、Gx1OEx <3:0>ビットで選択されます。出力イネーブル制御がクリアされると、モジュールはピンに対する制御をアサートしません。出力イネーブルが設定されている場合、ポート優先順位の選択に従って、オーバーライド値またはアクティブPWM波形がピンに適用されます。出力ピンのイネーブルは、CWGxCON0レジスタのモジュールイネーブルビットENに依存します。ENがクリアされると、CWG出力が有効になり、CWGドライブレベルは効果がありません。
各CWG出力の極性は独立して選択できます。出力極性ビットがセットされると、対応する出力がアクティブハイになります。出力極性ビットをクリアすると、対応する出力がアクティブローとして設定されます。ただし、極性はオーバーライドレベルに影響しません。出力極性は、CWGxCON1のPOLxビットで選択されます。自動シャットダウンとステアリングのオプションは、極性の影響を受けません。
図28-5:CWG出力ブロック図
注:D-チャネルを示しましたが、AーC も同様です。
注:STRxは、出力ステアリングモード以外のすべてのモードで1に保持されます。
デッドバンド制御は、PWMスイッチのシュートスルー電流を防ぐために重複しないPWM信号を提供します。デッドバンド動作は、ハーフブリッジモードとフルブリッジモードで使用されます。CWGには、2つの6ビットデッドバンドカウンタが含まれています。1つは、ハーフブリッジモードの入力ソース管理の立ち上がりエッジまたは逆デッドバンドフルブリッジモードに使用されます。もう1つは、ハーフブリッジモードの入力ソース管理の立ち下がりエッジまたはフルブリッジモードのフォワードデッドバンドに使用されます。
デッドバンドは、ゼロから立ち上がりまたは立ち下がりのデッドバンドカウンタレジスタの値までのCWGクロック周期をカウントすることによって計時されます。それぞれCWGxDBRおよびCWGxDBFレジスタを参照してください。
ハーフブリッジモードでは、デッドバンドカウンタは、通常の出力の立ち下がりエッジと反転出力の立ち上がりエッジの間の遅延を決定します。これは図28-9で見ることができます。
図28-9:CWGハーフブリッジモードの動作
注:CWGx_rising_src = CCP1_out、CWGx_falling_src = 〜CCP1_out
フルブリッジモードでは、方向が変わるときにデッドバンドカウンタが使用されます。CWGxCON0レジスタのMODE <0>ビットは、CWGの実行中にセットまたはクリアできるため、順方向モードから逆方向モードに変更できます。CWGxAおよびCWGxC信号は、方向変更後の最初の立ち上がり入力エッジですぐに変更されますが、変調信号(変更の方向に応じて、CWGxBまたはCWGxD)では、デッドバンドカウンターによって指定される遅延が発生します。これを図28-3に示します。
CWGxDBRは、CWGxAのリーディングエッジ(ハーフブリッジモード)またはCWGxBのリーディングエッジ(フルブリッジモード)での立ち上がりエッジのデッドバンド時間を制御します。CWGxDBR値はダブルバッファリングされます。EN = 0の場合、CWGxDBRレジスタはCWGxDBRが書き込まれるとすぐにロードされます。EN = 1の場合、ソフトウェアはCWGxCON0レジスタのLDビットを設定する必要があり、バッファはCWG入力信号の次の立ち下がりエッジでロードされます。カウントが完了するのに十分な時間入力ソース信号が存在しない場合、それぞれの出力に出力は表示されません。
CWGxDBFは、CWGxBのリーディングエッジ(ハーフブリッジモード)またはCWGxDのリーディングエッジ(フルブリッジモード)でのデッドバンド時間を制御します。CWGxDBF値はダブルバッファリングされます。EN = 0の場合、CWGxDBFレジスタはCWGxDBFが書き込まれるとすぐにロードされます。EN = 1の場合、ソフトウェアはCWGxCON0レジスタのLDビットを設定する必要があり、バッファはCWG入力信号の次の立ち下がりエッジでロードされます。カウントが完了するのに十分な時間入力ソース信号が存在しない場合、それぞれの出力に出力は表示されません。
例については、図28.6および図28-7を参照してください。
入力ソースの立ち上がりエッジと立ち下がりエッジがCWGクロックに非同期である場合、デッドバンド時間遅延に不確実性が生じます。最大の不確かさは、1CWGクロック周期に等しくなります。詳細については、式28-1を参照してください。
式28-1:デッドバンドの不確実性
TDEADBAND_UNCERTAINTY | = | 1 |
Fcwg_clock |
例: FCWG_CLOCK = 16 MHz
TDEADBAND_UNCERTAINTY | = | 1 |
Fcwg_clock | ||
= | 1 | |
16MHz | ||
= | 62.5ns |
図28-8:PWM方向の変更の例
注1:WGPOL {ABCD} = 0
2:方向ビットMODE <0>(レジスタ28-1)は、PWMサイクル中いつでも書き込むことができ、
次に上昇するCWGx_data。
3:方向を変更すると、CWGxAとCWGxCはCWGx_dataの上昇時に切り替わります。変調されたCWGxBとCWGxDは
示されているデッドバンド期間中は非アクティブのままです。デッドバンドは、方向転換後の最初のパルスにのみ影響します。
D
ステアリングモード(MODE = 00x)では、CWGにより、CWGxxピンの任意の組み合わせを変調信号にすることができます。同じ信号を複数のピンで同時に使用することも、固定値の出力を表示することもできます。
CWGxOCON0のそれぞれのSTRxビットが「0」の場合、対応するピンは定義されたレベルに保持されます。CWGxOCON0のそれぞれのSTRxビットが「1」の場合、ピンは入力データ信号によって駆動されます。ユーザーは、入力データ信号を1つ、2つ、3つ、または4つすべての出力ピンに割り当てることができます。
CWGxCON1レジスタのPOLxビットは、STRx = 1の場合にのみ信号の極性を制御します。
CWGの自動シャットダウン動作は、セクション28.10「自動シャットダウン」で説明されているステアリングモードにも適用されます。自動シャットダウンイベントは、STRx = 1のピンにのみ影響します。
MODEビットを変更すると、同期と非同期の2つのステアリングモードが可能になります。
MODE = 000の場合、ステアリングイベントは非同期であり、STRxに書き込む命令の最後に(つまり、すぐに)発生します。この場合、出力ピンの出力信号は不完全な波形である可能性があります。これは、ピンから信号をすぐに削除するのに役立ちます。
MODE = 001の場合、ステアリングの更新は同期しており、入力データ信号の次の立ち上がりエッジの開始時に発生します。この場合、出力のオン/オフを操作すると、常に完全な波形が生成されます。
図28-10と図28-11は、それぞれ非同期ステアリングと同期ステアリングのタイミングを示しています。
図28-10:指示終了時のステアリングイベントの例(MODE <2:0> = 000)
図28-11:指示開始時のステアリングイベントの例(MODE <2:0> = 001)
自動シャットダウンは、回路の安全なシャットダウンを可能にする特定のオーバーライドでCWG出力レベルを即座にオーバーライドする方法です。シャットダウン状態は、自動的にクリアするか、ソフトウェアによってクリアされるまで保持することができます。自動シャットダウン回路を図28-12に示します。
シャットダウン状態は、次の2つの方法のいずれかで開始できます。
CWGxAS0レジスタのSHUTDOWNビットをセットすると、CWGは強制的にシャットダウン状態になります。
自動再起動が無効になっている場合、SHUTDOWNビットが設定されている限りシャットダウン状態が持続します。
自動再起動が有効になっている場合、SHUTDOWNビットは自動的にクリアされ、次の立ち上がりエッジイベントで動作を再開します。
外部シャットダウン入力は、障害状態が発生した場合にCWG動作を安全に一時停止するための最速の方法を提供します。選択したシャットダウン入力のいずれかがアクティブになると、CWG出力はソフトウェアの遅延なしに選択したオーバーライドレベルにすぐに移行します。シャットダウン状態を引き起こすために、いくつかの入力ソースを選択できます。すべての入力ソースはアクティブローです。ソースは次のとおりです。
シャットダウン入力は、CWGxAS1レジスタ(レジスタ28-6)を使用して選択されます。
CWGモジュールは、システムクロックとは独立して動作し、選択したクロックと入力ソースがアクティブのままである限り、スリープ中も実行を継続します。
HFINTOSCは、次のすべての条件が満たされた場合、スリープ中にアクティブのままになります。
選択したシステムクロックソースに関係なく。
つまり、HFINTOSCがシステムクロックとCWGクロックソースとして同時に選択されている場合、CWGが有効で入力ソースがアクティブな場合、CPUはスリープ中にアイドル状態になりますが、HFINTOSCはアクティブのままでCWG動作を継続します。これは、スリープモード電流に直接影響します。
注:シャットダウン入力はレベルセンシティブであり、エッジセンシティブではありません。シャットダウン入力レベルが持続する限り、自動シャットダウンを無効にする場合を除いて、シャットダウン状態をクリアすることはできません。
図28-12:CWGシャットダウンブロック図
次の手順は、CWGを適切に構成する方法を示しています。
シャットダウン入力が真である間、出力ピンに駆動されるレベルは、CWGxAS0レジスタのLSBDビットとLSACビットによって制御されます。LSBD <1:0>はCWGxBおよびDオーバーライドレベルを制御し、LSAC <1:0>はCWGxAおよびCオーバーライドレベルを制御します。制御ビットの論理レベルは、シャットダウン状態の出力論理ドライブレベルに対応します。極性制御はオーバーライドレベルに影響しません。
自動シャットダウンイベントが発生した後、動作を再開するには2つの方法があります。
再起動方法は、CWGxAS0レジスタのRENビットで選択されます。ソフトウェア制御および自動再起動の波形を図28-13および図28-14に示します。
CWGxAS0レジスタのRENビットがクリアされると、ソフトウェアによる自動シャットダウンイベントの後にCWGを再起動する必要があります。シャットダウン状態をクリアするには、選択したすべてのシャットダウン入力をローにする必要があります。そうでない場合、SHUTDOWNビットはセットされたままになります。オーバーライドは、SHUTDOWNビットがクリアされた後の最初の立ち上がりエッジイベントまで有効です。その後、CWGは動作を再開します。
CWGxAS0レジスタのRENビットがセットされると、CWGは自動シャットダウン状態から自動的に再起動します。すべてのシャットダウンソースがローになると、SHUTDOWNビットは自動的にクリアされます。オーバーライドは、SHUTDOWNビットがクリアされた後の最初の立ち上がりエッジイベントまで有効です。その後、CWGは動作を再開します。
図28-13:シャットダウン機能、自動再起動が無効(REN = 0、LSAC = 01、LSBD = 01)
図28-14:
シャットダウン機能、自動再起動が有効(REN = 1、LSAC = 01、LSBD = 01)
レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
CWG1AS0 | SHUTDOWN | REN | LSBD<1:0> | LSAC<1:0> | - | - | ||
CWG1AS1 | - | TMR6AS | TMR4AS | TMR2AS | - | C2AS | C1AS | INAS |
CWG1CLKCON | — | — | — | — | — | — | — | CS |
CWG1CON0 | EN | LD | - | — | — | MODE<2:0> | ||
CWG1CON1 | — | — | IN | — | POLD | POLC | POLB | POLA |
CWG1DBF | — | — | DBF<5:0> | |||||
CWG1DBR | — | — | DBR<5:0> | |||||
CWG1ISM | - | — | — | — | IS<2:0> | |||
CWG1OCON0 | OVRD | OVRC | OVRB | OVRA | STRD | STRC | STRB | STRA |
レジスタ | BIT | 名 | 説明 | 1 | 0 | |||||
---|---|---|---|---|---|---|---|---|---|---|
CWG1AS0 | 7 | SHUTDOWN | Auto-Shutdown Event Status bit | 有効 | 無効 | |||||
6 | REN | Auto-Restart Enable bit | 有効 | 無効 | ||||||
5 | LSBD1 | CWGxB/D Auto-Shutdown State Control 00=無効 01=オープン 10=Logic 0 11=Logic 1 |
||||||||
4 | LSBD0 | |||||||||
3 | LSAC1 | CWGxA/C Auto-Shutdown State Control 00=無効 01=オープン 10=Logic 0 11=Logic 1 |
||||||||
2 | LSAC0 | |||||||||
CWG1AS1 | 6 | TMR6AS | TMR6 Postscale Output bit | 有効 | 無効 | |||||
5 | TMR4AS | TMR4 Postscale Output bit | 有効 | 無効 | ||||||
4 | TMR2AS | TMR2 Postscale Output bit | 有効 | 無効 | ||||||
2 | C2AS | Comparator C1 Output bit | 有効 | 無効 | ||||||
1 | C1AS | Comparator C1 Output bit | 有効 | 無効 | ||||||
0 | INAS | CWGxIN input pin shut-down | 有効 | 無効 | ||||||
CWG1CLKCON | 0 | CS | CWG Clock選択ビット | 16MHz | Fosc | |||||
CWG1CON0 | 7 | EN | CWGイネーブルビット | 有効 | 無効 | |||||
6 | LD | CWGx Load Buffer bits | 準備完了 | 未 | ||||||
2 | MODE2 |
|
||||||||
1 | MODE1 | |||||||||
0 | MODE0 | |||||||||
CWG1CON1 | 5 | IN | CWG 入力 (Read only) | 1 | 0 | |||||
3 | POLD | 出力極性 | 反転 | 通常 | ||||||
2 | POLC | 出力極性 | 反転 | 通常 | ||||||
1 | POLB | 出力極性 | 反転 | 通常 | ||||||
0 | POLA | 出力極性 | 反転 | 通常 | ||||||
CWG1DBF | <5:0> | DBF | デッドバンド立ち下がりビット | |||||||
CWG1DBR | <5:0> | DBR | デッドバンド立ち上がりビット | |||||||
CWG1ISM | <2:0> | CSEL | CWG入力選択 下表参照 | |||||||
CWG1OCON0 | 7 | OVRD | Steering Data D bit | 1 | 0 | |||||
6 | OVRC | Steering Data C bit | 1 | 0 | ||||||
5 | OVRB | Steering Data B bit | 1 | 0 | ||||||
4 | OVRA | Steering Data A bit | 1 | 0 | ||||||
3 | STRD | Steering Enable bit | data | OVRD | ||||||
2 | STRC | Steering Enable bit | data | OVRC | ||||||
1 | STRB | Steering Enable bit | data | OVRB | ||||||
0 | STRA | Steering Enable bit | data | OVRA |
IS<2:0> | 信号源 | 信号名 | IS<2:0> | 信号源 | 信号名 | IS<2:0> | 信号源 | 信号名 | ||
---|---|---|---|---|---|---|---|---|---|---|
0000 | CWG pin | PPS selection | 0100 | CCP2 | CCP2_out | 1000 | CLC4 | LC4_out | ||
0001 | Comparator C1 | C1_OUT_sync | 0101 | CLC1 | LC1_out | 1001 | PWM3 | PWM3_out | ||
0010 | Comparator C2 | C2_OUT_sync | 0110 | CLC2 | LC2_out | 1010 | PWM4 | PWM4_out | ||
0011 | CCP1 | CCP1_out | 0111 | CLC3 | LC3_out |
プログラム例を示します。
赤外線送信が終了するまで、赤外線センサーのSpace信号(赤外線を送っていない時間)を CWG1で計測します。Spaceが 50msを超えると送信が終了したと判断し、最後の4バイト分だけを取得し、Keyコードと比較し該当のLEDを点灯させます。
/************************************************* NECタイプの赤外線リモコン受信 Device : PIC16F1619 on Curiosity XC8 Version : 2.20 ***************************************************/ #include <xc.h> #include <stdint.h> #define _XTAL_FREQ 4000000 // CONFIG #pragma config FOSC = INTOSC, PWRTE = OFF, MCLRE = ON, CP = OFF #pragma config BOREN = ON, CLKOUTEN = OFF, IESO = ON, FCMEN = ON #pragma config WRT = OFF, PPS1WAY = ON, ZCD = OFF, PLLEN = OFF #pragma config STVREN = ON, BORV = LO, LPBOR = OFF, LVP = ON #pragma config WDTCPS = WDTCPS1F, WDTE = OFF, WDTCWS = WDTCWSSW, WDTCCS = SWC /********************************************************* Main application *********************************************************/ void main(void) { uint16_t ircode = 0; OSCCON = 0b01101000; // PLL disabled; 4MHz_HF; FOSC; LATA = 0; // LED 消灯 LATC = 0; // TRISA = 0b11011001; // LED接続Pinは出力 TRISC = 0b11011111; // ANSC7 = 0; // センサーPinはデジタル入力 CWG1CON0 = 0x08; // SIG極性 low; Prescaler 1:1; CWG1CON1 = 0x43; // Repeat; High and Low: CWG1GO = Off CWG1STAT = 0x00; // CWG1CLK = 0x01; // Clock FOSC/4; CWG1WIN = 0x00; // WIN in CWGWINx CWG1SIG = 0x00; // SEL in CWGxSIG CWG1PR = 50000; // CWG1SIGPPS = 0x17; // RC7 -> CWG1SIG CWG1CON0bits.EN = 1; // システム ON while (1) { CWG1PRAIF = 0; CWG1IF = 0; CWG1CON1bits.CWG1GO = 1; // データ収集開始 while(1) // ビット毎の繰り返し { if(CWG1PRAIF){ // Space終了なら CWG1PRAIF = 0; // Space長さを検査し ircode <<= 1; // 短ければ「0」 if(CWG1CPR > 1000)ircode += 1; // 長ければ「1」 } if(CWG1IF){ // 50mS以上継続なら CWG1IF = 0; // データ終了 break; } } CWG1CON1bits.CWG1GO = 0; // データ収集終了 switch (ircode){ // 受信コードによりLED制御 case 0xC084: LATA5 ^= 1; break; // Key 1 LED4 反転 case 0xC044: LATA1 ^= 1; break; // Key 2 LED5 反転 case 0xC0C4: LATA2 ^= 1; break; // Key 3 LED6 反転 case 0xC024: LATC5 ^= 1; break; // Key 4 LED7 反転 default: LATA = 0; LATC = 0; break; // 他のKey 全消灯 } } } /** End of File */