PWM / タイマー1を使ってOC1Aピン(PB1)、OC1Bピン(PB2)からPWM波を出力する

今度はタイマー1 (16ビット)を使ってOC1Aピン(PB1)、OC1Bピン(PB2)からPWM波を出力する。タイマー1は16ビットタイマーであるがここでは8ビットモードにして使ってみる。

#include <avr/io.h>

/* 
タイマー1 (16ビット)を使ってOC1Aピン(PB1)、OC1Bピン(PB2)からPWM波を出力する。
*/

int main(){
  
    TCCR1A |= (1 << WGM10); // ウェーブフォームモードの設定。Fast PWM, 8-bitモード。
    TCCR1B |= (1 << WGM12);

    TCCR1B |= (1 << CS11) | (1 << CS10); // CPUクロック分周比の設定。ここでは64分周。PWM周波数は8MHz/64分周/256ステップ ≒ 488Hz。
    TCCR1A |= (1 << COM1A1); // 出力モードの設定。コンペアマッチ時にOC1Aピン(PB1)からLを出力、そのままカウントアップしてオーバーフロー時にHを出力。
    //TCCR1A |= (1 << COM1A1) | (1 << COM1A0); // インバーティングモード時は逆にコンペアマッチ時にH、オーバーフロー時にL。
    TCCR1A |= (1 << COM1B1); // 出力モードの設定。コンペアマッチ時にOC1Bピン(PDB2)からLを出力、そのままカウントアップしてオーバーフロー時にHを出力。
    //TCCR1A |= (1 << COM1B1) | (1 << COM1B0); // インバーティングモード時は逆にコンペアマッチ時にH、オーバーフロー時にL。
    
    DDRB |= (1 << PB1) | (1 << PB2); // タイマーを設定するだけではダメであって、当該ピンのIOをOUTにしなければならない。

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

    return 0;
}

黄色がOC1Aピン(PB1)、緑色がOC1Bピン(PB2)から出力したPWM波。
f:id:ti-nspire:20190801075727p:plain:h300 f:id:ti-nspire:20190801082416p:plain:h300

f:id:ti-nspire:20190801080118p:plain:w500
f:id:ti-nspire:20190801080152p:plain:w500
f:id:ti-nspire:20190801080243p:plain:w500

f:id:ti-nspire:20190801080314p:plain:w500
f:id:ti-nspire:20190801080341p:plain:w500