PICのCCPによる PWM

igoten

2012年11月15日 00:00



PICマイコンのPWMの設定は結構面倒です。
PWMの設定方法を根本から学ぶにはマニュアルを
読むのが一番ですが、あいにく英語のマニュアルしか
有りません。

ここで仕方なしに英語マニュアルを翻訳して、自分なりの
解説を加えました。

これは PIC12F683のマニュアル のPWMの部分の日本語訳です。

11.3 PWMモード

PWMモードはCCP1ピンにPWM信号を発生させる。
デューティ・サイクル(Duty cycle)、周期(period)と分解能
(resolution)は次のレジスターで決められる。

・PR2
・T2CON
・CCPR1L
・CCP1CON

PWMモードにおいては、CCPモジュールはCCP1ピンに
10ビットの分解能のPWMを出力する。
CCP1ピンはポート・データーラッチと多重化されている為に
このピンのTRISはCCP1ピンが出力となるようにクリアー
されなければならない。

ノート: CCP1CONレジスターをクリアーするとCCP1ピンの
CCP1コントロールは解除される。

[解説]
 TRISはTRISIOレジスタのことで、このレジスターはGPIOを
 デジタル入力か出力に設定するためのものである。
 PIC12F683の場合CCPのポートはGP2であるため、
 TRISIO2 = 0 ; 
 と設定してポートをデジタル出力にする。

 CCP1CONレジスターの下位4ビットはCCP1のモード
 を決めます。
 CCP1CON = 0x0c;
 とするとCCP1ピンはPWMモードにセットされ
 CCP1CON = 0;
 とするとPWMモードが解除されます。


   図 11-1に単純化されたPWMのブロック図を示します。
図 11-4に典型的なPWMの波形を示します。

PWMの為のCCPモジュールの一歩一歩のセットアップ
方法は11.3.7のセクション「PWMオペレーションの
セットアップ」を見られたし。

図 11-3 簡略化された PWMのブロック図


Note
1:8ビットのタイマーであるTMR2レジスターは、
  10ビットのタイムベースを作る為に、2ビットの内部クロック(Fosc)
  又は2ビットのプリスケーラーに結合される。
2:PWMモードに於いてはCCPR1Hは読み込み専用レジスタである。

PWMのアウトプット(図 11-4)はタイムベース(周期)と
出力がハイ(Dutyサイクル)になる時間を有する。




[解説]
TMR2は8ビットのインクリメントカウンターで、通常は
システムクロック(Fosc/4)をプリスケーラ値で割った
クロックをカウントしますが、PWMモードの時は、
下位に2ビット足して、Foscを4で割り更にプリスケーラ
値で割ったクロックを10ビットのカウンタでカウントします。

例えば、PR2に255をセットすると、Timer2は
通常の場合255をカウントするとコンパレータ―がオンしますが
PWMモードの時は、
1024でコンパレータ―がONします。
なぜならコンパレーターはPR2のセット値とT10ビットに
拡張されたTMR2の上位8ビットを比較する為です。

この辺は深く考える必要は有りませんが、PR2にセット出来る最大の
値は8ビットなので255ですが、この時PWMの分解能は10ビットの
で1024になります。


Dutyセット サンプルコード
void set_duty(unsigned int duty){
    //上位8ビットを CCPR1Lにセット
    CCPR1L =  duty >> 2;  
    //下位2ビットをCCP1CONの4、5ビットセットする
    CCP1CON |= (duty & 0x0003) > 2;  
    //下位2ビットをCCP1CONの4、5ビットセットする
    CCP1CON = (duty 
        

関連記事