Probleme mit Frequenzmessung mittes ICP

Gast #222172
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;
}
Gast #222174
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren