2009/05/25

AVRでPWM

AVRに書き込めるようになったので、LEDをPWM(Pulse With Modulation)で点滅させてみました。

出力はOC0A(PD6ピン)を使います。
まず、DDRDレジスタでPD6は出力にしておきます。

TCCR0A、TCCR0Bの両レジスタで、Fast PWMモード(mode3)、Non-inverting出力、クロック(CLKIO/8)を選択します。OCR0Aには閾値、TIMSK0で割り込みは禁止しています。
この場合、タイマ値(TCNT0)は0~0xFFの間をカウントアップし、値がOCR0Aを以下だとOC0Aは1、OCR0Aを超えると0になります。

#define F_CPU 1000000UL

#include <avr/io.h>
#include <util/delay.h>

void pwm(void)
{
int i;

// OC0A = PD6
DDRD=0xff;

TCCR0A = 0b10000011; // Non inverting, Fast PWM (mode=3)
TCCR0B = 0b00000010; // Fast PWM, clk = CLKIO/8

OCR0A = 0x0;
TIMSK0 = 0x0;

for(;;) {
for(i=0; i<0x80; i++) {
OCR0A = i;
_delay_ms(20);
}
}
}

int main()
{
pwm();
}

0 件のコメント: