Hallo Forum, bräuchte nur einen Anstupser. Wie würdet ihr mit einem, mit 16 Mhz, getakteten Atmega 8535 350 KHz messen. Ich verwende im Moment die Methode, daß bei jedem Nulldurchgang ein Inerrupt ausgelöst wird und dann der Zählerstand ausgelesen wird. Funktioniert aber nur bis knapp 80 KHz, dann ist reppo, ich denke einfach zu viele Ints.
Etwas besser als mit einem Interrupt und auslesen des Timer vom Hand ist die Verwendung der ICP Funktion. Da macht die Hardware das Auslesen des Timers. Das wird zumindest genauer als mit dem Interrupt, aber erst einmal auch nicht schneller. Wenn man sich Anstrengt sollte man die 350 kHz im Interrupt noch gerade so hinbekommen, in ASM auch noch einiges mehr. Die ICP Funktion kann man auch ohne Interrupt nutzen, durch pollen der Signal Bits. Das wird ggf. etwas schneller. Schneller ginge es auch mit einem externen Hardware Teiler, so dass man nicht mehr die 350 kHz sondern etwa 1/16 oder 1/256 davon misst. Die Alternative wäre sonst das Zählen der Pulse in einer festen Zeit über den T1 Eingang, so wie bei einem klassischen Zähler.
anfänger0815 schrieb: > Wie würdet ihr mit einem, mit 16 Mhz, > getakteten Atmega 8535 350 KHz messen 16 bit Timer im input capture mode.
Willst Du nur messen, ob die 350kHz auch 350kHz sind oder musst Du noch de Phaselage auswerten? Ansonsten: Im Nulldurchgangs-Interrupt nur einen Zähler inkrementieren (3 Byte) und nach genau 1 Sekunde diesen auslesen und zu Null setzen und nach einer weiteren Sekunde wieder auslesen und so weiter. Die Input-Capture-Methode (reziprokes Messen) sollte man eher bei niedrigen zu messenden Frequenzen nutzen.
:
Bearbeitet durch User
Danke erst einmal für eure Antworten. Jetzt muß ich mich erst einmal einlesen um die Richtige Methode zu finden. Danke nochmal und ein schönes WE
Knut Ballhause schrieb: > Die > Input-Capture-Methode (reziprokes Messen) sollte man eher bei > niedrigen zu messenden Frequenzen nutzen. mal präzise: immer dann, wenn die zu messende Frequenz niedriger ist als die effektive Refrenzfrequenz, liefert die sogenannte Reziprok-Methode eine höhere Auflösung als die Nicht-Reziprok-Methode. Der Unterschied zwischen beiden ist technisch marginal: bei der Reziprokmethode öffnet das Meßtor taktsynchron zum Eingangssignal und schließt auch wieder taktsynchron dazu, während bei der Nicht-Reiprok-Methode das Meßtor taktsynchron zum Referenztakt öffnet und schließt. Ob das Meßtor nun ein Stück Hardware ist oder ein Zustand in einem Programm, ist für's Prinzip egal. W.S.
Ich habe jetzt die Lösung. Ich mess die Frequenz nicht mehr leufend, sondern nur noch 10 mal in der Sekunde. D.h. ich gebe den Interrupt frei, warte bis er auslöst, setzte den Zähler auf Null. Beim nächsten Auslösen sperre ich den Interrupt und lese den Zähler aus.
Hi, teile dir die Frequenz doch herunter, z.B. mit einem Zähler. Ob das mit den internen Timern ATMEGAS geht, keine Ahnung. Vermutlich aber schon irgendwie. Sonst muss man halt einen externen Zähler nehmen, kostet ja fast nix. Wenn du dir die Frequenz z.B. um den Faktor 32 verkleinerst und dann misst, müsste das viel leichter und präziser gehen, weil auch der Fehler durch den 16MHz Takt kleiner ist.
Bei 350 kHz ist die Messung nur einer Periode nicht besonders genau. Das sind ja nur um die 50 Taktzyklen. Da müsste man schon die Zeit für viele Perioden (Größenordnung 1000) messen: also die Startzeit ablesen, und dann erst einmal nur zählen und dann nach z.B. 1000 Perioden die Stopp-zeit ablesen. Wenn man es geschickt anstellt, sollte das bei 350 kHz noch gerade so in C gehen - zur Not halt die ISR in ASM. Die Alternativ bei so hoher Frequenz wäre halt klassisch zählen, über den T1 Eingang. Das ist der geringere Aufwand und immer noch besser als die Zeit für nur 1 Periode.
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.