akira.kei が 2025年01月26日20時52分58秒 に編集
コメント無し
本文の変更
[<前の記事](https://elchika.com/article/dd377f18-78f8-44d0-8c09-96e512b5740e/):[次の記事>]() ## CWGで相補出力
PIC16F18313 のデータシートでCWGに関する説明がわかりにくい。最低限の設定内容を例として掲載してくれれば良いのに。そして前の記事とほぼ同じ中身でPWM5の設定までやった後、CWGの入力としてPWM5を指定してからCWGから相補波形を出力することになる。つまりPWM5の出力を反転させて出力するという感覚ではなく、入力を入れると自然に相補出力が出る、という感じになる。些細な差異ではあるけど。
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,2,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; ```