mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Input Capture


Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Aleksej (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Sven Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die hilfreichen Antworten!

Ich glaub jetzt kenn ich mich auch aus.
Werds heut abend gleich mal ausprobieren.

mfg Chris

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.