PWM / タイマー2を使ってOC2Aピン(PB3)、OC2Bピン(PD3)からPWM波を出力する

今度はタイマー2 (8ビット)を使ってOC2Aピン(PB3)、OC2Bピン(PD3)からPWM波を出力する。タイマー0 (8ビット)とほぼ同じである。

#include <avr/io.h>

/* 
タイマー2 (8ビット)を使ってOC2Aピン(PB3)、OC2Bピン(PD3)からPWM波を出力する。
*/

int main(){
  
    TCCR2A |= (1 << WGM21) | (1 << WGM20); // ウェーブフォームモードの設定。Fast PWMモード。
    TCCR2B |= (1 << CS22);                 // CPUクロック分周比の設定。ここでは64分周。PWM周波数は8MHz/64分周/256ステップ ≒ 488Hz。
    TCCR2A |= (1 << COM2A1); // 出力モードの設定。コンペアマッチ時にOC2Aピン(PB3)からLを出力、そのままカウントアップしてオーバーフロー時にHを出力。
    //TCCR2A |= (1 << COM2A1) | (1 << COM2A0); // インバーティングモード時は逆にコンペアマッチ時にH、オーバーフロー時にL。
    TCCR2A |= (1 << COM2B1); // 出力モードの設定。コンペアマッチ時にOC2Bピン(PD3)からLを出力、そのままカウントアップしてオーバーフロー時にHを出力。
    //TCCR2A |= (1 << COM2B1) | (1 << COM2B0); // インバーティングモード時は逆にコンペアマッチ時にH、オーバーフロー時にL。
    
    DDRB |= (1 << PB3); // タイマーを設定するだけではダメであって、当該ピンのIOをOUTにしなければならない。
    DDRD |= (1 << PD3); // タイマーを設定するだけではダメであって、当該ピンのIOをOUTにしなければならない。

    OCR2A = 127; // Output Compare Register AにOC2Aピン(PB3)用のコンペア値を設定する。
    OCR2B = 0;   // Output Compare Register BにOC2Bピン(PD3)用のコンペア値を設定する。
                 // コンペア値を0にしても、オーバーフロー時にHが出力され、その後にコンペアマッチするので、1/256 (約0.39%)の時間だけHが出力される。

    return 0;
}

黄色がOC2Aピン(PB3)、緑色がOC2Bピン(PD3)から出力したPWM波。
f:id:ti-nspire:20190801073004p:plain:w500

f:id:ti-nspire:20190801073108p:plain:w500
f:id:ti-nspire:20190801073138p:plain:w500
f:id:ti-nspire:20190801073213p:plain:w500
f:id:ti-nspire:20190801073242p:plain:w500

f:id:ti-nspire:20190801073312p:plain:w500
f:id:ti-nspire:20190801073354p:plain:w500