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の波形。