Sahara's WebLog

日記のような、備忘録のような、うらみつらみのような、自慢のような…。

PIC16F1827 PWM

人様の丸写しでなく、なるべくデータ・シートだけでいろいろやってみようとするコーナーの3回目はPWM、使うPICはPIC16F1827だ。データ・シートで該当部分を見てレジスタの設定をする。

pic16f1827_pwm_01

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は使用しないと書かれているので、
pic16f1827_pwm_02
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

以上の設定でプログラムしてハンディー・オシロスコープで見たところが以下のようになる。
pic16f1827_pwm_03
Duty Cycleを変えることでモータの制御とか行うのが本来の使い道だからこう書いてある。
pic16f1827_pwm_05
そこで、CCPR4Lの値を少しずつ減らしていくとこうなる。
pic16f1827_pwm_04
結局、Duty Cycleを変えてLEDがじんわり消えてぱっと点く( 3rd Pin = CCP4 )のを繰り返すようなプログラムにしてみた。

PICkit 3 2_ブレッドボード


MPLAB XC8 プロジェクトファイル PIC16F1827 LED PWM 2 PIC16F1827_LED_PWM_2 (80 ダウンロード)

このエントリーをはてなブックマークに追加

Posted under: MPLAB X, PIC16F1827, これから始めるなら


コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.