CCPのPWMモードでの使い方 

【CCP、PWMとは?】

ここでは、PICに内蔵している「CCPモジュール」の「PWMモード」での
使い方を説明しています。

   CCP = Compare/Capture/PWM
   PWM = Pulse Width Modulation(パルス幅変調)

PWM(パルス幅変調)とは何のことでしょうか? 
基本的な原理は、周期を一定にして、パルスの「1」と「0」の割合を可変
にすることで、平均のエネルギーを可変制御しようとするものです。

用途としては、いろいろありますが、下記などが代表的なものです。
  ・モータの速度制御
  ・モータの回転数制御
  ・データ伝送用の変調方式(ちょと意味合いが異なりますが)

【PWMの原理】

ここではモータの速度制御を例に、パルス幅変調の原理を説明します。
まず、PWM信号は下図のような一定周期の信号となっています。

ここで(a)と(b)を比べると、例えば、「H」の区間でモータがONとなり、「L」
の区間でOFFとなるとすれば、平均のONとするためのエネルギーは
ON区間の長い、つまりデューティの大きい(b)の方が多くなります。

この信号の繰り返し周期が、モータの回転数より十分早い速さ、つまり
高い周波数であれば、モータの回転エネルギーとしては平均電力で考
えられるため、(b)の方が高速回転をすることになります。
これを利用して、「H」の区間の幅を制御することで、平均電力を制御し
てモータの速度を制御することが出来ます。



【CCPの設定と動作】

CCPモジュールの動作は、その時間の制御はすべてTIMER2に依存
しています。従って、CCPの動作はTIMER2と一緒にして考える必要
があります。
この関連を図であらわしたのが下図で、少し複雑な関係になってい
ます。これで動作を説明します。


TMR2は常時PICのクロック(Tosc)でカウントアップ動作をしています。
プリスケーラの指定があるときにはTMR2の前段にプリスケーラが
挿入されます。

まず、PWMの出力パルスの一定周期は、PR2レジスタで設定します。
このPR2とTMR2の上位8ビットは常に比較器で比較されており、
両者の値が一致すると、比較器(Period Comparator)の出力で、
TMR2は0クリアされ、CCPの出力は「High」にセットされます。

同時に、デューティを設定するDC1レジスタ(10ビット)の内容が、
CCPRxHレジスタにコピーされてデューティが初期化されます。
 (DC1レジスタの中身はCCPRxLレジスタにCCPxCONの2ビットが
  付加されたものです。)
このデューティレジスタ(CCPRxH)とTMR2(10ビット)も常時比較され
ており、一致すると、比較器(Duty Comparaotr)の出力でCCP出力が
「Low]にリセットされます。
従って、PR2よりDC1の上位8ビットの値が小さければ、CCP出力は
HighとLowを一定周期で繰り返すことになります。
この時のCCP出力の周期とHighとLowの割合(つまりデューティ)の
関係は下図の様になります。



【実際のパルス幅と分解能】

では、CCP出力とデューティの実際の設定分解能はどのようになる
でしょうか?
これにはTMR2のクロックがベースになります。プリスケーラが設定
されていない(つまり「1」)の時は、TMR2に2ビットのPSが付加され
10ビットのカウンタとして動作し、入力クロックはToscとなりますが、
プリスケーラを使うときには、プリスケーラが付加されたカウンタとし
て動作し、入力クロックはToscの4倍となります。
これを式で表現すると、下記となります。

  周期=(PR2+1)×4Tosc×(TMR2のプリスケール値)

  デューティ=DC1×Tosc×(TMR2のプリスケール値)

結果として、実際の値は下表のようになります。

(1)PICのクロックが
20MHzの時
   周期=256×4×0.05μsec×1=51.2μsec=19.53kHz

PWMの周期(kHz)

1.22

4.88

19.53

39.06

78.12

156.3

208.3

プリスケーラ値

16

4

1

1

1

1

1

PR2の最大値

0xFF

0xFF

0xFF

0x7F

0x3F

0x1F

0x17

最大分解能(ビット) *1

10

10

10

9

8

7

5.5

 *1 この分解能はPR2より大きな値を設定できないため。
    PR2より大きな値をDC1に設定するとデューティは100%となる。

