{{publish any}} {{tag AVR,ATTiny45,PWM}} !header AVRのATTiny45は、8ピンなのにPWM出力が3系統もあるらしいので、3色LEDをPWM駆動して実験してみます。 !body データシートを見てみるとタイマ0とタイマ1でそれぞれ2系統で合計4系統のPWMが得られるように読めますが、いろいろ試したところ3系統までのようです。(つーか、よくわかりません) オシロスコープで波形を確認したところ、デューティ比を3系統までは単独で制御できるようです。ただ、タイマは2系統なのでPWM周波数は2種類までとなります。 とりあえず、3色LEDをつないで、各色を単独でPWM制御してみます。 {{image DSC01212.jpg,,,size:45%}} といっても、静止画じゃよくわからんですけど、1秒ごとに各色のPWMのデューティ比を乱数変化させるようにしてみました。 参考までにAVRStudio4でWinAVR(GCC)を使用して作ったソースです。 {{code CSharp,4,0 #include #include void delay_ms(unsigned int t) { while (t--) _delay_ms(1); } int main(void) { DDRB =_BV(PB0)|_BV(PB1)|_BV(PB4); TCCR0A =_BV(WGM01)|_BV(WGM00)|_BV(COM0A1)|_BV(COM0B1); TCCR0B = 2; // Timer0 CLK/8 TCCR1 = 4; // Timer1 CK/8 GTCCR = _BV(PWM1B)|_BV(COM1B1); // PWM1B動作許可 while(1) { OCR0A = (int)(rand() - 1) / 128; OCR0B = (int)(rand() - 1) / 128; OCR1B = (int)(rand() - 1) / 128; delay_ms(1000); } } }} ATTiny45は、内蔵RC発振器による8MHzのクロックで動作させます。プリスケーラは、タイマ1とタイマ2ともクロックの1/8としています。よってPWM周波数は、8000000 ÷ 8 ÷ 256 = 3906 ・・約4KHzとなります。 タイマ0でOC0AとOC0Bを出力し、タイマ1でOC1Bを出力しています。rand()関数は、0〜7FFFまでの整数を返すので128で除算して0〜255までのTOP値を得ています。 助長なコードがある可能性がありますが、こんな簡単なものでとりあえず動くみたいです。