CCP/CCPモジュールの使い方 


【CCP/ECCPとは】

CCP(Capture/Compare/PWMの略)とECCP(Enhanced Capture/Compare/PWMの略)モジュールは、
F1ファミリではCCPが1組だけ実装されたものから、最大ECCPが3組、CCPが2組実装されているもの
があります。

キャプチャとコンペア機能はCCPとECCPで同じとなっています。
16ビットのレジスタと16ビットのコンパレータ(比較器)から構成されていて、タイマ1と組み合わせて、
キャプチャまたはコンペアの動作をします。
これに対し、PWM機能はCCPとECCPで大きく異なり、CCP側はタイマyと組み合わせてPWMモードで
単純なPWM信号を出力します。
ECCPによるPWMモードでは、4つの出力が出せるようになっており、デッドバンド付きの相補PWM信号
でハーフブリッジを構成したり、モータの可変速制御などに使うフルブリッジを構成できたりします。
また外部信号によるPWM自動シャットダウン機能なども組み込まれています。

【キャプチャ機能】

キャプチャ機能はCCP、ECCPで同じように動作し、CCPxピン(xは1から5のいずれかモジュールを
区別する)の信号をトリガにして、その瞬間のタイマ1の値を16ビットレジスタ(CCPRx)に記憶する機能
を持っています。
ただしこの時のタイマ1は同期モードでタイマかカウンタ動作としなければなりません。非同期モード
だと正常にキャプチャが働きません。
キャプチャモードの場合の内部構成は下図のようになっており、外部CCPxピンの入力のエッジトリガ
により、16ビットカウンタのTMR1の内容を記憶用レジスタであるCCPRxに取り込んで記憶します。
それと同時に割込み信号CCPxIFをセットし割込みを発生します。
キャプチャ後もタイマ1のカウントは休まず続けられます。外部入力にはプリスケーラが設けられており、
4回、16回のエッジごとにキャプチャさせることもできます。




キャプチャ機能の用途としては、例えば、下図のように入力パルスの立ち上がりエッジごとに
キャプチャを行うと、そのときのキャプチャ値の差を求めれば、パルスの周期の時間を測定することが
できます。実際にこれをUSARTのボーレートの測定などに使っています。

【コンペア機能】

CCP/ECCPモジュールをコンペアモードで使う時の構成は下図のようになります。このコンペアモードでは、
タイマ1のカウント値が、あらかじめCCPRxレジスタに設定した値と同じになったとき、CCPxIFの割込みを
発生させると同時に、CCPxピンに出力をする機能を持っています。
またスペシャルイベントトリガとして内部にトリガ信号を出力し、タイマのリセットや、A/Dコンバータ側で
設定していればA/Dコンバータのスタートをさせることができます。
ただしこの場合には割り込み発生と外部出力(CCPxピン)制御機能は働きません。


コンペア動作は、まずタイマ1を同期モードで動作させておきます。
(タイマを非同期モードとするとコンペアモードは正常に動作しません。)
このカウントアップ動作中は、あらかじめ設定されたコンペアレジスタ(CCPRx)の内容とタイマのカウンタが
常にコンパレータで比較され、同じになった時、割込み信号CCPxIFを発生させ、同時にCCPxピンにHigh
またはLowの信号を出力することができます。

また、コンペアが一致した時、タイマ1のカウンタを0クリアする機能もあります。これを行うのがスペシャル
イベントトリガ信号で、A/D変換をスタートさせることもできます。
コンペアモードの用途としては、指定した時間幅を持つワンショットのパルス出力を出力するような場合に
使われます。これで遅延パルスの生成などが可能です。
CCP2側のスペシャルイベントトリガを使うと、一定の間隔でアナログ信号を取り込んでA/D変換することが
できますから、音声の入力などを行うことができます。

【単純PWM機能】

CCPモジュール、ECCPモジュールの単純PWM( Pulse Width Modulation(パルス幅変調))モードでの
使い方を説明します。
まずPWM(パルス幅変調)とは何のことでしょうか。基本的な原理は、周期を一定にして、パルスの
「1」と「0」の割合を可変にすることで、通電する時間の平均のエネルギーを可変制御しようとするものです。

