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