最終更新時間:2008年01月03日 12時44分13秒
[公開:any]
AVRのATTiny45は、8ピンなのにPWM出力が3系統もあるらしいので、3色LEDをPWM駆動して実験してみます。
データシートを見てみるとタイマ0とタイマ1でそれぞれ2系統で合計4系統のPWMが得られるように読めますが、いろいろ試したところ3系統までのようです。(つーか、よくわかりません)
オシロスコープで波形を確認したところ、デューティ比を3系統までは単独で制御できるようです。ただ、タイマは2系統なのでPWM周波数は2種類までとなります。
とりあえず、3色LEDをつないで、各色を単独でPWM制御してみます。
といっても、静止画じゃよくわからんですけど、1秒ごとに各色のPWMのデューティ比を乱数変化させるようにしてみました。
参考までにAVRStudio4でWinAVR(GCC)を使用して作ったソースです。
#include <avr/io.h> #include <util/delay.h> 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値を得ています。
助長なコードがある可能性がありますが、こんな簡単なものでとりあえず動くみたいです。