Variante 3 - Warum sich merken, was man berechnen kann?
variante3.zip - Download des Projektes
#include <avr/io.h>
int main(void)
{
int i,x,v;
//Für das Warten Timer2 verwenden:
//Teiler CS22 CS21 CS20
//001 1
//010 8
//011 32
//100 64
//101 128
//110 256
//111 1024
TCCR2 = (1<<FOC2) | (0<<WGM20) | (0<<COM21) | (0<<COM20) | (0<<WGM21) | (1<<CS22) | (1<<CS21) | (1<<CS20);
// TCCR2 = (1<<FOC2) | (0<<WGM20) | (0<<COM21) | (0<<COM20) | (0<<WGM21) | (0<<CS22) | (0<<CS21) | (1<<CS20);
//Für das Senden des PWM-Signals Timer1 verwenden;
//Teiler CS12 CS11 CS10
//001 1
//010 8
//011 64
//100 256
//101 1024
TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<FOC1A) | (0<<FOC1B) | (0<<WGM11) | (0<<WGM10);
TCCR1B = (0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); //Teilung 1
DDRD |= (1<<PB5) | (1<<PB4); //auf Ausgang setzen.
//PWM-Frequenz durch Setzen von TOP festlegen:
ICR1 = 255;
//fpwm = 9216000/(2*TOP*1)=18432Hz
TCNT2=0;
i=0;
x=255;
v=0;
while(true)
{
OCR1A = (x+256)>>1; //Periode: 94, ungefähr 1Hz Schwingung
x += v;
v += -(x/128);
i++;
while(TCNT2<96); //Samplingrate mit der die PWM-Breite verstellt wird: 9216000/(1024*96)=93,75Hz
TCNT2=0;
}
return 0;
}
Code 0-1: Programmcode