akira.kei が 2025年01月26日16時26分03秒 に編集
コメント無し
本文の変更
[<前の記事](url):[次の記事>](url)
[<前の記事](https://elchika.com/article/6d8c83f9-8d83-4b0d-b7b1-069ef78248df/):[次の記事>](url)
## 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; ``` これでハードウェアだけで割り込み不要で約1HzでLEDを点滅できる。 