CWGで相補出力
PIC16F18313 のデータシートではCWGに関する説明が極めて(?)わかりにくい。最低限の設定内容を例として掲載してくれれば良いのに。そして前の記事とほぼ同じ中身でPWM5の設定までやった後、CWGの入力としてPWM5を指定してからCWGから相補波形を出力することになる。つまりPWM5の出力を反転させて出力するという感覚ではなく、入力を入れると自然に相補出力が出る、という感じになる。些細な差異ではあるけど。
オシレータ部
前記事とほぼ同じだが再掲しておく。CONFIG1の部分は以下のようにした。外部クロック無効、1MHz内蔵クロック、クロックモニタ(CLKOUT)有効、OSCCON有効化、FailSafe無効である。特にCSWENは必ずONだ(OSCCONを変更するので)。
#pragma config FEXTOSC = OFF //
#pragma config RSTOSC = HFINT1 //
#pragma config CLKOUTEN = ON //
#pragma config CSWEN = ON //
#pragma config FCMEN = OFF //
main関数の冒頭部でクロック設定を行う。HFFRQを設定しておかないとクロックが思わぬ値になったりする。NDIVを16にするとクロック周期は16μsだ。OSCTUNEで微調整してはあるが、LED点滅周期は1[Hz]をわずかに超える値になっている(上図参照)。
OSCFRQbits.HFFRQ=0b0000; // 1MHz
OSCCON1bits.NDIV=0b0100; // 1MHz/16
OSCCON1bits.NOSC=0b110; // HFNT1
OSCTUNE=0b011111;
出力指定とPWM
出力ピンはPWMではなくCWGモジュールをPPSで指定する。
TRISAbits.TRISA2=0;
RA2PPSbits.RA2PPS=0b01000; // CMG1A
TRISAbits.TRISA5=0;
RA5PPSbits.RA5PPS=0b01001; // CMG1B
PWM関係の設定は前の記事と一緒だ。ここでTimer2のプリスケーラ指定は2ビットしかなく、1,4,16,64と変化が大きい。PWMのデューティは16bit指定に見えるがPWM5DCLの下位6ビットは無効だ。
PR2=0xFF;
T2CONbits.T2CKPS=0b11; // Prescaler (1/64)
T2CONbits.TMR2ON=1;
PWM5DCH=0b10000000;
PWM5DCL=0b00000000;
PWM5CONbits.PWM5EN=1;
CWGの設定
CWGの動作クロックはFosc、モジュールへの入力はPWM5を利用する。あとはMODE、POLAおよびPOLBを指定すると、あっさり相補信号が出力される。CLCで信号反転させる方法もちょっと考えたが、CWGを利用する方が簡単そうだし機能的には必要十分だ。
CWG1CLKCONbits.CS=0; // Fosc
CWG1DATbits.DAT=0b0111; // PWM5
CWG1STRbits.STRA=1;
CWG1STRbits.STRB=1;
CWG1CON1bits.CWG1POLA=0;
CWG1CON1bits.CWG1POLB=1;
CWG1CON0bits.CWG1MODE=0b001;
CWG1CON0bits.CWG1EN=1;
投稿者の人気記事
-
akira.kei
さんが
2025/01/26
に
編集
をしました。
(メッセージ: 初版)
-
akira.kei
さんが
2025/01/26
に
編集
をしました。
-
akira.kei
さんが
2025/01/26
に
編集
をしました。
-
akira.kei
さんが
2025/02/01
に
編集
をしました。
ログインしてコメントを投稿する