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; }
Weiß denn wirklich niemand, warum es zu dem besagten Problemen kommt? mfg michi
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.