Hallo,
vor dem Problem erst einmal die Beschreibung des Aufbaus:
Ich versuche einen Wert über eine PWM Signal bzw den DutyCycle von einem
Atmega88 zu einem anderen zu übertragen.
Genutzt werden sollen nur >20PWM% und <80PWM%. Also eigentlich ganz
simpel. Die Atmegas laufen beide mit einem 8Mhz Quarz. Meine Vorstellung
war nun eine Frequenz (100Hz-300Hz) zu nehmen und im Sende-Atmega
einfach den DutyCycle zu verändern. Dieser soll dann am Empfangs-Atmega
über PinB0 / ICP1 ausgemessen werden und dann diesem „stabil“ zur
Verfügung stehen.
Mein Problem ist nun, dass der DutyCycle nicht schwanken darf. Doch
leider schwankt das ermittelte Signal manchmal und manchmal nicht…
Meine Frage an euch ist nun:
Habe ich beim Auswerten des PWM Signals einen Fehler gemacht? Dass der
Fehler beim erzeugen vom PWM Signal liegt kann ausgeschlossen werden.
Ich habe bereits eine stabile PWM-Quelle als Sender benutzt. Mit
demselben schwankenden Ergebnis :(
Hoffe es kann mir jemand helfen!
Gruß Felix
Zum Auswerten verwende ich folgenden Code:
unsigned long DC_Array[11]={0,0,0,0,0,0,0,0,0,0};
unsigned char PWMOK=1;
unsigned long ic_zp_A1 = 0;
unsigned long ic_zp_B = 0;
unsigned long ic_zp_A2, ISR_A1, ISR_A2, ISR_B;
unsigned long Ziel=0;
unsigned long DutyCycle;
int main (void)
{
TCCR1B |= (1<<ICES1) | (0<<CS11) | (1<<CS10) |(1<<ICNC1);
TIMSK1 |= (1<<ICIE1);
sei();
while(1) //Endlosschleife
{
ic_zp_A1=ISR_A1;//-ISR_A2;
ic_zp_B=ISR_B;//-ISR_A2;
if((ic_zp_A1>ic_zp_B)) //Komplett ungültige Werte filtern
{
for (x=9;x>0;x--) //immer 10 Werte schieben und vergleichen
{
DC_Array[x]=DC_Array[x-1];
}
DC_Array[0]=((ic_zp_B*10000)/ic_zp_A1);
for (x=9;x>0;x--)
{
if (DC_Array[x]==DC_Array[x-1])
{PWMOK=1;}
else
{PWMOK=0;}
}
//Nur wenn 10Messungen denselben Wert ergeben haben
if (PWMOK==1)
{
DutyCycle0=DC_Array[0];
DutyCycle=DutyCycle0/39;
UpdateDisplay=0;
if ((DutyCycle>200)||(DutyCycle<50))
{
Unterprogramm();
}
else
{
}
}
}
}
}
//########################### ISR Routine ###########################
ISR (TIMER1_CAPT_vect)
{
cli();
if (TCCR1B & _BV(ICES1))
{
ISR_A1 = ICR1;
TCNT1=0;
TCCR1B &=~(1<<ICES1);//auf fallende Flanke Triggern
}
else
{
ISR_B = ICR1;
TCCR1B |= (1<<ICES1);//auf steigende Flanke triggern
}
sei();
}
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.