www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Frequenzmessung mittes ICP


Autor: michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für ein FM-Radio möchte ich eine automatische Senderabstimmung bauen,
dazu muss ich die Frequenz auf der das FM-Modul arbeitet ermitteln. Hab
also die Freqenz von 87-108MHz durch 524288 geteilt, dann hab ich so um
den dreh 5ms Zeit um eine Periode zu messen.
Nur nun hab ich das Problem das bei ca 100MHz mein Programm anfängt zu
spinnen, die 2. Flanke wird nicht mehr richtig erkannt, daruch sind die
Brechnungen falsch. Unter 100MHz läuft alles perfekt. Die
Eingangsfrequenz ist stabil. Mein Mega32 läuft mit 10Mhz.
Vielleicht hat jemand schonmal sowas programmiert, und hat ne Idee
woran das liegen könnte.

hier ein ausschnitt aus dem Programm:
uint16_t  Periodendauer;
double zw_buffer1,zw_buffer2;

SIG_INPUT_CAPTURE1()
{

  TCNT1= 0;
  if(Status==0)
  {
    sei();
                //Beim Interrupt aufruf wird das GIE ausgeschaltet
                //und muss nun wieder eingeschaltet werden

    TCCR1B = (1<<CS10|0<<ICES1|0<<ICNC1);
                //Zähler starten ohne vorteiler
    Status = 1;
  }
  else
  {
    Status = 2;
  }
}



void messung(void)
{
    Status = 0;
    Periodendauer=0x0000;
    TIMSK = (1<<TICIE1);  //Interrupt für ICP
    sei();  //einschalten für erste messung
    //nach der ersten flanke wird der timer gestartet
    //nach der zweiten Flanke ist die Periodendauer
                //ermittelt
    //es wird der gespeicherte wert aus dem ICR1
                //register zur berechnung verwendet

    while(Status < 2);
                //warten bis Periodendauer ermittelt

    Periodendauer =  ICR1;
    TCCR1B = 0;  //Zähler stoppen


    lcd_gotoxy(0,2);
    dtostrf(Periodendauer,2,0,&char_out[0]);
    lcd_puts(&char_out[0]);


    zw_buffer2 = (double) Periodendauer / 1000;
    zw_buffer1= zw_buffer2 * zw_buffer2;
    zw_buffer1 = zw_buffer1 * 0.037324; //0.043677
  zw_buffer1 = zw_buffer1 - 5.82086 * zw_buffer2; //6.47437
    zw_buffer1 = zw_buffer1 + 292.072;

    TIMSK = 0;
}

Autor: michi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weiß denn wirklich niemand, warum es zu dem besagten Problemen kommt?
mfg michi

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was ich auf den 1.Blick so sehe:
-double wird von den Compilern oft gar nicht unterstützt, falls du die
Genauigkeit benötigst, könnte da der Fehler liegen

-deine ICP-Routine gefällt mir nicht besonders. Den ganzen Kram
brauchst du doch gar nicht. Lass den Zähler durchlaufen und bilde die
Differenz zwischen 2 ICP-Ereignissen

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.