目次PIC入門873ハード

PIC16F873のCCP機能

PIC16F873には特殊な機能としてCCP機能があります。これはキャプチャ(Capture)、コンペア(Compare)、PWM(Pulse Width Modulation)の頭文字から採った名前です。PIC16F873はCCPモジュールを2つ持っています。

キャプチャ機能 外部からの信号が入力されたときにタイマー1の値を読み込む機能です。
周波数カウンターとか信号の周期時間などの計測に利用できます。
コンペア機能 CCPRxレジスタの設定値とタイマー1の値を比較する機能です。
周期的に割り込みを発生させる場合などに便利です。
PWM機能周期的なパルスを発生させる機能です。パルス幅(デューティ)を変化させて外部回路を制御するのに使用します。


キャプチャおよびコンペアはタイマー1を使用して動作し、PWMはタイマー2を使用して動作します。
CCP1とCCP2は同時に動作させることができますが、両方ともタイマー1またはタイマー2を使用しているので、使用に際してはそれらを考慮する必要があります。両CCPの使用条件は以下のようになります。

CCP1CCP2制約条件
キャプチャキャプチャ タイマー1が共通です。
キャプチャした時点のタイマー値は異なりますが、同時に使用することができます。
キャプチャコンペア コンペア動作でタイマー1がクリアされます。
コンペアでタイマーがクリアされるので、CCP1でのキャプチャは使用しない方が良いです。
キャプチャPWMタイマー1とタイマー2が別なので特に制約はありません。
コンペアキャプチャ コンペア動作でタイマー1がクリアされます。
コンペアでタイマーがクリアされるので、CCP2でのキャプチャは使用しない方が良いです。
コンペアコンペア いずれかのコンペア動作でタイマー1がクリアされます。
ですから、同時に使用することはできません。
コンペアPWMタイマー1とタイマー2が別なので特に制約はありません。
PWMキャプチャタイマー1とタイマー2が別なので特に制約はありません。
PWMコンペアタイマー1とタイマー2が別なので特に制約はありません。
PWMPWMタイマー2が共通なので同じ設定値で動作します。


CCP1用のレジスタ(CCPR1)は8ビットのCCPR1Lレジスタ(下位バイト)とCCPR1Hレジスタ(上位バイト)とで構成されています。CCP1の動作はCCP1CONレジスタで制御することができます。
コンペア(比較)モードで内容の一致が発生するとトリガ信号によりタイマー1がリセットされます。

CCP2用のレジスタ(CCPR2)も8ビットのCCPR2LレジスタとCCPR2Hレジスタで構成されています。CCP2の動作はCCP2CONレジスタで制御することができます。
CCP2の場合、コンペアモードで内容の一致が発生するとトリガ信号によるタイマー1のリセット動作はCCP1と同じですが、CCP2ではさらにA/Dコンバータを使用している場合にはA/Dコンバータをスタートさせます。

以下の説明ではCCP1を対象に説明をします。CCP2での違いは説明の中で記載しています。




キャプチャモード

キャプチャモードではRC2/CCP1ピン(pin13)の変化が発生したときにタイマー1の内容をCCPR1レジスタ(CCPR1HとCCPR1L)に取り込みます。RC2/CCP1ピンはTRISCレジスタにより必ず入力モードに設定する必要があります。出力モードに設定した場合、出力データの条件がキャプチャ条件になります。

変化検出には以下のようなタイプを指定することができます。これらの指定はCCP1CONレジスタのCCP1M0ビットからCCP1M3ビットまでの4ビットで指定することができます。

CCP1M3-0制御内容
0000CCPを使用しない
0100入力信号の立ち下がり毎にトリガ
0101入力信号の立ち上がり毎にトリガ
0110入力信号の4回目の立ち上がり毎にトリガ
0111入力信号の16回目の立ち上がり毎にトリガ

キャプチャが行われるとPIR1レジスタのCCP1IFビットがセットされ、割り込みが発生します。CCP1IFビットは他の割り込みと同様にソフトウェアでクリアする必要があります。CCPR1にキャプチャされたデータを読む前に次のキャプチャが行われた場合、古いデータは無くなります。

キャプチャモードを使用する場合、タイマー1は必ず同期式のタイマーモードで動作させる必要があります。非同期の場合にはキャプチャ機能は動作しません。キャプチャモードを解除するときには誤動作を防止するためにPIE1レジスタのCCP1IEビットおよびPIR1レジスタのCCP1IFビットをクリアする必要があります。




コンペアモード

コンペアモードではCCPR1レジスタの内容とタイマー1(TMR1)の内容が常に比較されます。


内容が一致するとCCP1CONレジスタのCCP1M0ビットからCCP1M3ビットの内容により以下の動作をします。

