PIC16F1619の基本動作から応用プログラムまでを学びます。

ホーム
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
    
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
相補波形発生器(CWG)モジュール
2020-12-02 未完
目次

CWGの特徴

Complementary Waveform Generator(CWG)は、PWM波形のハーフブリッジ、フルブリッジ、およびステアリングを生成します。以前のECCP機能との下位互換性があります。

CWGには次の機能があります。

1 基本的な動作

CWGモジュールは、CWGxCON0レジスタのMODEで指定されているように、6つの異なるモードで動作できます。

回路障害やフィードバックイベントの到着が遅すぎるか、まったく到着しない可能性を防ぐ必要がある場合があります。この場合、障害状態によって損傷が発生する前に、アクティブドライブを終了する必要があります。したがって、すべての出力モードは自動シャットダウンをサポートします。これについては、28.10「自動シャットダウン」で説明しています。

1.1 ハーフブリッジモード

ハーフブリッジモードでは、図28-9に示すように、2つの出力信号が入力の真のバージョンと反転バージョンとして生成されます。さまざまな電源アプリケーションでのシュートスルー電流を防ぐために、2つの出力の間に非オーバーラップ(デッドバンド)時間が挿入されます。デッドバンド制御については、セクション28.5「デッドバンド制御」で説明しています。

未使用の出力CWGxCとCWGxDは同様の信号を駆動し、極性はそれぞれCWGxCON1レジスタのPOLCビットとPOLDビットによって独立して制御されます。

図28-1:簡略化されたCWGブロック図(ハーフブリッジモード)

1.2 プッシュプルモード

プッシュプルモードでは、図28-2に示すように、入力のコピーを交互に2つの出力信号が生成されます。この交代により、一部のトランスベースの電源設計を駆動するために必要なプッシュプル効果が生まれます。

プッシュプルシーケンサーは、EN = 0の場合、または自動シャットダウンイベントが発生した場合にリセットされます。シーケンサーは最初の入力パルスによってクロックされ、最初の出力はCWGxAに表示されます。

未使用の出力CWGxCおよびCWGxDは、それぞれCWGxAおよびCWGxBのコピーを駆動しますが、極性はそれぞれCWGxCON1レジスタのPOLCビットおよびPOLDビットによって制御されます。

図28-2:簡略化されたCWGブロック図(プッシュプルモード)

1.3 フルブリッジモード

フォワードおよびリバースフルブリッジモードでは、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ブロック図(順方向および逆方向のフルブリッジモード)

1.4 ステアリングモード

ステアリングモードでは、データ入力を4つのCWG出力ピンのいずれかまたはすべてにステアリングできます。同期ステアリングモードでは、ステアリング選択レジスタへの変更は、次に立ち上がる入力で有効になります。

非同期モードでは、ステアリングは次の命令サイクルで有効になります。詳細については、セクション28.9「CWGステアリングモード」を参照してください。

図28-4:

簡略化されたCWGブロック図(出力ステアリングモード)

CWG_dataC CWG_dataD

2 クロックソース

CWGモジュールでは、次のクロックソースを選択できます。

クロックソースは、CWGxCLKCONレジスタのCSビットを使用して選択されます。

3 選択可能な入力ソース

CWGは、表28-1の入力ソースから出力波形を生成します。

表28-1:選択可能な入力ソース

番号信号源信号名 番号信号源信号名 番号信号源信号名
0000CWG pinPPS selection 0100CCP2CCP2_out 1000CLC4LC4_out
0001Comparator C1C1_OUT_sync 0101CLC1LC1_out 1001PWM3PWM3_out
0010Comparator C2C2_OUT_sync 0110CLC2LC2_out 1010PWM4PWM4_out
0011CCP1CCP1_out 0111CLC3LC3_out

入力ソースは、CWGxISMレジスタを使用して選択されます。

4 出力制御

4.1 出力可能

各CWG出力ピンには個別の出力イネーブル制御があります。出力イネーブルは、Gx1OEx <3:0>ビットで選択されます。出力イネーブル制御がクリアされると、モジュールはピンに対する制御をアサートしません。出力イネーブルが設定されている場合、ポート優先順位の選択に従って、オーバーライド値またはアクティブPWM波形がピンに適用されます。出力ピンのイネーブルは、CWGxCON0レジスタのモジュールイネーブルビットENに依存します。ENがクリアされると、CWG出力が有効になり、CWGドライブレベルは効果がありません。

