CWG機能を動作させて見ます

〔PICの動かせ方入門に戻る〕


12F1501のCWG機能(Complementary Waveform Generator Module:相補波形ジェネレータ)は、
12F1822で拡張ECCPのハーフブリッジPWMやステアリング制御と呼んでいた機能と同等の機能を
提供しています。
ステアリング制御の話は16F1827での内容ですがこちらの頁を参照下さい。

※相補波形とは
memo3  左図の様にCWG1AピンがHIGH時はCWG1BピンはLOWを
 出力する様に反転させます(差動出力)、これを
 相補PWM出力制御と言います。


CWGモジュールの入力源として、コンパレータの出力・NCO出力・CLC出力とPWM1/2/3/4
から選択できますがここではPWM1で実験しています。
CWGには自動シャットダウン機能で外部ピンや内部からの信号により出力波形を一時停止状態に
出来ますが、今回は利用していません。

《PIC12F1501ピン構成》

ピン構成図

CWGの出力するピンは、CWG1Aが2番と5番ピンの何方からか出力し、CWG1Bが3番と7番ピンの
何方からか出力可能です。
今回はCWG1Aが2番(RA5)ピンからで、CWG1Bが3番(RA4)ピンから出力しています。
尚、PICの1番ピンに電源+5V、8番ピンに電源GND(-)を接続しています。

《サンプルプログラム》

CWGの入力源はPWM1で、PWM1の周期はTIMER2で1KHzを発生させPWMのデューティ比は50%です。
但し、PWM1の5番(RA2)ピンからはPWMの出力は行っていません。
尚、PICのシステムクロック(Fosc)は内蔵8MHzで行っています。

下記がプログラムソースです、
MPLAB X(v2.15)MPLAB(R) XC8 C Compiler Version 1.32コンパイラを使用しています。
 プロジェクトを作成して新規ファイルにコピーペーストして貼り付けて下さい。 *1)
---------------------------------------------------------------------
#include <xc.h>

// コンフィギュレーション1の設定
#pragma config FOSC     = INTOSC   // 内部クロック使用する(INTOSC)
#pragma config WDTE     = OFF      // ウオッチドッグタイマー無し(OFF)
#pragma config PWRTE    = ON       // 電源ONから64ms後にプログラムを開始する(ON)
#pragma config MCLRE    = OFF      // 外部リセット信号は使用せずにデジタル入力(RA3)ピンとする(OFF)
#pragma config CP       = OFF      // プログラムメモリーを保護しない(OFF)
#pragma config BOREN    = ON       // 電源電圧降下常時監視機能ON(ON)
#pragma config CLKOUTEN = OFF      // CLKOUTピンをRA4ピンで使用する(OFF)

// コンフィギュレーション2の設定
#pragma config LPBOR  = OFF        // 低消費電力ブラウンアウトリセット(OFF)
#pragma config WRT    = OFF        // Flashメモリーを保護しない(OFF)
#pragma config STVREN = ON         // スタックがオーバフローやアンダーフローしたらリセットをする(ON)
#pragma config BORV   = HI         // 電源電圧降下常時監視電圧(2.5V)設定(HI)
#pragma config LVP    = OFF        // 低電圧プログラミング機能使用しない(OFF)

// メインの処理
void main()
{
     OSCCON = 0b01110000 ;    // 内部クロックは8MHzとする
     ANSELA = 0b00000000 ;    // アナログは使用しない(すべてデジタルI/Oに割当てる)
     TRISA  = 0b00000000 ;    // ピンは全て出力に割当てる(RA3は入力のみとなる)
     PORTA  = 0b00000000 ;    // 出力ピンの初期化(全てLOWにする)

     // CWGの設定
     CWG1ASEL = 1 ;           // CWG1AはRA5ピンを使用する
     CWG1BSEL = 1 ;           // CWG1BはRA4ピンを使用する
     CWG1DBR  = 0x08 ;        // 波形立上がり時のデッドバンドは8カウント(125ns*8)
     CWG1DBF  = 0x08 ;        // 波形立下がり時のデッドバンドは8カウント
     CWG1CON2 = 0b00000000 ;  // Auto-Shutdown は使用しない
     CWG1CON1 = 0b00000010 ;  // PWM1をソースとする
     CWG1CON0 = 0b11100000 ;  // CWGはB端子を反転でA端子は正転としクロックはFosc

     // PWM1の設定
     PWM1CON = 0b10000000 ;   // PWM1ピンからは出力しない
     PWM1DCH = 64 ;           // デューティ値は50%で初期化
     PWM1DCL = 0 ;
     T2CON   = 0b00000010 ;   // TMR2プリスケーラ値を16倍に設定
     TMR2    = 0 ;            // タイマー2カウンターを初期化
     PR2     = 124 ;          // PWMの周期を設定(1000Hzで設定)
     TMR2ON  = 1 ;            // TMR2(PWM)スタート

     while(1) {
     }
}
---------------------------------------------------------------------

実行結果

このプログラム自体は設定のみなので、LED表示などの外部出力はないので何も変化は
無いですが、CWG1A/CWG1B端子にロジックアナライザを繋いで波形を表示させています。

実行結果1

上図が実行結果の表示です、図の信号名が間違ってますが気にしないでね。
Aが正転(HIGH)の時Bは反転(LOW)していますね、もちろんBを正転でも出力出来ます。
PWM周期が1KHz(1000Hz)なので1サイクル(1000000us/1000Hz=1000us)は1msですね。

実行結果2  左図はエッジの部分を拡大させてデッドバンドを表示させています。
 CWG1DBR:Rising Edge Dead Band(立ち上がりエッジデッドバンド)
 ソースの立上がり時にFoscの何個分遅らせるか指定できます。
 CWG1DBR = 0x08 設定なので
 1/8MHz * 0x08 = 125ns * 8 = 1us です。

