ECCPはHブリッジのPWMドライバとして、フルブリッジ、ハーフブリッジで使用できますが、通常のCCPと同様にシングルチャンネルのPWMとしても使用できます。そこで引っかかったことを忘れないうちに記述しておきます。
●出力が反転している
カラーLEDのRGBをPWMで駆動するのに、3チャンネルのPWMが必要になり、16F1829で試作しているときのことです。このMCUはECCPが2つ、CCPが2つ、合計4つのCCPがあります。
今回、ECCP1, ECCP2, CCP4の3チャンネルをPWMに設定して使うことにしました。で、思ったような色がでないので、調べてみると、2チャンネルのECCPのPWMの出力が反転していました。
その時のCCP初期化プログラム
// ECCP1 (R) CCP1M3 = 1; // (11xx) PWM CCP1M2 = 1; // CCP1M1 = 1; // CCP1M0 = 1; // P1M1 = 0; // (00) single output P1M0 = 0; // // ECCP2 (G) CCP2M3 = 1; // (11xx) PWM CCP2M2 = 1; // CCP2M1 = 1; // CCP2M0 = 1; // P2M1 = 0; // (00) single output P2M0 = 0; // CCP4 (B) CCP4M3 = 1; // (11xx) PWM CCP4M2 = 1; // CCP4M1 = 1; // don't care CCP4M0 = 1; // don't care // 周期用タイマ アサイン C1TSEL1 = 0; // TIMER2 (00) C1TSEL0 = 0; C2TSEL1 = 0; // TIMER2 (00) C2TSEL0 = 0; C4TSEL1 = 0; // TIMER2 (00) C4TSEL0 = 0; // PWM周期 16MHz / ((255+1)*4*64) = 244Hz // TIMER2設定 PR2bits.PR2 = 0xFF; // T2周期 TMR2IF = 0; T2CKPS1 = 1; // TIMER2 プリスケーラ 1:64 T2CKPS0 = 1; TMR2ON = 1; // TIMER2 ON TRISC5 = 0; // CCP1 RC5 R-PWM出力 TRISC3 = 0; // CCP2 RC3 G-PWM出力 TRISC6 = 0; // CCP4 RC6 B-PWM出力
PWMの周期は3チャンネルとも同じなので、3つのCCPでTIMER2を共用しています。
CCPモードを設定するCCPxM<1:0>は、CCPではPWM設定時はdon’t careなので、とりあえず、”11″を設定していました。
ECCPではPxM<1:0>を”00″に設定するとブリッジではなく、シンブルモード(ノーマルCPPと同じ)に設定されます。CCPxM<1:0>はノーマルCCPと同様に”11″を設定していましたが、これが間違いの元でした。
●PWM STEERING MODE
マニュアルを眺めていると、こういうモードがあるのに気が付きました。どうも、PWMのブリッジドライブ出力を一時的に汎用ポートに切り替えて、強制的に直接ドライブするためのものみたいです。
該当箇所の等価回路図を16F1829のマニュアルから引用します。DS41440B-page 233
これを見て、論理反転している理由がわかりました。
STRxAはリセット直後は”1″に設定されるため、PxA Singnal(CCPの出力)はExORを通してPxAピン(PWM出力ピン)へ出力されます。で、CCPxM1を”1″にすると、このExORはインバータとして働きます。つまり、論理反転することになります。
これに気づくのに数時間かかりましたが、CCPxM1を”0″にすることにより解決しました。前述のソースでは、4行目と12行目の設定値を”0″に修正します。
解決。