PIC ECCPをシングルPWMとして使う

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

PWM_STEERING_MODE

これを見て、論理反転している理由がわかりました。

STRxAはリセット直後は”1″に設定されるため、PxA Singnal(CCPの出力)はExORを通してPxAピン(PWM出力ピン)へ出力されます。で、CCPxM1を”1″にすると、このExORはインバータとして働きます。つまり、論理反転することになります。

これに気づくのに数時間かかりましたが、CCPxM1を”0″にすることにより解決しました。前述のソースでは、4行目と12行目の設定値を”0″に修正します。

解決。

コメントは受け付けていません。