CCPのPWMではなく
PIC16F18313にはPWM5とPWM6の2つのモジュールがある。CCPにもPWMモードがあり、CCPは2つあるわけで全部で4つのPWMが使えるようだ。ここではPWM5を使ってLチカしてみる。PWM周期は下のように定義されていて、Foscが1MHzもあると1Hz周期まで落とせそうにないため、OSCCONで調整する。
PR2は最大の255、Timer2のプリスケーラを64に設定すると、1s周期にするためには15μs程度のToscが必要だ。オシレータのNDIVを16にするとちょうど良くなる。
オシレータ設定
CONFIG1の内容は以下にした。プログラム中でオシレータの設定変更をするのでCSWENはONだ。CLKOUTENをOFFにしたのは、後述のコンパレータを使うから。
#pragma config FEXTOSC = OFF
#pragma config RSTOSC = HFINT1
#pragma config CLKOUTEN = OFF
#pragma config CSWEN = ON
#pragma config FCMEN = OFF
main関数の冒頭でオシレータ関連の設定をしておく。実際の周期は1.048576sになるので、OSCTUNEで最大限までクロックを速く(周期を短く)する。
OSCFRQbits.HFFRQ=0b0000; // 1MHz
OSCCON1bits.NDIV=0b0100; // 1MHz/16
OSCCON1bits.NOSC=0b110; // HFNT1
OSCTUNE=0b011111;
反転(相補)出力はどうするか
前の記事では相補出力はプログラムで書いていたが、今回はハードウェアで出力されてしまう。 PIC16F18313 には相補出力を出すCWGモジュールが用意されてはいるのだが、どうも使い方がわからない。CLCに読み込ませて反転出力できる方法もありそうだが、これもよくわからない。ここは使い慣れたコンパレータで反転させよう。
PWM5の出力はRA2に出した。反転出力をRA5に出すのでコンパレータへ入力するためにRA2をRA4に ピンを接続する。これまでRA4にはCLKOUTを出していたが、これはやめてコンパレータに回すことにする。コンパレータ入力はアナログ扱いなので、ANSELAレジスタを設定して入力端子にする。コンパレータの+側をVSSに接続してあるが、これは中間電位の方が動作が安定するかもしれない。コンパレータの負側にPWM出力が届くので、PWM-Highの時コンパレータLOW、PWM-LOWの時コンパレータがHighになるか微妙だ(結果的にうまくいった)。
TRISAbits.TRISA2=0;
RA2PPSbits.RA2PPS=0b00010; // PWM5
TRISAbits.TRISA5=0;
RA5PPSbits.RA5PPS=0b10110; // C1(Comparator)
ANSELAbits.ANSA4=1;
TRISAbits.TRISA4=1; //RA4 as AnalogIn
CM1CON1bits.C1PCH=0b111; // Vss
CM1CON1bits.C1NCH=0b001; // RA4(<-RA2))
CM1CON0bits.C1POL=0;
CM1CON0bits.C1ON=1;
PWM5の設定
PWM5はTimer2を使うのでそれを設定する。PR2もプリスケーラも大きい方が周期が長いのでどちらも最大だ。デューティはH:0x80、L:0x00で50%になるようだ。
PR2=0xFF;
T2CONbits.T2CKPS=0b11; // Prescaler (1/64)
T2CONbits.TMR2ON=1;
PWM5DCH=0b10000000;
PWM5DCL=0b00000000;
PWM5CONbits.PWM5EN=1;
投稿者の人気記事
-
akira.kei
さんが
2025/01/26
に
編集
をしました。
(メッセージ: 初版)
-
akira.kei
さんが
2025/01/26
に
編集
をしました。
-
akira.kei
さんが
2025/01/26
に
編集
をしました。
ログインしてコメントを投稿する