PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servoimpuls messen mit Timer1



moelski
13.08.2006, 08:00
Moin !

Kann mir jemand zufällig mit einem Schnippsel Code aushelfen?
Ich suche eine Interrupt Routine die an einem Pin einen Servoimpuls misst. Und das über Timer1.
Sprich ich will da 1-2ms +-200µS messen. Es wäre gut wenn dabei der Timer1 möglichst gut ausgenutzt wird und ich ein rel. gutes Messergebniss bekomme.

Dank schon mal!

bertl100
13.08.2006, 09:43
Wieso nimmst du nicht den Befehl "Pulsein"
Der mißt von Flanke zu Flanke und brauchst nichts zu berechnen.
Mit Pulsein kannst du Impulse bis 680 mS messen.

MFG

Bertl

moelski
13.08.2006, 20:27
Moin !


Wieso nimmst du nicht den Befehl "Pulsein"
Der mißt von Flanke zu Flanke und brauchst nichts zu berechnen.
Mit Pulsein kannst du Impulse bis 680 mS messen.
Naja, prinzipiell ja ne tolle Idee. Aber die gemessenen Werte schwanken. Und das zum Teil erhelblich. Ich habe hier einen UniTest2. Das ist ein Testgerät für den Elektromodellflug. Ich gehe mal davon aus, dass dieses Gerät recht stabile Servoimpulse erzeugen kann. Andernfalls würde man das eh durch ein Zittern der Servos bemerken. Dem ist aber nicht so ...

So und wenn ich nun mit Pulsein die Impulslänge bestimme, dann kriege ich sowas:

Impuls 175
Impuls 177
Impuls 173
Impuls 177
Impuls 177
Impuls 177
Impuls 177
Impuls 177
Impuls 177
Impuls 172
Impuls 177
Impuls 177
Impuls 177
Impuls 177
Impuls 177
Impuls 177
Impuls 173
Impuls 177
Impuls 175
Impuls 177
Impuls 177
Impuls 177
Impuls 177
Impuls 175
Impuls 177
Impuls 173
Impuls 177
Impuls 177
Impuls 177
Impuls 177
Impuls 177
Impuls 177
Impuls 172
Impuls 177
Impuls 176
Man kann schön erkennen das der Impuls im Prinzip 177 * 10µs = 1,77ms lang ist. Aber da sind eben immer diese Ausreisser. Wenn ich diese gemessenen Werte spasshalber auf ein Servo gebe (natürlich vorher in die passende Form gebracht), dann zittert sich das Servo zu Tode.

Also wie zum Henker kann ich einen Servoimpuls sauber messen? Kann doch nit so schwer sein ein ms Signal zu messen. :-s
Auch eine Mittelwertbildung über 10 Werte macht nicht glücklich. Denn dann hat man immer noch Schwankungen von teilweise 1-2!

So und auch meine Routine hat das gleiche Verhalten.

' Impuls messen ...
Function Lopulse() As Word
While Inputpin <> 1 : Wend
Wtime = 0
While Inputpin = 1
Incr Wtime
Wend
Lopulse = Wtime
End Function Lopulse()
Das ist sicher nich die beste Routine. Aber vom Prinzip her gehts. Aber auch hier immer Schwankungen.

Ich verstehe das nicht. Auf dem µC läuft doch kein OS was irgendwelche Zeitscheiben abarbeitet ?! Da laufen doch nur ein paar Befehle die einen Impuls messen und ausgeben. Warum sind da überhaupt diese Schwankungen?

Liegt es evtl. am verwendeten Tiny26? Weil der hat keinen 16 Bit Timer. Wäre es mit einem Mage Steinchen evtl. besser zu realisieren?

Hoffe jemand hat hier noch nen Tip ?!

Hanni
13.08.2006, 21:15
Einfachste Lösung:

1. Timer anwerfen ob 8 oder 16 Bit ist erst mal egal, zumal man diese Softwareseitig skalieren kann.
2. Bei steigender Flanke den Zählerstand merken
3. bei fallender Flanke auch
4. das ganze voeinander subtrahieren
5. ausgeben

Edit: ach ja, Pulsin verursacht ein sehr unschönes und nicht wirklich genaues Codemonster.

moelski
13.08.2006, 21:24
Moin !

Wäre nicht das besser?

1. Timer bei steigender Flanke anwerfen
2. bei fallender Flanke stoppen
3. Überläufe merken
4. kompletten Wert bestimmen.

Hanni
13.08.2006, 21:46
Moin !

Wäre nicht das besser?

1. Timer bei steigender Flanke anwerfen
2. bei fallender Flanke stoppen
3. Überläufe merken
4. kompletten Wert bestimmen.

nö, weil man damit diesen Timer für nix anderes mehr gebrauchen kann.