PWMの設定方法





TRISC = 0x00 ; // Port C OOOO OOOO
これで、Cポートは出力に設定された。次は「PWMを使いますよー」という宣言をする必要がある。これは、CCP1CONレジスターで行う。CCP1CONレジスターの設定は、下の表のように行う。CCP1CONレジスターの中の、ビット5と4は、デューティサイクルを指定するために使う。これは後で説明する。PWMを使うには、ビット2と3を1にセットする必要がある。
実際には、次のようになる。
CCP1CON = 0x0c ; // CCP1 is PWM mode
さて、これでPWMのユニット1が使えるようになったのだ。クリスタル2.097152MHzを使って128Hzを発生するには、上の表から、PR2をoxff、タイマー2のプリスケラーを1:16に設定する。タイマー2のレジスターは下の表のように設定する。同時にビット2に1をセットしてタイマー2をONにしている。

PR2 = 0xff ; // T2CON = 0x07 ; // PoS = 1:1, PreS = 1:16, ON
さて、これでPWMモジュールは動作をはじめている。あとは、CCP1CON、CCPR1Lにデューティサイクルを指定するのだ。10ビットのデータを8ビットのCCPR1Lと、CCP1CON中の2ビットに分けて設定する必要がある。いちいちこんなことやっていると面倒なので、設定する専用のサブルーチンを書くと次のようになる。dutyには0から1023の値が入る。すると、CCP1CON、CCPR1Lに値を設定してくれるわけである。ちなみに、PWMのユニット2を使うなら、リスト中のCCPR1LとCCP1CONをCCPR2LとCCP2CONに書き換えればよい。
//--- PWM subroutine --------------------------------------------//
//
void set_duty(unsigned int duty)
{
unsigned int temp1 ;
unsigned char temp2 ;
temp1 = duty ;
temp1 >>= 2 ;
temp2 = temp1 & 0xff;
CCPR1L = temp2 ;
temp1 = duty ;
temp1 <<= 4 ;
temp2 = temp1 | 0x0c ;
CCP1CON = temp2 ;
}
//
だいたい、こんな感じである。
<文献>
1. 後閑哲也、PIC活用ガイドブック
2. PIC16F877のPDF説明資料(マイクロチップス社のホームページのもの)