雑記/2008-1-3

[公開:any]

[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制御してみます。

DSC01212.jpg

といっても、静止画じゃよくわからんですけど、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値を得ています。
助長なコードがある可能性がありますが、こんな簡単なものでとりあえず動くみたいです。


▲ページ Top へ...