(2)PICのクロックが
10MHzの時
  周期=256×4×0.1μsec×1=102.4μsec=9.77kHz

PWMの周期(kHz)

0.6

2.44

9.77

19.53

39.0

78.12

104.1

プリスケーラ値

16

4

1

1

1

1

1

PR2の最大値

0xFF

0xFF

0xFF

0x7F

0x3F

0x1F

0x17

最大分解能(ビット)

10

10

10

9

8

7

5.5


上表のような実際の値となるが、実用域としては、上記いずれの
場合にも、黄色の枠の範囲となる。


【モータのPWM制御の実際】

実際のモータの速度制御をPWMで行う例を説明します。
ここで説明に使用するモータ制御の回路図は下図のようなものです。
この回路図は必要な部分だけしか描かれていませんので注意。
この他に、5V電源回路とか、その他のポートを使う回路とかが必要
になります。
この回路では、PIC16C73Aを使い、モータの制御には、MOSFETの
Hブリッジ回路を使用しています。
このMOSFETによる方法は、FETでの電圧ドロップを非常に少なく
することが可能で、最大効率でモータをドライブすることが出来ます。
またPWM制御には2チャンネルあるCCP出力を正転と逆転用にそれ
ぞれ使い、制御方法は、下記の様にします。
 
  正回転の時
   Q1をON(RC3をHigh)にして、Q4をCCP1でPWMドライブをします。
   これでモータに右から左に電流が流れることになります。
   Q2はOFF、Q3はCCP2のデューティ0でOFFのままとします。

  逆回転の時
   Q2をON(RC4をHigh)にして、Q3をCCP2でPWMドライブをします。
   これでモータに左から右に電流が流れることになり逆方向に
   回転します。
   Q1はOFF、Q4はCCP1のデューティ0でOFFのままとします。
    (モータ用の電源は外部からVmとGNDに加えます)

 



 

【Hブリッジ改良版】

上図のHブリッジには下記のような欠点があります。

(1)モータ用の電源が5V以上に出来ない。
(2)モータにかかる電圧はONゲート電圧が2V必要なため、5V-2V
  の最大3Vしかけられないので、2V分が無駄になってしまう。

上記欠点を解決した回路が下図です。 PWMの制御用のFETを
2SK2231とペアのP型MOS FETに変更し、さらにトランジスタを1段
追加してPICから制御出来るようにしました。
こうすることにより、モータ用電源Vmの電圧に制限が無くなるのと、
モータにかかる電圧がほとんど電源電圧Vmまでとすることが出来
ます。 これでVmを有効に使うことができます。





【PWMモードのレジスタ設定手順】

PWMモードでCCPモジュールを使うときの手順は下記の様にします。
また各レジスタの詳細は図のようになっています。
下記のレジスタ名中の「x」には1か2が入ります。つまり2個ある
CCPモジュールのどちらかを指定します。


(1) Bank1にセットする

(2) TRISCレジスタでCCP出力ポートを出力モードに設定する
  CCP1=RC2  CCP2=RC1 と対応します。このRC1,2を出力モード
  に設定しないとCCPの出力はピンに現れません。
  また1と2が逆のポート番号になっているので注意。

(3) TMR2のPR2レジスタに周期を設定する
  周期は最大8ビットの値です。上表から使う設定値を決めてセット
  します。

(4) Bank0に戻す

(5) CCPxCONレジスタでCCPの使用モードを設定する。
  使用モードはPWMですから、下位4ビットに11xxを設定します。
   (このxxは1でも0でもどちらでも良いという意味です。)
  上位4ビットはデューティ値をセットするので後からセットします。



(6) CCPRxLレジスタとCCPxCONレジスタにデューティ値を設定する。
  デューティ値は最大10ビットの値をセットしますが、まずCCPRxL
  レジスタにはデューティ値の上位8ビットをセットし、下位2ビットは
  前項のCCPxCONレジスタの上位2ビットにセットします。



(7) TMR2のプリスケール値を設定してタイマーをスタートさせる。
   PWMモードではポストスケーラは使いません。プリスケーラのみ
   設定します。同時にTMR2ONビットも1としてタイマーをスタート
   させるとCCPxが動作を開始します。


【プログラム例】

