CWG機能を動作させて見ます
〔PICの動かせ方入門に戻る〕
12F1501のCWG機能(Complementary Waveform Generator Module:相補波形ジェネレータ)は、
12F1822で拡張ECCPのハーフブリッジPWMやステアリング制御と呼んでいた機能と同等の機能を
提供しています。
ステアリング制御の話は16F1827での内容ですがこちらの頁を参照下さい。
※相補波形とは
左図の様に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端子にロジックアナライザを繋いで波形を表示させています。
上図が実行結果の表示です、図の信号名が間違ってますが気にしないでね。
Aが正転(HIGH)の時Bは反転(LOW)していますね、もちろんBを正転でも出力出来ます。
PWM周期が1KHz(1000Hz)なので1サイクル(1000000us/1000Hz=1000us)は1msですね。
左図はエッジの部分を拡大させてデッドバンドを表示させています。
CWG1DBR:Rising Edge Dead Band(立ち上がりエッジデッドバンド)
ソースの立上がり時にFoscの何個分遅らせるか指定できます。
CWG1DBR = 0x08 設定なので
1/8MHz * 0x08 = 125ns * 8 = 1us です。
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の構成
ビット |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
機能 |
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の構成
ビッ
ト |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
機能 |
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の構成
ビット |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
機能 |
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.