Chapter 3. レッスン
3.9 レッスン 8: パルス幅変調 (PWM)
PICkit™ 3 スタータキット ユーザガイド
DS41628B_JP - p.68 2015 Microchip Technology Inc.
図3-8: PWMの波形
PWM周期はPRx レジスタで指定します。Timer2/4/6を使って、CCPRxHレジスタ
とCCPxCONレジスタの下位2ビットを連結した値と一致するまでカウントします。
CCPRxLはCCPRxHへの書き込みに使います。CCPRxLは読み書き可能なバッファ
と見なす事ができます。CCPRxHは読み出し専用です。タイマがPRxに一致すると、
直後のインクリメント サイクルで以下の3つのイベントが実行されます。
1. TMRxがクリアされる
2. CCPxピンがセットされる
3. PWMデューティ サイクルがCCPRxLからCCPRxHにラッチされる
CCP モジュールを標準型 PWM 動作に設定するには、以下のステップを順番通りに 実行します。
1. PWM生成に使うタイマ(Timer2/4/6)をCCPTMRSレジスタのCxTSEL<1:0>ビッ トで選択する
2. 対応するTRISビットをセットしてCCPxピン出力ドライバを無効にする
3. PRxレジスタにPWM周期の値を書き込む
4. CCPxCONレジスタに適切な値を書き込んでCCPモジュールをPWMモードに
設定する
5. CCPRxLレジスタとCCPxCON レジスタのDCxBビットにPWMのデューティ
サイクル値を書き込む
6. Timer2/4/6を設定して開始する
a) PIRxレジスタのTMRxIF割り込みフラグビットをクリアする
b) TxCONレジスタのTxCKPSビットでタイマのプリスケーラ値を設定する
c) TxCONレジスタのTMRxONビットをセットしてタイマを有効にする
7. PWM出力ピンを有効にする
このレッスンでは、周波数を486 Hzとします。周波数を約60 Hz以上とすれば、フ リッカはほとんど気になりません。
例3-33:
PWM分解能も考慮する必要があります。
式3-3: PWM分解能
このレッスンでは、以下の2つの条件を満たす必要があります。
1. 10ビットの分解能
2. LEDのフリッカがない事
Period
Pulse Width
TMRx = 0
TMRx = CCPRxH:CCPxCON<5:4>
TMRx = PRx
;PWM Period = [PR2 + 1]*4*Tosc*T2CKPS = [255=6+ 1]*4*(1/500kHz) * 1
Resolution log4PRx+1
2
--- bitslog
=
PICkit™ 3 スタータキット ユーザガイド
DS41628B_JP - p.70 2015 Microchip Technology Inc.
どちらのデバイスも、拡張PWMモジュールの機能を一部使っています。PIC16では CCP2のP2AピンがDS4に直接接続されているため、CCPモジュールを単一出力で 動作させます。PIC18ではCCPモジュールをフルブリッジ モードで動作させ、DS3 が接続されたP1Dを変調します。
分解能は、8ビットのPRxレジスタを最大値の0xFF (255)に設定すると最大になり ます。
下図は、LEDの輝度が低い場合のPWM信号波形をオシロスコープで観測したもの です。これを見ると周期が約2 ms、パルス幅が数百µsです。
図3-9: パルス幅: 小
図3-10は、ポテンショメータを時計方向へ30%の位置まで回転した時の波形です。
図3-9と比べると、周波数は同じでパルス幅が大きくなっているのが分かります。
図3-10: パルス幅: 大
表3-29:
命令 英語名 目的
andlw AND literal with WREG 値をマスクする
3.9.5 アセンブリ
3.9.5.1 エンハンスト ミッドレンジ
例3-34:
これで、A/D変換結果の上位8ビットがPWMレジスタに格納されます。この次の数 行は、コメントアウトしても実際の出力はほとんど変わりません。これは、下位 2 ビットはデューティ サイクル分解能にほとんど影響しないためです。ただし完全を期 すために、このレッスンでは10ビット全てを使います。
例3-35:
例3-35では、A/D変換結果の下位2ビットを格納しているADRESLレジスタをシフ トしています。bit <5:0>は常にクリアされ、bit <7:6>にはA/D変換結果の下位2ビッ トが格納されます。このレジスタを右方向へ2回シフトして、変換結果の下位2ビッ
トが bit <5:4> に格納されるようにしています。シフトした結果は WREG ではなく
ADRESLレジスタに書き戻しています。次の3つの命令は、まずxorwf命令を使って
同じ値のビットをクリアして異なる値のビットをセットしています。この結果を WREGに格納します。次のandlw命令でWREG内の全ての制御ビットをクリアし、
最後の処理で値が変更されないようにしています。最後の worwf 命令は、変化した ビットのみを変化させ、それ以外のビットをそのまま維持しています。この結果を
CCP2CONレジスタに書き込みます。movwfまたはiorwf命令では初期化時の設定
値を保持できないため、正しく動作しません。
3.9.5.2 PIC18
PIC18では上記コードのlsrf命令の代わりにrrncf命令を使っています。ただし
rrcf命令でも動作します。
3.9.5.3 C言語
新しく学ぶ内容はありません。
call A2d ;begin the Analog to Digital conversion
;ADRESH and ADRESL are now both full of the ADC result!
movf ADRESH, w ;Get the top 8 MSbs (remember that the ADC result is LEFT justified!) banksel CCPR2L
movwf CCPR2L
;to fill all 10 bits of the duty cycle, the 2 LSbs will be put into the ;Duty Cycle Bits (DC2B) of the CCP2CON register which are bits 5 and 4.
;So we need to shift these LSb into place and OR them with CCP2CON
; in order to save the control settings above and fill these last bits in banksel ADRESL
;ADRESL = b'xx000000' where 'xx' are the 2 LSbs from the ;ADC result
lsrf ADRESL, f ;ADRESL = b'0xx00000' lsrf ADRESL, f ;ADRESL = b'00xx0000' movf ADRESL, w ;now move into wreg banksel CCP2CON
xorwf CCP2CON, w ;move the 2 LSbs into place without disturbing the rest of ;CCP2CON settings
andlw B'00110000' xorwf CCP2CON, f
bra MainLoop ;do this forever
PICkit™ 3 スタータキット ユーザガイド
DS41628B_JP - p.72 2015 Microchip Technology Inc.