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