Forum: Compiler & IDEs Problem mit Capture Frequenz einlesen Mega16


von Marc Z. (marc567)


Lesenswert?

Hallo zusammen,
ich benötige dringend Hilfe im Umgang mit dem Input Capture Pin des 
ATMega16.
Ich habe das Problem, dass die Flanken des Signals nicht richtig erkannt 
werden. Das PWM-Signal hat eine Frequenz von ca. 15kHz und ist durch ein 
Poti auf 0-100% (0-12V) einstellbar. Die Flanken werden allerdings nur 
erkannt, wenn ich wie ein Wilder am Poti drehe. Die periodischen Zyklen 
werden nicht erfasst.
Ich nutze den ATMega16 mit einem 16MHZ externen Oszillator. Als 
Eingangsschaltung habe ich, die im Anhang befindliche genommen. Der Code 
sieht wie folgt aus:

ISR(TIMER1_CAPT_vect)
{
   if (fertig==1){return;}
   if ((PIND & (1<<PIND6))&&(status==0))//Wenn high an PD6 && status==1
   {
     risinglow=ICR1L;
     risinghigh=ICR1H;
     rising = risinglow;
     rising += (risinghigh<<8);
     TCCR1B = 0x81 //on rising edge, noise canceler, @16MHZ
     Overflows=0;
     status=1;
   }
   else
   {
     fallinglow=ICR1L;
     fallinghigh=ICR1H;
     falling = fallinglow;
     falling += (fallinghigh<<8);
     TCCR1B=0xC1;
     fertig=1;
     status=0;
   }
}

ISR(TIMER1_OVF_vect)
{
  Overflows++;
}

void main()
{
   uint32_t counts;
   uint32_t countstemp;

   TCCR1A |= 0x00;
   TCCR1B = 0xC1; //Noise Canceler on, trigger on rising edge, no 
prescale (16MHZ)
   TIMSK |= (1<<TICIE1)|(1<<TOIE1);    //Interrupt wird ausgelöst wenn 
ICF1 Flag gesetzt wird (edge detector hat rising edge flanke erkannt)

   while (1)
   {
     if (fertig==1)
     {
     countstemp = ((Overflows*65536) + rising - falling);
     counts = 1/(counts*0.0000000625);    //16MHz Quarz

     lcd_cls();
     lcd_zeichenkette("PWM=");
     lcd_varout(counts);
     lcd_zeichenkette("Hz");
     lcd_zeile(2);
     lcd_varout(falling);
     lcd_varout(Overflows);
     fertig=0;
     }
   }
}

Die Variablen rising und falling, sowie risinghigh/low, fallinghigh/low 
sind volatile deklariert.
Weiß jemand woran das liegen könnte, dass die Interrupts nicht ausgelöst 
werden?
Danke vielmals für die Hilfe.

von Marc Z. (marc567)


Angehängte Dateien:

Lesenswert?

der anhang

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ich sehe kein sei(); in deinem Sourcecode.

von Marc Z. (marc567)


Lesenswert?

Hi,
daran liegt es nicht. Das hab ich drin.
Hab die Funktion in der das geschehen soll was oben beschrieben ist 
einfach main() genannt um es für die Leser einfacher zu machen. sei() 
wird aufgerufen, steht nur nicht in dieser Funktion, sondern ganz am 
Anfang, da ich noch Timer0 mit Overflows nutze.
Aber vielen Dank für die Hilfe und vielleicht fällt dir ja noch was 
ein....

von Marc Z. (marc567)


Lesenswert?

Oben noch einen Fehler im Kommentar entdeckt:
TCCR1B = 0x81 //on "FALLING" edge, noise canceler, @16MHZ

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ich habe mit deinem Code im grossen ganzen keine Probleme in der 
Simulation (Anhang).

Ich kann mir nur vorstellen, dass das Eingangssignel keine sauberen 
LOW/HIGH Pegel bringt. Hast du Möglichkeiten das Signal am Pin zu 
oszilloskopieren?

Wenn dein Signal tatsächlich 0-12V bei 15 kHz hat, sehe ich keine 
Probleme.

Von der Schaltung her erkenne ich einen Spannungsteiler mit R11/R12, um 
die 0-12V auf 0-3,84V zu bringen.

Daneben sehe ich noch R7/C2 als passiven Tiefpass 1. Ordnung. Der dreht 
dem Ue=0-3,84V Signal bei 15 kHz die Gurgel auf 0,995 * Ue zu.
http://de.wikipedia.org/wiki/Tiefpass#Tiefpass_1._Ordnung