4.2 極性制御

各CWG出力の極性は独立して選択できます。出力極性ビットがセットされると、対応する出力がアクティブハイになります。出力極性ビットをクリアすると、対応する出力がアクティブローとして設定されます。ただし、極性はオーバーライドレベルに影響しません。出力極性は、CWGxCON1のPOLxビットで選択されます。自動シャットダウンとステアリングのオプションは、極性の影響を受けません。

図28-5:CWG出力ブロック図

注:D-チャネルを示しましたが、AーC も同様です。

注:STRxは、出力ステアリングモード以外のすべてのモードで1に保持されます。

5 デッドバンド制御

デッドバンド制御は、PWMスイッチのシュートスルー電流を防ぐために重複しないPWM信号を提供します。デッドバンド動作は、ハーフブリッジモードとフルブリッジモードで使用されます。CWGには、2つの6ビットデッドバンドカウンタが含まれています。1つは、ハーフブリッジモードの入力ソース管理の立ち上がりエッジまたは逆デッドバンドフルブリッジモードに使用されます。もう1つは、ハーフブリッジモードの入力ソース管理の立ち下がりエッジまたはフルブリッジモードのフォワードデッドバンドに使用されます。

デッドバンドは、ゼロから立ち上がりまたは立ち下がりのデッドバンドカウンタレジスタの値までのCWGクロック周期をカウントすることによって計時されます。それぞれCWGxDBRおよびCWGxDBFレジスタを参照してください。

5.1 ハーフブリッジモードでのデッドバンド機能

ハーフブリッジモードでは、デッドバンドカウンタは、通常の出力の立ち下がりエッジと反転出力の立ち上がりエッジの間の遅延を決定します。これは図28-9で見ることができます。

図28-9:CWGハーフブリッジモードの動作

注:CWGx_rising_src = CCP1_out、CWGx_falling_src = 〜CCP1_out

5.2 フルブリッジモードでのデッドバンド機能

フルブリッジモードでは、方向が変わるときにデッドバンドカウンタが使用されます。CWGxCON0レジスタのMODE <0>ビットは、CWGの実行中にセットまたはクリアできるため、順方向モードから逆方向モードに変更できます。CWGxAおよびCWGxC信号は、方向変更後の最初の立ち上がり入力エッジですぐに変更されますが、変調信号(変更の方向に応じて、CWGxBまたはCWGxD)では、デッドバンドカウンターによって指定される遅延が発生します。これを図28-3に示します。

6 立ち上がりエッジとリバースデッドバンド

CWGxDBRは、CWGxAのリーディングエッジ(ハーフブリッジモード)またはCWGxBのリーディングエッジ(フルブリッジモード)での立ち上がりエッジのデッドバンド時間を制御します。CWGxDBR値はダブルバッファリングされます。EN = 0の場合、CWGxDBRレジスタはCWGxDBRが書き込まれるとすぐにロードされます。EN = 1の場合、ソフトウェアはCWGxCON0レジスタのLDビットを設定する必要があり、バッファはCWG入力信号の次の立ち下がりエッジでロードされます。カウントが完了するのに十分な時間入力ソース信号が存在しない場合、それぞれの出力に出力は表示されません。

7 立ち下がりエッジとフォワードデッドバンド

CWGxDBFは、CWGxBのリーディングエッジ(ハーフブリッジモード)またはCWGxDのリーディングエッジ(フルブリッジモード)でのデッドバンド時間を制御します。CWGxDBF値はダブルバッファリングされます。EN = 0の場合、CWGxDBFレジスタはCWGxDBFが書き込まれるとすぐにロードされます。EN = 1の場合、ソフトウェアはCWGxCON0レジスタのLDビットを設定する必要があり、バッファはCWG入力信号の次の立ち下がりエッジでロードされます。カウントが完了するのに十分な時間入力ソース信号が存在しない場合、それぞれの出力に出力は表示されません。

例については、図28.6および図28-7を参照してください。

8 デッドバンドの不確実性

入力ソースの立ち上がりエッジと立ち下がりエッジが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