以下は実際のモータ速度制御のための制御部分のプログラム例
です。

(1) 初期化部分
  CCPをPWMモードで使うための初期設定です。
  周期は最大のFF、タイマ2はプリスケール値1で設定します。


;*******************************
; Initialize
;*******************************
INIT
    BSF   STATUS,RP0   ;Bank1に切り替え
    MOVLW  081H      ;RC1〜RC4を出力モードに
    MOVWF  TRISC     
;**** PWM setting ****
    MOVLW  0FFH      ;周期レジスタにFFをセット
    MOVWF  PR2      
    BCF   STATUS,RP0   ;Bank0に戻す
;**** H bridge set to stop mode *****

  BCF   PORTC,3     ;HブリッジをOffとする
  BCF   PORTC,4

;**** PWM mode setting ****
    MOVLW  0CH       ;PWM モード設定データ
    MOVWF  CCP1CON     ;CCP1CONの設定
    MOVWF  CCP2CON     ;CCP2CONの設定
;**** PWM DUTY initialize ****
    CLRF  CCPR1L     ;CCP1をデューティ0設定
    CLRF  CCPR2L     ;CCP2をデューティ0設定
;**** TIMER2 setting and start ****
    MOVLW  04H       ;TIMER2 on prescale=1
    MOVWF  T2CON      ;TIMER2スタート

  これ以降は他のプログラムが続く



(2) 回転制御部分
  このモータの回転制御はサブルーチンとなっています。
  回転数のデータを符号付2バイトで、SPDHとSPDLに格納してから、
  このサブルーチンをCALLします。
  ただし、PWMのデューティの分解能は10ビットですから、SPDLの
  下位5ビットは使われず、SPDHの下位7ビットとSPDLの上位3ビット
  の合計10ビットだけが使われます。
  サブルーチンの処理としては、まず一旦すべてのHブリッジの4個の
  素子をすべてOFFとしてから、SPDHの符号により、正回転か逆回転
  かを判断してそれぞれの処理を行います。

;***************************************
; Motor direction control subroutine
; Speed data are set in SPDH and SPDL
; 2 bytes data with sign.
; SPDH= sign + 7 bits data
; SPDL= 3 bits data + not used data
;***************************************
MOTOR
;**** まず一旦すべてをOFFとする *****
    BCF   PORTC,3     ;set Q1 off
    BCF   PORTC,4     ;set Q4 off
    CLRF  CCPR1L     ;set CCP1 to 0
    BCF   CCP1CON,CCP1X
    BCF   CCP1CON,CCP1Y
    CLRF  CCPR2L     ;set CCP2 to 0
    BCF   CCP2CON,CCP2X
    BCF   CCP2CON,CCP2Y
;**** SPDHの符号のチェック ***
    BTFSS  SPDH,7     ;check sign
    GOTO  NORMAL
    GOTO  REVERSE

;**** 逆回転制御 ****
REVERSE
;**** set new speed ****
    RLF   SPDL,W     ;shift SPDL
    RLF   SPDH,W     ;shift with carry
    MOVWF  CCPR2L     ;set CCP2

    BTFSS  SPDL,6     ;test 1 or 0
    BCF   CCP2CON,CCP2X 
    BTFSC  SPDL,6
    BSF   CCP2CON,CCP2X
    BTFSS  SPDL,5
    BCF   CCP2CON,CCP2Y
    BTFSC  SPDL,5
    BSF   CCP2CON,CCP2Y
;***** 回転開始 ****   
    BSF   PORTC,4     ;set Q4 on
    RETURN

;******* 正回転制御 ***
NORMAL
;**** set new speed data ****
    RLF   SPDL,W     ;shift SPDL
    RLF   SPDH,W     ;shift with carry
    MOVWF  CCPR1L     ;set CCP1

    BTFSS  SPDL,6
    BCF   CCP1CON,CCP1X
    BTFSC  SPDL,6
    BSF   CCP1CON,CCP1X
    BTFSS  SPDL,5
    BCF   CCP1CON,CCP1Y
    BTFSC  SPDL,5
    BSF   CCP1CON,CCP1Y
;**** 回転開始 *****
    BSF   PORTC,3     ;set Q1 on
    RETURN




     目次ページへ