Hallo,
ich versuche gerade ein PWM Signal zu erzeugen, dazu nutze ich einen Atmega88 mit 8MHz quarz. Ich betreibe das ganz im Mode8 also mit ICR1 als TOP Wert und dual-slope.
Das Problem das ich habe ist folgendes:
Ich schreibe in OCR1A einen Wert welcher 20%-80% vom ICR1-Wert entspricht, das Signal das am Ausgnag anliegt hat aber leider nicht exakt diesen wert sondern liegt ~1% daneben!! selbst wenn ich 16Bit nutze spricht ICR1=65535 und OCR1A auf 32767 setze dann messe ich immernoch 50,7PWM%
Was mache ich falsch? Bin langsam total ratlos!
50%PWM ist nur Beispielhaft, der Wert soll später zwischen 20% und 80% veränderbar sein. Aber erstmal klein Anfangen
Hoffe es kann mir jemand helfen! Vielen Dank schon mal
Gruß Felix
Hier mein Quellcode:
Code:#include <avr/io.h> #include <string.h> #include <stdlib.h> #include <avr/interrupt.h> void INIT_PORTS(void) { DDRB=0xff; DDRC=0xf0; PORTB=0; PORTC=0x00; PORTD=0; } void INIT_TIMER(void) { TCCR1A|= (1<<COM1A1)|(0<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)|(0<<WGM11)|(0<<WGM10); TCCR1B|= (0<<WGM12) |(1<<WGM13) |(0<<CS12) |(0<<CS11) |(1<<CS10); TIMSK1|= (0<<ICIE1) |(0<<OCIE1B)|(0<<OCIE1A)|(0<<TOIE1); } //################# MAIN ######################## void main (void) { INIT_PORTS(); INIT_TIMER(); ICR1 = 65535; OCR1A= 32767; //50PWM% while (1) { } }
Hallo Felix123,
verwendest Du den internen Quarz des Controllers? Wenn ja, dann könnte die Abweichung daran liegen. der interne Quarz ist nicht allzu genau.
Aber das ist jetzt nur eine wilde Spekulation...
Gruß,
Hepta
Jeder dumme Junge kann einen Käfer zertreten. Aber alle Professoren der Welt können keinen herstellen. Albert Einstein
Lesezeichen