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