Variante 1 - Mit Kanonen auf Spatzen schießen
variante1.zip - Download des Projektes
#include <avr/io.h>
#include <math.h> //Zur Bestimmung des Sinuswertes
int main(void)
{
double x;
int i;
bool toggel = false;
//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) | (0<<CS22) | (1<<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 = 250;
//fpwm = 9216000/(2*TOP*1)=18432Hz
TCNT2=0;
i=0;
while(true)
{
x = sin(2.0*M_PI*(double)i/1440.0); //1000 Samples pro Periode => fsinus = 19862,07Hz/1440 = 1Hz s.u.
x +=1.0;
x*=125.0;
OCR1A = (unsigned char)x;
i++;
i%=1440;
while(TCNT2<200); //Samplingrate mit der die PWM-Breite verstellt wird: 9216000/(32*200)=1440Hz
TCNT2=0;
}
return 0;
}
Code 0-1: Programmcode