Daneben sehe ich noch R8 als (IMHO überflüssige) Strombegrenzung.

Wenn dein Signal allerdings nur 6,25V am Eingang des Spannungsteilers 
hat, sieht es duster mit dem HIGH Pegel aus.

Dein Potentiometer sehe ich im Schaltplan nicht und kann nicht 
beurteilen, was von den 12V@15 kHz am Spannungsteiler ankommt.

von Stefan B. (stefan) Benutzerseite


Angehängte Dateien:

Lesenswert?

Anhang vergessen.

von Falk B. (falk)


Lesenswert?

@ Stefan "stefb" B. (stefb)

>Wenn dein Signal tatsächlich 0-12V bei 15 kHz hat, sehe ich keine
>Probleme.

Ich schon.

>Von der Schaltung her erkenne ich einen Spannungsteiler mit R11/R12, um
>die 0-12V auf 0-3,84V zu bringen.

So weit, so gut.

>Daneben sehe ich noch R7/C2 als passiven Tiefpass 1. Ordnung. Der dreht
>dem Ue=0-3,84V Signal bei 15 kHz die Gurgel auf 0,995 * Ue zu.
>http://de.wikipedia.org/wiki/Tiefpass#Tiefpass_1._Ordnung

IRRTUM!

Der Tiefpass wird durch R11/R12 bestimmt! Die liegen für den Tiefpass 
parallel, mach aber immer noch 32 kOhm Quellwiderstand. Mit C2 ergibt 
das ein Zeitkonstante von ~0,32ms! Macht eine 3dB Bandbreite von 500 Hz. 
Und damit willst du ein 15 kHz Digitalsignal messen? Eher nicht. Lass 
mal C2 weg und staune.

Im Prinzip reicht ein Vorwiderstand von 10 kOhm zur Stombregrenzung als 
Pegelwandler.

MFG
Falk

von Marc Z. (marc567)


Lesenswert?

Hallo zusammen,
werde ich gleich heut Abend ausprobieren - Vielen Dank nochmals für die 
Hilfe. Heut Abend poste ich obs geklappt hat.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

@ Falk

Danke für die Richtigstellung. Man lernt nie aus (bin kein Fachmann 
sondern Laie/Hobbyist). Wenn du Zeit und Lust hast: mich interessiert, 
wie man die 32 kOhm Quellwiderstand ausrechnet. Mit meinen Rechnungen 
jetzt mit dem belasteten Spannungsteiler bin ich nämlich nicht 
weitergekommen.

von Falk B. (falk)


Lesenswert?

@ Stefan "stefb" B. (stefb)

>wie man die 32 kOhm Quellwiderstand ausrechnet. Mit meinen Rechnungen

Nun, es ist wie bereits gesagt die *PARALLEL*schaltung von R11/R12. 
Warum? Die Netzwerktheorie sagt das. Und wieso?

R7 und R8 weglassen, die fallen quasi sowieso raus. OK. Nun muss man vom 
Kondensator in "Richtung" 12V PWM Signalquelle schauen. Das Signal 
verzweigt sich vom Kontenpunkt R11/R12 jeweils nach R11/R12. Die 
Signalquelle, welche eine Spannungsquelle ist, wird bei dieser 
Betrachtung kurzgeschlossen. Damit liegen die Wiederstände effektiv 
parallel. Kann man auch einfach mal in Pspice/Switchercad eingeben und 
simulieren (AC-Analyse).

MfG
Falk

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Danke!

Statt Pspice/Switchercad habe ich die Schaltung in Electronic Workbench 
3.5 (habe Demoversion aus Franzis-Buch) simuliert. Man sieht schön die 
fatale Wirkung des C2 auf das Signal an Pin D6.

von Marc Z. (marc567)


Lesenswert?

Hallo,
hab C2 rausgelötet und siehe da, kaum macht mans richtig - schon 
klappts:-) Vielen Dank für eure Hilfe und die kleine Exkursion in die 
Signalverarbeitung.
Viele Grüße

von Falk B. (falk)


Lesenswert?

@  Stefan "stefb" B. (stefb)

>3.5 (habe Demoversion aus Franzis-Buch) simuliert. Man sieht schön die
>fatale Wirkung des C2 auf das Signal an Pin D6.

Vor allem sollte man sehen, dass die Grenzfrequenz NICHT durch R7*C2 
bestimmt wird sondern durch (R1 // R12) * C2!

MFG
Falk

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
Noch kein Account? Hier anmelden.