PIC16F873には特殊な機能としてCCP機能があります。これはキャプチャ(Capture)、コンペア(Compare)、PWM(Pulse Width Modulation)の頭文字から採った名前です。PIC16F873はCCPモジュールを2つ持っています。
キャプチャおよびコンペアはタイマー1を使用して動作し、PWMはタイマー2を使用して動作します。 CCP1とCCP2は同時に動作させることができますが、両方ともタイマー1またはタイマー2を使用しているので、使用に際してはそれらを考慮する必要があります。両CCPの使用条件は以下のようになります。
コンペア(比較)モードで内容の一致が発生するとトリガ信号によりタイマー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レジスタにより必ず入力モードに設定する必要があります。出力モードに設定した場合、出力データの条件がキャプチャ条件になります。
キャプチャモードを使用する場合、タイマー1は必ず同期式のタイマーモードで動作させる必要があります。非同期の場合にはキャプチャ機能は動作しません。キャプチャモードを解除するときには誤動作を防止するためにPIE1レジスタのCCP1IEビットおよびPIR1レジスタのCCP1IFビットをクリアする必要があります。 コンペアモード コンペアモードではCCPR1レジスタの内容とタイマー1(TMR1)の内容が常に比較されます。
コンペアモードを使用する場合、タイマー1は必ず同期式のタイマーモードで動作させる必要があります。非同期の場合にはキャプチャ機能は動作しません。 PWMモード PWM(Pulse Width Modulation)モードではCCP1(pin13)に連続的なパルス信号を出力することができます。
パルスの周期はPR2の設定値、発振器の発振周波数、タイマー2のプリスケーラ値により決まります。 また、パルスのデューティ(Hレベルの時間)はCCPR1LレジスタおよびCCP1CONレジスタのCCP1XビットおよびCCP1Yビット、発振器の発振周波数、タイマー2のプリスケーラ値により決まります。 CCPR1Lレジスタの内容が上位の8ビットとして使用され、CCP1Xビットが第2ビット目、CCP1Yビットが第1ビット目として使用されます。デューティ制御の最小単位は発振器の周期時間です。10MHzの時には0.1マイクロ秒になります。デューティの最大分解能力は1024です。 PWM周期よりデューティ時間を長く設定すると出力は常にHレベルになります。PWMのデューティ指定を0に設定すると出力は常にLレベルになります。
パルスの周期はTRM2とPR2が一致するまでの時間で、以下の式で計算できます。 PWM周期 = (PR2の値+1)x 4 x 発振器周期 x タイマー2のプリスケーラ値
デューティ時間は出力パルスがHレベルになっている時間で、以下の式で計算できます。 PWMデューティ時間 = ( CCPR1L+CCP1X+CCP1Y(10ビット) ) x 発振器周期 x タイマー2のプリスケーラ値
PWM周期の計算例1と比べるとPWM周期の1/1024だけ短い値になります。 PWMデューティはPWM周期に対して1024分割の精度で制御できることが分かります。
PWMデューティの最小値は発振器周期であることが分かります。 CCPR1L+CCP1X+CCP1Yの内容はいつでも書き換えはできますが、内容が反映されるのは次の周期からです。 PWMモードではCCPR1Hレジスタは読み出し専用になります。 PWMモードの設定手順は以下のように行います。 |