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