実行結果3        CWG1DBF:Falling Edge Dead Band(立ち下がりエッジデッドバンド)
       ソースの立下がり時にFoscの何個分遅らせるか指定できます。
       左の上下図は G1POLA=0 G1POLB=0 で設定時の波形です。

《レジスタの設定》

PWM1の設定

PWM1の設定はこちらを見て下さい。

CWGの設定

CWGにて出力するピンを決めるには
 CWG1ASEL = 1 ;  // 1:2番(RA5)ピンを使用する 0:5番(RA2)ピンを使用する
 CWG1BSEL = 1 ;  // 1:3番(RA4)ピンを使用する 0:7番(RA0)ピンを使用する
 もちろんANSEL/TRISにて使用するピンはデジタル出力に設定します。

デッドバンドの設定は
 CWG1DBR:立ち上がりエッジデッドバンド
 CWG1DBF:立ち下がりエッジデッドバンド
 立ち上がり/立ち下がりは、入力ソース(PWM1)のエッジから何クロック分出力を遅らせるのかを
 設定します。(下記図参照)
 それぞれ6ビットレジスタなので 0〜63 まで設定できます。
 同じ設定値でも使用するクロック(Fosc/HFINTOSC)によってデッドバンドの長さが変わります。

CWG1CON0の構成
ビット
機能 G1EN G1OEB G1OEA G1POLB G1POLA G1CS0

Bit 7:G1EN   CWGモジュールの有効無効指定ビット
           1:モジュールを使用する
           0:モジュールを使用しない

Bit 6:G1OEB  CWG1Bピンの出力有無を指定するビット
           1:B出力指定ピンはCWGで使用する
           0:B出力指定ピンはCWGで使用しない

Bit 5:G1OEA  CWG1Aピンの出力有無を指定するビット
           1:A出力指定ピンはCWGで使用する
           0:A出力指定ピンはCWGで使用しない

Bit 4:G1POLB CWG1B出力極性ビット(下記図参照)
           1:B出力は極性を反転する(PWM1と同じ方向)
           0:B出力は通常の極性である(PWM1と逆の方向)

Bit 3:G1POLA CWG1A出力極性ビット(下記図参照)
           1:A出力は極性を反転する(PWM1と逆の方向)
           0:A出力は通常の極性である(PWM1と同じ方向)

Bit 0:G1CS0  使用するクロックの選択ビット
           1:HFINTOSC(16MHzのみ)
           0:Fosc(システムクロック)

波形の図


CWG1CON1の構成
ビッ ト
機能 G1ASDLB G1ASDLA G1IS

Bit 7-6:G1ASDLB 自動シャットダウン時のCWG1Bピンの出力状態を指定するビット
              (G1ASE=1 の場合のみ有効となります)
              11:B出力を"1"(HIGH)に保持する
              10:B出力を"0"(LOW)に保持する
              01:B出力をトライステート(ハイインピーダンス)に保持する
              00:デッドバンド間隔の後に非アクティブ状態に駆動される

Bit 5-4:G1ASDLA 自動シャットダウン時のCWG1Aピンの出力状態を指定するビット
              (G1ASE=1 の場合のみ有効となります)
              11:A出力を"1"(HIGH)に保持する
              10:A出力を"0"(LOW)に保持する
              01:A出力をトライステート(ハイインピーダンス)に保持する
              00:デッドバンド間隔の後に非アクティブ状態に駆動される

Bit 2-0:G1IS     入力源のソースを選択するビット
              111:CLC1の出力で使用する
              110:NCO1の出力で使用する
              101:PWM4の出力で使用する
              100:PWM3の出力で使用する
              011:PWM2の出力で使用する
              010:PWM1の出力で使用する
              001:予約
              000:コンパレータ1の出力で使用する

CWG1CON2の構成
ビット
機能 G1ASE G1ARSEN G1ASDC1 G1ASDFLT G1ASDCLC2

Bit 7:G1ASE     自動シャットダウンイベントのステータスビット(読み書き共用)
              1:シャットダウンイベントが発生しました
              0:シャットダウンイベントは発生していない

Bit 6:G1ARSEN   自動再起動を行うか指定するビット
              1:自動再起動を行う
              0:自動再起動はしない

Bit 2:G1ASDC1   コンパレータ1の出力でシャットダウンを行うか指定するビット
              1:この出力(C1OUT_async)がHIGHになればシャットダウンする
              0:この出力でシャットダウンはしない

Bit 1:G1ASDFLT  CWG1FLTの外部ピン(RA2)入力でシャットダウンを行うか指定するビット
              1:この信号がLOWになればシャットダウンする
              0:この信号でシャットダウンはしない

Bit 2:G1ASDCLC2 CLC2の出力でシャットダウンを行うか指定するビット
              1:この出力(LC2_out)がHIGHになればシャットダウンする
              0:この出力でシャットダウンはしない

《その他》

CWG機能になって、
入力源がPWMの信号だけでなく他の信号からも出来る様になった。
デッドバンドが細かく設定出来る様になった。
シャットダウンのイベント信号も増えたこと辺りが新機能でしょうかね。

PWM1CON = 0b11000000 ;
と変更するとPWM1(RA2)ピンから設定したPWMが出力されますのでLED等を接続すれば動作の
確認になるかもね。

入力ソースを立上り/立下りで分けたり、複数のソースを混ぜたりや、ブランキング制御に
プッシュプル出力等の動作を行いたい場合は、CWGの機能アップをさせた16F1705のCOG機能
利用すれば良いでしょう。



MPLAB X用に記事変更(*1) 2015/10/02


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.