CCPの使い方


【CCP】

CCP(Capture/Compare/PWM)は、16ビットのCCPRレジスタを使って、Capture、
Compare、PWM Duty Cycleの3つの機能を果たすようにしたものです。
 (PWM:Pulse Width Modulation)
いずれもタイマー1とタイマー3と連動して機能を実現しています。
これら3つの機能により内部ハードウェア構成が変わります。

PIC18Fxxxxシリーズには、このCCPモジュールが2組内蔵されていますが、2つの
使い方は下記のように制限されます。

機能の組合せ 制限 タイマーの組合せ
両方ともCapture機能 タイマー1、タイマー3どちらとの組合せも自由
両方ともCompare機能 タイマー1、タイマー3どちらとの組合せも自由
Special Event Triggerでどちらをリセットするかは選択
Capture機能とCompare機能 どちらの機能も自由に指定可能
タイマー1、タイマー3どちらとの組合せも自由
Special Event Triggerでどちらをリセットするかは選択
両方ともPWM機能 タイマー2と連動
Capture機能とPWM機能 × PWMと他との組合せは不可
Compare機能とPWM機能 ×

【CCPxCONレジスタ】

CCPの機能を設定するためのレジスタは「CCP1CONレジスタ」と「CCP2CON
レジスタ」となります。
両者の内容は全く同じで2つのCCPモジュールに対応しています。
下位4ビットでCCPモジュールの動作モードを設定します。




【Capture機能】

Capture機能を設定した場合のCCPモジュールの内部構成は、下図のように
なります。
CCPR1H、CCPR1L と CCPR2H、CCPR2LがCCPのレジスタで、外部ピンからの
パルスが入力した瞬間に、その時のタイマー1かタイマー3の値をこれらのレジスタ
にコピーします。つまりストップウォッチと同じ機能を果たします。
入力パルスの条件が指定でき、エッジの立上り、立下りと回数が指定できます。
またタイマー1とタイマー3のどちらをコピーするかもCCP1,2それぞれ独立に指定
できます。このコピーと同時に割込みも発生します。





《使い方テクニック》
 このCapture機能を使って、CCP1,2でパルスの立上りと立下りのそれぞれを
 Capureすると、その値の差からパルスの幅を測定することができます。
 タイマーはクロックの1/4の速度でカウントアップしているので、この時間を
 最小単位にして測ることができます。

【Compare機能】

Compareモードに設定した場合のCCPモジュールの構成は下図のようになります。
CCPRレジスタに設定した値と、タイマー1またはタイマー3の値を常時比較していて
同じになったら割込みを発生すると同時に、下記のような機能のいずれかを実行します。
どれを実行するかはCCPxCONレジスタの設定により決まります。
 (1) 出力ピンの0、1を反転する。
 (2) 出力ピンをLowにする。
 (3) 出力ピンをHighにする。
 (4) Special Event Triggerとして、タイマー1またはタイマー3をクリアする。
   同時に、A.D変換モジュールをスタートさせる。





【PWM機能】

PWMモードにしたときのCCPの内部構成は下図のようになります。
全体が大きく2つのブロックに別れ、上側のブロックは、デューティ比を決める
値の設定を行い、下側は、繰返し周期を決める設定を行います。






全体の動作は、まず、TMR2とプリスケーラで構成されたタイマー2がシステム
クロックで常時カウントアップ動作をしています。
このタイマー2の値と、下側のPR2レジスタに設定された値が常時周期コンパレータ
で比較されていて、同じになった時点でタイマー2がクリアされると同時に、出力
フリップフロップがセットされ出力がHighとなります。 これで下図のように毎回の
周期の始めで出力が一旦Highとなります。
次に、CCPRxLレジスタにCCPxCONレジスタの2ビットを追加した10ビットで、
デューティを設定します。
この値は毎回のタイマー2のクリアのタイミングでCCPRxHにコピーされ、その値と
タイマー2の値が常時デューティコンパレータで比較されます。
ここで、値が一致した時点で、出力フリップフロップがリセットされ出力がLowに
なります。
従って、CCPRxLに設定した値が、PR2に設定した値より小さければ、周期の
途中で出力ピンがHighからLowに変わることになります。
これであるデューティ比の連続パルスが出力されることになります。




ここで、実際の周波数とデューティの値は下記式で求めることができます。
 《周期の求め方》
   Cycle = (CCPRxL:CCPxCON<5:4>)×Tosc×TMR2プリスケール値

  実際にクロックが40MHzの時に求めた値の例は下表のようになります。
 この結果から10ビットの分解能の時は、39kHzが最高周期ということになります。

PWM周波数(kHz) 2.44 9.77 39.06 156.25 312.50 416.67
タイマー2
プリスケール値
16 4 1 1 1 1
PR2の値 FF FF FF 3F 1F 17
最大分解能(ビット) 10 10 10 8 7 6.58

【PWM設定手順】

実際にCCPをPWMモードで動かす時には、下記ステップで設定します。

(1) PR2レジスタに設定する値でPWM周期を設定する。

(2) 必要なデューティとなる値をCCPRxLレジスタとCCPxCONレジスタの
  2ビットに設定する。
(3) CCPxの出力を可能にするため、ポートのTRISレジスタで出力モード
  にする。
(4) タイマー2のTMR2レジスタに初期値を、T2CONレジスタに動作モードを
  設定する。
(5) CCPxCONレジスタでPWMモードに設定する。


【CCP用C言語ライブラリ】

CCS社のPCHコンパイラに用意されているCCPモジュール用の組込み関数は
下表のようになっています。

組込み関数書式 機 能 内 容

setup_ccp1(mode)
setup_ccp2(mode)

CCPの動作モードを初期設定します。
modeには下記の値を指定します。
 CCP_OFF 0
 CCP_CAPTURE_FE、      CCP_CAPTURE_RE
 CCP_CAPTURE_DIV_4、    CCP_CAPTURE_DIV_16
 CCP_COMPARE_SET_ON_MATCH
 CCP_COMPARE_CLR_ON_MATCH
 CCP_COMPARE_INT
 CCP_COMPARE_INT_AND_TOGGLE
 CCP_COMPARE_RESET_TIMER
 CCP_PWM
 CCP_PWM_PLUS_1、   CCP_PWM_PLUS_2
 CCP_PWM_PLUS_3、   CCP_USE_TIMER3

set_pwm1_duty(value)
set_pwm2_duty(value)

デューティ値をデューティカウンタに設定します。
valueのデータ型によって8ビットモードと
10ビットの高解像度モードを自動切替しています。
  int型  → 8ビットモード
  long型 → 10ビットモード

setup_timer_2(mode,
  period, postscale)

タイマ2の設定でperiodを設定することでパルスの周期を設定する。
modeは下記値を取る
 プリスケール値設定とスタート制御
 T2_DISABLED  T2_DIV_BY_1  T2_DIV_BY_4  T2_DIV_BY_16

periodは8ビット値で00からFFまでのバイナリ値。
前項の表のPR2値を参照。

postscaleは1-16の値で、何回タイマーがリセットされたら割込みを
発生するかを指定します。これは通常は「1」としておきます。

CCP_1
CCP_2

CCPのカウンター(CCPRxH,Lレジスタ)の、アクセス用の変数です。
但し16ビットなのでlongで扱う必要があります。






  トップページへ