Forum: Mikrocontroller und Digitale Elektronik Input Capture


von Chris (Gast)


Lesenswert?

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

von Aleksej (Gast)


Lesenswert?

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

von Sven Müller (Gast)


Lesenswert?

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..

von ralf (Gast)


Lesenswert?

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

von Chris (Gast)


Lesenswert?

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!

von Sven Müller (Gast)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Chris (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.