サーボの駆動 / タイマー1を16ビットFast PWMモードで使う

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

#include <avr/io.h>

int main(){
    // ウェーブフォームモードの設定。16ビット、Fast PWMモード。TOP値はICR1(input capture register 1)に設定する。
    TCCR1A |= (1 << WGM11);
    TCCR1B |= (1 << WGM12) | (1 << WGM13);

    // 分周比の設定。CPUクロック8MHzを8分周する。これでタイマー1の1ティックが1us(計算しやすい値)になる。
    TCCR1B |= (1 << CS11);
    
    // タイマー1のTOP値の設定。これでタイマー1自体の周期が20000us(=20ms)になる。
    ICR1 = 20000;

    // 出力モードの設定。コンペア値A(OCR1A)とのマッチ時にOC1Aピン(PB1)をLに、0に戻ったときにHにする。
    TCCR1A |= (1 << COM1A1);
    
    // 出力モードの設定。コンペア値B(OCR1B)とのマッチ時にOC1Bピン(PB2)をLに、0に戻ったときにHにする。
    TCCR1A |= (1 << COM1B1);

    // コンペア値A(OCR1A)の設定。これでOC1Aピン(PB1)から出力されるパルスのパルス幅が500usになる。
    OCR1A = 500;

    // コンペア値B(OCR1B)の設定。これでOC1Bピン(PB2)から出力されるパルスのパルス幅が2000usになる。
    OCR1B = 2000;

    // 当該ピンのIOをOUTにする。
    DDRB |= (1 << PB1) | (1 << PB2);

    return 0;
}

黄色がPB1の波形、緑がPB2の波形。
f:id:ti-nspire:20190827071041p:plain:h350 f:id:ti-nspire:20190827071339j:plain:h350