Input Capture

Gast #66661
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
Gast #66662
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
Gast #66663
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..
Gast #66664
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
Gast #66665
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!
Gast #66666
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
Gast #66667
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.