www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit Capture Frequenz einlesen Mega16


Autor: Marc Ziegl (marc567)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marc Ziegl (marc567)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
der anhang

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe kein sei(); in deinem Sourcecode.

Autor: Marc Ziegl (marc567)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: Marc Ziegl (marc567)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anhang vergessen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marc Ziegl (marc567)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marc Ziegl (marc567)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.