Forum: Mikrocontroller und Digitale Elektronik Probleme mit Frequenzmessung mittes ICP


von michi (Gast)


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;
}

von michi (Gast)


Lesenswert?

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

von crazy horse (Gast)


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

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.