Hi Leute! Hab hier im Forum mal gelesen daß man am besten eine Frequenzmessung mit Input Capture macht. Man liest die Timerwerte ein und zieht immer den letzten Wert vom aktuellen ab. Dann hat man die Anzahl der Takte. Soweit ist es mir klar, aber was ist wenn der Timer seinen Überlauf hat und wieder von vorne anfängt zu zählen. Dann würde ja einen Minuszahl herauskommen. Gibt es da einen Trick oder muß mann das Softwaretechnisch lösen? Progammiere in C und hab nen AVR mfg Chris
Setze ein Overflow-Interrupt ein, da könntest du die Frequenz begrenzen oder sogar den Messbereich breiter machen. Aber achte darauf, dass es zu Plroblemen kommen kann, wenn die Interrupts gleichzeitig abgerufen sind, besonders wichtig ist es aus meinen Erfahrungen beim Start
Ich mache da eine etwas andere Lösung. Einige werden vielleicht sagen das sie ungenauer ist, aber ich setze beim ersten Capture Interrupt den Timer auf 0, und lese beim zweiten aus..weil unterscheiden ob es der erste oder zweite ist muss ich sowieso..
Hallo, der Trick dabei ist, dass die Berechnungen unsigned vorgenommen werden. Weiterhin muss der Timer modulo 2 hoch 8/16 laufen. Wenn man dies beachtet, ergibt sich bei der differenzbildung immer genau die Zeit(in Timerticks) zwischen zwei Capture-Vorgängen. Dabei ist es auch egal, ob der Timer überläuft oder nicht. Das ganze rührt daher, dass man sich die ganzen Zahlen eines Mikrocontrollers im Prinzip als Zahlenring vorstellen kann. Worauf man jedoch achten muss, ist, dass die Periodendauern des zu messenden Signals nicht zu groß werden, sodass sie mit der Timerauflösung dargestellt werden können. Ist dies nicht der Fall, so muss man die Überläufe noch mitzählen. Hier ist natürlich darauf zu achten, dass kein Overflow vergessen wird. (Overflow doppelt abfragen). Nun noch zwei Beispiele: Periode = 1000 Timerticks 1. Fall: 1. Capture = 1000; 2. Capture = 2000 => 2.Cap - 1.Cap = 2000 - 1000 = 1000 2. Fall: 1. Capture = 65000 2. Capture = 464 => 2.Cap - 1.Cap = 464 - 65000 = 1000 (Achtung unsigned int subtraktion) (hier wird das 2er Complement von 65000 addiert!) Ich hoffe ich konnte etwas weiterhelfen, ansonsten einfach nochmal nachfragen. Viele Grüße, Ralf
Hi Ralf! d.h. ich muß jedesmal wenn ein Overflow stattfindet eine unsigned int subtraktion durchführen? Wie sieht die aus zur normalen subtraktion? Wie sehen die Befehle in CodeVision dazu aus? Hoffe du kannst mir weiterhelfen! mfg Chris!
Da kann ich dir auch weiterhelfen..mir fällts wie schuppen von den haaren.. Du definierst alle datentypen als unsigned int (1. Capture wert, 2,wert und ergebnis) dann rechnest du einfach wert2 - wert1 = ergebnis. es ist egal ob der timer übergelaufen ist oder nicht. wenn du dir das veranschaulichen willst musst du das echt mal bitweise machen (mit binärzahlen rechnen!) Hoffe dir geholfen zu haben. Sven
Hi Chis, prinzipiell, stimmt alles so wie Sven geschrieben hat, aber nur so lange, wie deine Signalperiode mit dem Timer dargestellt werden kann. Also z.B.: Du hast einen 16Bit Timer, der captured. Dieser läuft immer von 0 bis 0xFFFF und läuft dann über. Wenn der Timer mit z.B. 1us Taktzeit läuft, funktioniert das Verfahren nur solange die Periodendauer deines zu messenden Signals kleiner als 65536 * 1us ist. Ist sie länger, so bekommst Du ja zwei Überläufe während einer Signalperiode und die Rechnung geht nichtmehr. Passt die Periode jedoch in deinen Timer hinein so gilt folgendes: unsigned int Capture1; //erster Zeitstempel unsigned int Capture2; //zweiter Zeitstempel unsigned int Periode; //Signalperiode Periode = Capture2 - Capture1; Viele Grüße, Ralf
Danke für die hilfreichen Antworten! Ich glaub jetzt kenn ich mich auch aus. Werds heut abend gleich mal ausprobieren. mfg Chris
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.