CCP/ECCPモジュールのPWMモードでの時間の制御はタイマy (yは2、4、6のいずれか)に依存しています。
従って、CCPの動作はタイマyと一緒にして考える必要があります。
PWMモードの時のCCPの内部構成は下図のようになり、少し複雑な関係になっています。


動作としては、まず、TMRyは常時PICのクロック(Tosc/4)でカウントアップ動作をしています。PWM動作の
場合TMR2の前段に2ビットのプリスケーラが挿入されて10ビットの動作をします。

このときのPWM動作は下図のようになります。
PWMの出力パルスの周期は、PRyレジスタで決定されます。PRyとTMRyの上位8ビットは常に周期コンパレータ
で比較されており、両者の値が一致すると、コンパレータから出る出力で、TMRyは0クリアされてカウント動作を
最初からやり直すことになります。
これと同時にCCPxピンの出力は「High」にセットされます。したがってTMRyは0からPRyの値までを繰り返します
ので一定周期でCCPx出力がHighにされることになります。

一方、デューティを決定するのがCCPRxLレジスタで、この内容が周期の始めにデューティレジスタ(CCPRxH)に
コピーされてデューティが初期化されます。(正確にはここでのCCPRxLレジスタはもともとのCCPRxLレジスタに
CCPxCONのDCxB1:DCxB0の2ビットが付加されたもの)
このデューティレジスタ(CCPRxH)とTMRy(10ビット)も常時デューティコンパレータで比較されており、一致すると
デューティコンパレータの出力でCCP出力が「Low」にリセットされます

したがって、PRyよりCCPRxHの上位8ビットの値が小さければ、CCP出力はHighとLowを一定周期で繰り返す
ことになります。この時のCCP出力の周期、HighとLowの割合(つまりデューティ比)とレジスタの関係は
下図に示したようになります。 つまりPRyで周期が決まり、CCPRxL+CCPxCON<5:4>の値を可変すれば、
デューティ比が自由に設定できることになります。



では、CCP出力とデューティの実際の設定の値と分解能はどのようになるでしょうか。
これはTMRyのクロックがベースになり、式で表現すると、下記となります。

 周期(μsec)=(PRy+1)×4×Tosc×(TMRyのプリスケール値)
 デューティ分解能 = TMRyの設定値 (Tosc:クロックパルス幅)


これを実際のクロック周波数に当てはめ、いくつかのケースでの実際の値を求めると下表のようになります。
周期の計算の仕方は上式に当てはめて例えば、クロック32MHzでPRy=0xFF(=255)、プリスケール=1なら
   周期=256×(4/32)μsec×1=32μsec →31.25kHz
クロック8MHzなら
   周期=256×(4/8)μsec×1=128μsec →7.81kHz
となります。同様にしていくつかのケースを求めます。

ここで注意が必要なことは、周期はPRy+1までカウントされますからPRy=0xFFのときは
(255+1)×4=1024ですから最大1024までカウントできます。
しかしデューティ設定は10ビット分解能でも1023までしか設定できませんから、10ビット分解能で
デューティを100%としても1クロック分だけLowパルスが出力されてしまいます。
これを避けるには、PRyの値を0xFFではなく0xFEとして、デューティを1020以上にすれば100%のとき
Lowパルスが出ないようにできます。



【ECCPモードのPWM機能】

ECCPモードでのPWMモードの使い方を説明します。
強化されたPWMモジュールの内部構成は下図のようになっていて、P1A、P1B、P1C、P1Dの4本の
出力ピンを制御して下記の4つの動作を行います。
いずれのモードの場合でも、ピンへの出力はアクティブHighかアクティブLowかを選択できますので、
外部論理はどちらでも使うことができます。

 ・単一PWM
 ・ハーフブリッジPWM
 ・フルブリッジPWM(正転)
 ・フルブリッジPWM(逆転)




 これらの4つのピンに対してモードごとに出力される信号は、アクティブHighの場合には下図のようになります。


単一PWMの場合は通常はP1AピンにだけPWM信号が出力されます。ただし下図に示すステアリングレジスタ
PSTRxCONレジスタの設定により同じPWM信号を4ピンのどれにでも指定して出力することができ、
複数ピンに同じPWM信号を出力することもできます。したがって同じPWM信号を最大4つ出力することができます。


