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