Felix123
20.08.2007, 15:27
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:
#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)
{
}
}
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:
#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)
{
}
}