ハーフブリッジの場合には上図に示したように、相補構成のPWM信号がP1AとP1Bに出力され、P1CとP1Dは
汎用のI/Oピンとなります。
この場合、ハーフブリッジの回路構成に示したように2個のトランジスタが直列になって電源とグランドに接続
されていますから、両方のトランジスタがオンオフを交代する際、トランジスタの動作遅れにより両方がオンに
なってしまう時間が発生し、貫通電流が流れて無駄な電気を消費したり最悪はトランジスタが破壊したりする
ことになります。これを避けるため、オンに切り替えるのを遅らせて両方がオフになる時間帯、つまりデッドバンドを
自動的に挿入するようになっています。デッドバンドの自動挿入は、バンド幅が設定できるようになっています。

フルブリッジの場合には、4つのピンに信号が出力されます。上図のフルブリッジの回路構成で示したように、
正転と逆転で出力される信号でブリッジの異なる対角にあるトランジスタがオンとなるような信号が出力され、
下側のトランジスタがPWMでドライブされます。
フルブリッジの場合には方向を切り替えるときだけ貫通電流の問題がありますが、通常動作中は貫通電流の
心配はありません。また、回転方向を切り替える場合はソフトウェアで回避すれば問題ありませんので、
フルブリッジの場合にはデッドバンドの自動挿入はありません。

ECCPモジュールのPWMには、異常時のPWMの自動シャットダウン機能が用意されています。
例えばモータがロックして過電流状態となった場合など緊急でPWMを停止させる必要がありますが、
この制御をソフトウェアで行うと時間がかかりすぎてダメージが大きくなりますので、外部異常信号の入力に
よりハードウェアで直接PWMをシャットダウンさせる機能です。
この自動シャットダウンの要因として、アナログコンパレータの出力と外部割り込みピンへのデジタル入力が
用意されていて、選択することができます。さらにシャットダウン時のPWM出力ピンの制御方法も選択できる
ようになっています。
これらのシャットダウン要因はレベル入力となっていますので、要因が続いている限りシャットダウンを継続します。
この要因が除かれたとき、PWM1CONレジスタのPRSENがセットされていれば自動的に再起動します。
このシャットダウンは、ECCPASEビットをソフトウェアでセットすることで手動でも制御できます。

【CCP/ECCPの制御レジスタ】

CCP、ECCPを制御するために用意されたレジスタには、下図のようなものがあります。
CCPxCONレジスタで基本的な動作モードを設定します。
CCPの場合とECCPの場合で異なるのはPWMモードの場合だけです。
PWMモードの場合には、CCPTMRS0とCCPTMR1レジスタで連携するタイマをタイマ2、タイマ4、タイマ6から
選択することができます。
さらにPWMモードの場合、PWMxCONレジスタでシャットダウン条件がなくなった後に自動的に再スタートするか、
手動スタートにするかを選択でき、さらにデッドバンド幅を設定することもできます。
CCPxASレジスタでは、ECCPのPWMモードのときのシャットダウン入力の選択と、シャットダウンの際の
制御内容を指定することができます。



【CCPの使い方】

CCPを単純PWMモードで使った簡単な例題が下記リストとなります。
この例題では、F1評価ボードを使用し、PWM出力でLEDを駆動しています。
4個のLEDが下記のように接続されていますので各CCPをPWMモードで使ってLEDの
調光制御をしています。LED3とLED4は同じECCP3に接続されていますのでステアリングレジスタ
を使って同じPWM信号を出力するようにします。

  LED1−−LATD1−−CCP4
  LED2−−LATE2−−CCP5
  LED3−−LATE1−−ECCP3 P3B
  LED4−−LATE0−−ECCP3 P3A


常時POTの電圧を入力してデューティ比に設定することで、連続的にデューティが可変できるように
しています。これで、POTをまわすと4個のLEDの明るさが連続的に変化します。
入出力ピンの初期設定後、タイマ2、A/Dコンバータ、各CCPの初期設定を行ってからタイマ2を
スタートさせてPWM出力を開始します。
メインループでは、POTの電圧を10ビットで入力し、それをそのまま各CCPのデューティとして
設定しています。これを永久に繰り返しています。


  ★★★ 例題プロジェクトのダウンロード ★★★