9 CWGステアリングモード

ステアリングモード(MODE = 00x)では、CWGにより、CWGxxピンの任意の組み合わせを変調信号にすることができます。同じ信号を複数のピンで同時に使用することも、固定値の出力を表示することもできます。

CWGxOCON0のそれぞれのSTRxビットが「0」の場合、対応するピンは定義されたレベルに保持されます。CWGxOCON0のそれぞれのSTRxビットが「1」の場合、ピンは入力データ信号によって駆動されます。ユーザーは、入力データ信号を1つ、2つ、3つ、または4つすべての出力ピンに割り当てることができます。

CWGxCON1レジスタのPOLxビットは、STRx = 1の場合にのみ信号の極性を制御します。

CWGの自動シャットダウン動作は、セクション28.10「自動シャットダウン」で説明されているステアリングモードにも適用されます。自動シャットダウンイベントは、STRx = 1のピンにのみ影響します。

9.1 ステアリングの同期

MODEビットを変更すると、同期と非同期の2つのステアリングモードが可能になります。

MODE = 000の場合、ステアリングイベントは非同期であり、STRxに書き込む命令の最後に(つまり、すぐに)発生します。この場合、出力ピンの出力信号は不完全な波形である可能性があります。これは、ピンから信号をすぐに削除するのに役立ちます。

MODE = 001の場合、ステアリングの更新は同期しており、入力データ信号の次の立ち上がりエッジの開始時に発生します。この場合、出力のオン/オフを操作すると、常に完全な波形が生成されます。

図28-10と図28-11は、それぞれ非同期ステアリングと同期ステアリングのタイミングを示しています。

図28-10:指示終了時のステアリングイベントの例(MODE <2:0> = 000)

図28-11:指示開始時のステアリングイベントの例(MODE <2:0> = 001)

10 自動シャットダウン

自動シャットダウンは、回路の安全なシャットダウンを可能にする特定のオーバーライドでCWG出力レベルを即座にオーバーライドする方法です。シャットダウン状態は、自動的にクリアするか、ソフトウェアによってクリアされるまで保持することができます。自動シャットダウン回路を図28-12に示します。

10.1 シャットダウン

シャットダウン状態は、次の2つの方法のいずれかで開始できます。

10.1.1 ソフトウェア生成シャットダウン

CWGxAS0レジスタのSHUTDOWNビットをセットすると、CWGは強制的にシャットダウン状態になります。

自動再起動が無効になっている場合、SHUTDOWNビットが設定されている限りシャットダウン状態が持続します。

自動再起動が有効になっている場合、SHUTDOWNビットは自動的にクリアされ、次の立ち上がりエッジイベントで動作を再開します。

10.2 外部入力ソース

外部シャットダウン入力は、障害状態が発生した場合にCWG動作を安全に一時停止するための最速の方法を提供します。選択したシャットダウン入力のいずれかがアクティブになると、CWG出力はソフトウェアの遅延なしに選択したオーバーライドレベルにすぐに移行します。シャットダウン状態を引き起こすために、いくつかの入力ソースを選択できます。すべての入力ソースはアクティブローです。ソースは次のとおりです。

シャットダウン入力は、CWGxAS1レジスタ(レジスタ28-6)を使用して選択されます。

11 スリープ中の動作

CWGモジュールは、システムクロックとは独立して動作し、選択したクロックと入力ソースがアクティブのままである限り、スリープ中も実行を継続します。

HFINTOSCは、次のすべての条件が満たされた場合、スリープ中にアクティブのままになります。

選択したシステムクロックソースに関係なく。

つまり、HFINTOSCがシステムクロックとCWGクロックソースとして同時に選択されている場合、CWGが有効で入力ソースがアクティブな場合、CPUはスリープ中にアイドル状態になりますが、HFINTOSCはアクティブのままでCWG動作を継続します。これは、スリープモード電流に直接影響します。

注:シャットダウン入力はレベルセンシティブであり、エッジセンシティブではありません。シャットダウン入力レベルが持続する限り、自動シャットダウンを無効にする場合を除いて、シャットダウン状態をクリアすることはできません。

図28-12:CWGシャットダウンブロック図

12 CWGの構成

