人様の丸写しでなく、なるべくデータ・シートだけでいろいろやってみようとするコーナーの3回目はPWM、使うPICはPIC16F1827だ。データ・シートで該当部分を見てレジスタの設定をする。
Timer2は他で使う予定なので、Timer4を使うことにし、数字を全部4でそろえるためにCCPもCCP4を使うことにする。
PIC16F1827は高機能でいいのだが、たくさんタイマーがあるのも初心者にはつらい面がある。
Timer2, 4, 6の数字の部分をxで表して本文にはCCPxIEと書いてあるが、実際はCCP4IEを設定するのでデータ・シート上で探すのにてこずったり…。
まあ、すぐ慣れたが。
CCP4はRA4ピンなのでTRISAで出力にする。
TRISA = 0b00000000;//全て出力(RA5は入力のみ)
これはお決まり。
INTCONbits.GIE = 1;//Global Interrupt Enable bit
INTCONbits.PEIE = 1;//Peripheral Interrupt Enable bit
とりあえずPWMの周期を500Hzとしてみる。
ちなみにPostscalerは使用しないと書かれているので、
PrescalerとPeriod registerだけで設定するらしい。
//PWM Period 500Hz 500 = 1/( (249 + 1) x 4 / 8000000 x 16 )
//Set CCP4
PR4 = 249;//Timer4 Period register
CCP4CONbits.CCP4M2 = 1;
CCP4CONbits.CCP4M3 = 1;//PWM mode
//Duty Cycle
CCPR4L = 0b01000000;//
CCP4CONbits.DC4B = 0b00;//PWM Duty Cycle Least Significant bits
CCPTMRSbits.C4TSEL = 0x01;//CCP4 is based off Timer 4 in PWM Mode
PIR3bits.TMR4IF = 0;//TMR4 to PR4 Match Interrupt Flag bit
T4CONbits.T4CKPS = 0b10;//Timer4-type Clock Prescale Select bits (16)
T4CONbits.TMR4ON = 0b1;//Timer4 On bit
以上の設定でプログラムしてハンディー・オシロスコープで見たところが以下のようになる。
Duty Cycleを変えることでモータの制御とか行うのが本来の使い道だからこう書いてある。
そこで、CCPR4Lの値を少しずつ減らしていくとこうなる。
結局、Duty Cycleを変えてLEDがじんわり消えてぱっと点く( 3rd Pin = CCP4 )のを繰り返すようなプログラムにしてみた。
MPLAB XC8 プロジェクトファイル PIC16F1827 LED PWM 2 PIC16F1827_LED_PWM_2 (11338 ダウンロード )
Tweet