CCP1M3-0制御内容
1000 一致時にRC2/CCP1(pin13)をHレベルに設定
PIR1レジスタのCCP1IFビットが設定され、割り込みが発生
1001 一致時にRC2/CCP1(pin13)をLレベルに設定
PIR1レジスタのCCP1IFビットが設定され、割り込みが発生
1010 RC2/CCP1ピンの状態は変化しない
PIR1レジスタのCCP1IFビットが設定され、割り込みが発生
1011 特殊トリガ信号を発生させる
RC2/CCP1ピンの状態は変化しない
PIR1レジスタのCCP1IFビットが設定され、割り込みが発生
CCP1の場合、タイマー1をリセット
CCP2の場合、タイマー1をリセットすると同時に、A/Dコンバータを起動

RC2/CCP1ピンはTRISCレジスタにより必ず出力モードに設定する必要があります。
コンペアモードを使用する場合、タイマー1は必ず同期式のタイマーモードで動作させる必要があります。非同期の場合にはキャプチャ機能は動作しません。




PWMモード
PWM(Pulse Width Modulation)モードではCCP1(pin13)に連続的なパルス信号を出力することができます。

PWMモードを使用するためにはCCP1CONレジスタのCCP1M3ビットおよびCCP1M2ビットを1に設定します。

CCP1M3-0制御内容
11xxPWMモード

このモードではTRISCレジスタのCCP1に該当するビットを0にして出力モードにする必要があります。
パルスの周期はPR2の設定値、発振器の発振周波数、タイマー2のプリスケーラ値により決まります。
また、パルスのデューティ(Hレベルの時間)はCCPR1LレジスタおよびCCP1CONレジスタのCCP1XビットおよびCCP1Yビット、発振器の発振周波数、タイマー2のプリスケーラ値により決まります。
CCPR1Lレジスタの内容が上位の8ビットとして使用され、CCP1Xビットが第2ビット目、CCP1Yビットが第1ビット目として使用されます。デューティ制御の最小単位は発振器の周期時間です。10MHzの時には0.1マイクロ秒になります。デューティの最大分解能力は1024です。
PWM周期よりデューティ時間を長く設定すると出力は常にHレベルになります。PWMのデューティ指定を0に設定すると出力は常にLレベルになります。
    PWM周期
    パルスの周期はTRM2とPR2が一致するまでの時間で、以下の式で計算できます。

    PWM周期
    = (PR2の値+1)x 4 x 発振器周期 x タイマー2のプリスケーラ値

    計算例1(10MHzでの最大周期)
      条件
        PR2 = 255
        発振器周期 = 0.1マイクロ秒 ( 10MHzクロック )
        タイマー2のプリスケーラ値 = 16
    PWM周期= ( 255+1 ) x 4 x 0.1 x 10-6 x 16

    = 1638.4 x 10-6

    = 1.6384 x 10-3

    = 1.6384 _秒 ( = 610Hz )

    計算例2(10MHzでの最小周期)
      条件
        PR2 = 0
        発振器周期 = 0.1マイクロ秒 ( 10MHzクロック )
        タイマー2のプリスケーラ値 = 1
    PWM周期= 1 x 4 x 0.1 x 10-6 x 1

    = 0.4 x 10-6

    = 0.4 マイクロ秒 ( = 2.5MHz )



    PWMデューティ
    デューティ時間は出力パルスがHレベルになっている時間で、以下の式で計算できます。

    PWMデューティ時間
    = ( CCPR1L+CCP1X+CCP1Y(10ビット) ) x 発振器周期 x タイマー2のプリスケーラ値

    計算例3(10MHzでの最大デューティ時間)
      条件
        CCPR1L+CCP1X+CCP1Y = 1023
        発振器周期 = 0.1マイクロ秒 ( 10MHzクロック )
        タイマー2のプリスケーラ値 = 16
    PWMデューティ= 1023 x 0.1 x 10-6 x 16

    = 1636.8 x 10-6

    = 1.6368 x 10-3

    = 1.6368 _秒

    PWM周期の計算例1と比べるとPWM周期の1/1024だけ短い値になります。
    PWMデューティはPWM周期に対して1024分割の精度で制御できることが分かります。

    計算例4(10MHzでの最小デューティ時間)
      条件
        CCPR1L+CCP1X+CCP1Y = 1
        発振器周期 = 0.1マイクロ秒 ( 10MHzクロック )
        タイマー2のプリスケーラ値 = 1
    PWMデューティ= 1 x 0.1 x 10-6 x 1

    = 0.1 x 10-6

    = 0.1 マイクロ秒

    PWMデューティの最小値は発振器周期であることが分かります。

    CCPR1L+CCP1X+CCP1Yの内容はいつでも書き換えはできますが、内容が反映されるのは次の周期からです。
    PWMモードではCCPR1Hレジスタは読み出し専用になります。

    PWMモードの設定手順は以下のように行います。
    1. PWM周期をPR2レジスタに設定
    2. PWMデューティをCCPR1LレジスタおよびCCP1CONレジスタに設定
    3. CCP1(pin13)のモードをTRISCレジスタで出力モードに設定
    4. タイマー2のプリスケーラ値をT2CONレジスタに設定
    5. CCP1CONレジスタのCCP1M3ビットおよびCCP1M2ビットをPWMモード(11xx)に設定