次の手順は、CWGを適切に構成する方法を示しています。

  1. アプリケーションに必要なCWGピンに対応するTRIS制御ビットが、ピンが入力として構成されるように設定されていることを確認します。
  2. まだクリアされていない場合は、ENビットをクリアします。
  3. MODEビットで希望の動作モードを設定します
  4. 必要に応じて、必要なデッドバンド時間をCWGxDBRおよびCWGxDBFレジスターに設定します。
  5. CWGxAS0 および CWGxAS1レジスタで次のコントロールを設定します
    1. 目的のシャットダウンソースを選択します。
    2. 目的のレベルへの両方の出力オーバーライドを選択します(これは、起動がシャットダウン状態から行われるため、自動シャットダウンを使用していない場合でも必要です)。
    3. 自動シャットダウンの影響を受けるピンをCWGxAS1レジスタで設定します。
    4. SHUTDOWNビットを設定し、RENビットをクリアします。
  6. CWGxISMレジスタを使用して、目的の入力ソースを選択します。
  7. 次のコントロールを構成します。
    1. CWGxCLKCONレジスタを使用して、目的のクロックソースを選択します。
    2. CWGxCON1レジスタを使用して、目的の出力極性を選択します。
    3. 目的の出力に対して出力イネーブルを設定します。
  8. ENビットを設定します。
  9. これらのピンを出力として構成するために必要な出力ピンに対応するTRIS制御ビットをクリアします。
  10. 自動再起動を使用する場合は、RENビットを設定するとSHUTDOWNビットが自動的にクリアされます。それ以外の場合は、SHUTDOWNビットをクリアしてCWGを開始します。
12.1 ピンオーバーライドレベル

シャットダウン入力が真である間、出力ピンに駆動されるレベルは、CWGxAS0レジスタのLSBDビットとLSACビットによって制御されます。LSBD <1:0>はCWGxBおよびDオーバーライドレベルを制御し、LSAC <1:0>はCWGxAおよびCオーバーライドレベルを制御します。制御ビットの論理レベルは、シャットダウン状態の出力論理ドライブレベルに対応します。極性制御はオーバーライドレベルに影響しません。

12.2 自動シャットダウンの再起動

自動シャットダウンイベントが発生した後、動作を再開するには2つの方法があります。

再起動方法は、CWGxAS0レジスタのRENビットで選択されます。ソフトウェア制御および自動再起動の波形を図28-13および図28-14に示します。

12.2.1 ソフトウェア制御による再起動

CWGxAS0レジスタのRENビットがクリアされると、ソフトウェアによる自動シャットダウンイベントの後にCWGを再起動する必要があります。シャットダウン状態をクリアするには、選択したすべてのシャットダウン入力をローにする必要があります。そうでない場合、SHUTDOWNビットはセットされたままになります。オーバーライドは、SHUTDOWNビットがクリアされた後の最初の立ち上がりエッジイベントまで有効です。その後、CWGは動作を再開します。

12.2.2 自動再起動

CWGxAS0レジスタのRENビットがセットされると、CWGは自動シャットダウン状態から自動的に再起動します。すべてのシャットダウンソースがローになると、SHUTDOWNビットは自動的にクリアされます。オーバーライドは、SHUTDOWNビットがクリアされた後の最初の立ち上がりエッジイベントまで有効です。その後、CWGは動作を再開します。

図28-13:シャットダウン機能、自動再起動が無効(REN = 0、LSAC = 01、LSBD = 01)

図28-14:

シャットダウン機能、自動再起動が有効(REN = 1、LSAC = 01、LSBD = 01)

13 レジスタ定義:CWG制御

レジスタ 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
000 = Steering011 = Reverse Full-Bridge
001 = Synchronous Steering100 = Half-Bridge
010 = Forward Full-Bridge101 = Push-Pull
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>信号源信号名
0000CWG pinPPS selection 0100CCP2CCP2_out 1000CLC4LC4_out
0001Comparator C1C1_OUT_sync 0101CLC1LC1_out 1001PWM3PWM3_out
0010Comparator C2C2_OUT_sync 0110CLC2LC2_out 1010PWM4PWM4_out
0011CCP1CCP1_out 0111CLC3LC3_out

9 プログラム例

プログラム例を示します。
赤外線送信が終了するまで、赤外線センサーの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
*/