今度はタイマー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波。