Guten Tag. Habe bereits im Forum gesucht und auch viel gefunden, aber leider nichts was mich weiterbringt. Mein Problem: Ich möchte messen: Frequenz: 10Hz - 400Hz Signalform: Rechteck oder Sinus (eher Sinus) Spitze-Spitze: 5V Genauigkeit: 0,05Hz Messintervall: 0,1sek - 0,5sek (fix, am besten 0,1 max. 0,5) AVR tackt: 4MHz externe Beschaltung: nach Möglichkeit nicht. Das beste was mir bisher eingefallen ist, ist das Signal durch eine PLL mit 20x zu schicken und dann über eine Zeit von 0,5sek die Interrupts am einem Pin zu zählen. Interrupt bei Flankenwechsel. Gibt es eine einfachere, bessere, schnellere, genauere Möglichkeit?
Info: Die Genauigkeit bezieht sich auf die 10 - 400Hz .. was bei x20 dann nurnoch ein genauigkeit von 1Hz bringt beim zählen beider Flanken und messung über 0,5sek.
Einfach Periodendauer messen und dann in Frequenz umrechnen. 400Hz / 0,05Hz = 8000 Das läßt sich noch mit einfachem float genügend genau rechnen. Peter
1) +-0.05 Hz bei 400 Hz Messwert sind 0.125 o/oo (Promille) bzw. 125 ppm. Da stellt sich schon die Frage "Wie genau ist eigentlich deine Referenztaktquelle?" also z.B. der 4 MHz Quarz => Beitrag "Quarzgenauigkeit" 2) Bei den niedrigen Frequenzen würde ich statt dem Verfahren "Wieviele Impulse innerhalb der Torzeit?" das Verfahren "Wie lange dauert eine (Halb-)Periode?" verwenden und die Frequenz über f = 1/t berechnen.
Der Quarz ist genau (Per Geeichtem Frequenzmesser 10sec Messung genau eingestellt und im geheizten Gehäuse ^^) Das Problem ist das ich wenn ich bei einer Messung von 10Hz einen Timer bis 50.000 (16Bit Zähler) zählen lassen kann so zählt er bei 400Hz nurnoch bis 1.250, was bei einer änderung um 1Zählerstellung bereits knappe das 6fache der angestrebten Tolleranz ist (soweit ich das gestern ausgerechnet und vernichtet habe)
unbekannt schrieb: > Das Problem ist das ich wenn ich bei einer Messung von 10Hz einen Timer > bis 50.000 (16Bit Zähler) zählen lassen kann so zählt er bei 400Hz > nurnoch bis 1.250, was bei einer änderung um 1Zählerstellung bereits > knappe das 6fache der angestrebten Tolleranz ist (soweit ich das gestern > ausgerechnet und vernichtet habe) Dieses Problem läßt sich ganz einfach lösen, indem Du den Vorteiler rausnimmst und die vollen 4MHz zählst, dann hast Du bei 400Hz immer noch 10.000 Counts. Zusätzlich kann man noch soviele Perioden zählen, bis 0,1s rum sind (1..40). Peter
> Das Problem ist das ich wenn ich bei einer Messung von 10Hz einen Timer > bis 50.000 (16Bit Zähler) zählen lassen kann so zählt er bei 400Hz > nurnoch bis 1.250, Kann ich nicht nachvollziehen. Bei 4 MHz kann der Timer in der Torzeit 0.1s bis 400000 zählen. Bei einem 16-Bit Timer heisst das 6 per Overflow-Interrupt gezählte 16-Bit Overflows plus ein Restzählerstand von 6784 im Timerzähler.
4 MHz, Vorteiler 1 => 4.000.000 Takte/s 400 Hz Signal => 4.000.000 / 400 = 1000 Takte/s => +- 1 Takt ist 1 o/oo Fehler, d.h. größer als angestrebte 0.05/400 = 0,125 o/oo Bei einer Messzeit von 1/400s = 0,0025s = 2,5 ms! Die Messzeit muss mindestens um den Faktor 1/0.125 = 8 verlängert werden: 2,5ms * 8 = 20 ms. Deine minimale Messzeit von 0,1s = 100 ms hat zusätzlich einen weiteren Faktor 5 drin. Das sollte passen.
Quatsch!!! 4000000 / 400 ist und bleibt natürlich 10000 und keine 1000. DESWEGEN stürzen Satelliten ab!
Sehe ich das richtig das ich hier widerrum massig Platz für die Berechnungen brauche? 1111010000100100000000/1001110001000000=1100100 100Hz b.z.w. 1111010000100100000000/(110*1111111111111111+1101010000000)=1010 10Hz Systemtackt / (Overflows * 65536 + Zählerstand) Ggf. noch +1 oder 2 pro Overflow ... Oder gibt es da ne einfachere Rechnung?
unbekannt schrieb: > Sehe ich das richtig das ich hier widerrum massig Platz für die > Berechnungen brauche? Was meinst Du mit "massig"? Eine Divisionsroutine 32Bit kostet einmalig 62 Byte. Das sind lächerliche 0,8% des ATmega8. unbekannt schrieb: > 1111010000100100000000/(110*1111111111111111+1101010000000)=1010 10Hz Das kann doch kein Schwein lesen. Warum nimmst Du nicht einfach die Dezimalschreibweise? Peter
>Das kann doch kein Schwein lesen. >Warum nimmst Du nicht einfach die Dezimalschreibweise? Deswegen habe ich ja nochmal: Systemtackt / (Overflows * 65536 + Zählerstand) drunter geschrieben ^^. Ja aber ziemlich früh abgebrochen, da es gleich schön mit C losging, was ich aber "noch" nicht kann. Soweit ich ich das mitbekommen habe arbeitet der mit einer Umschaltung zwischen den beiden Zählvarianten.
Grad mal so ein wenig auf papier aufgeschrieben .. wird auf jeden Fall interssant ^^.
Mir brennts in den Augen! Ohne jetzt zu nörgeln, aber wenn ich bei Google "Tackt" eingebe, kommt als erstes die Meldung: Meinten Sie: takt ...
Sven W. schrieb: > Ohne jetzt zu nörgeln, aber wenn ich bei Google "Tackt" eingebe, kommt > als erstes die Meldung: > Meinten Sie: takt
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.