Forum: Mikrocontroller und Digitale Elektronik durchgeschliffene Servosignale beruhigen?


von Dominik Schmidt (Gast)


Lesenswert?

Moin !

Ich habe bei einem Tiny26 folgenden Versuch unternommen. Ich messe den
Impuls eine Fernsteuerung und gebe diesen Impuls auf einem anderen Pin
wieder aus um damit ein Servo zu steuern.
Klingt erstmal nicht weiter toll, aber da ergibt sich doch ein kleines
Problem. Die Messroutine liefert nicht immer das gleiche Ergebnis auch
wenn man die Knüppel der Fernsteuerung nicht bewegt. Die Schwankungen
sind meist recht schwach. Dennoch reicht es um das angeschlossen Servo
permanent am Zucken zu halten.

Hat jemand ein paar grundlegende Ideen, wie man das Servo beruhigen
kann?

Greetz Dominik

von crazy horse (Gast)


Lesenswert?

vielleicht solltest du als grundlegende Idee beherzigen, dein Programm
hier reinzustellen, zumindest die Teile, wie du misst und den Wert
wieder ausgibst.

von Dominik Schmidt (Gast)


Lesenswert?

Moin !

Ich nutze Bascom (ja ich weiss ... :-)

Zum messen des Impulses nutze ich das hier:
' Impuls messen ...
Function Lopulse() As Word
  While Inputpin <> 1 : Wend
  Wtime = 0
  While Inputpin = 1
    Incr Wtime
  Wend
  Lopulse = Wtime
End Function Lopulse()

Für die Aufgabe verwende ich das:
if Value1 < 443 Then Servo(1) = 127
Temp = value1 - 443
Temp = Temp + 127
If Value1 > 443 Then Servo(1) = Temp

Dieses Konstrukt sorgt noch dafür, dass sich das Servo nur in
bestimmten Situationen dreht (an der Fernsteuerung muss mind. 50% des
Stellweges eingestellt sein damit sich das Servo bewegt).

Das generell Problem liegt aber bei Value1. Hier wird das Ergebnis der
Funktion Lopulse gespeichert. Und dieser Wert schwank halt immer ein
bissel rauf und runter.

Vielleicht gibt es eine bessere Methode der Impulsmessung? (Gibts
sicher, aber ich habe keine ... )

So und meine Frage wäre, wie ich nun die kleinen Unregelmässigkeiten
rausrechnen kann.

Greetz Dominik

von crazy horse (Gast)


Lesenswert?

Du solltest Timerfunktionen sowohl für die Messung als auch für die
Ausgabe benutzen.
Mit dem Tiny26-Timern kenne ich mich nicht aus, habe damit noch nichts
gemacht. Ich glaube, der hat nur 8bit-Timer. Geht aber trotzdem damit.
In etwa so:
-Timer so einstellen, dass du damit eine Zeit von 3ms messen kannst
(abhängig von Frequenz und Vorteiler), Timer läuft durch
-ext. Interrupt steigende Flanke am Messeingang -> Timerwert in einer
Variablen merken
-ext. Interrupt fsllende Flanke -> Timerstand in einer 2. Variable
merken, Servoausgang aktivieren
-Differenz der beiden Zählerstände bilden (=Servozeit Eingang), neuen
Wert berechnen,  diesen Wert + 2. gemessenen Wert ins OCR-Register
schreiben
-OCR-Interrupt: Servoausgang deaktivieren

Mit Bascom kann ich dir allerdings auch nicht weiterhelfen.
Wenn die 8bit-Auflösung nicht ausreicht, den Timer schneller laufen
lassen und per Software zum 16bit-Timer erweitern.

von Hannes L. (hannes)


Lesenswert?

Eigentlich reicht die 8-Bit-Auflösung. Einige meiner Routinen mit
Servoimpulsen arbeiten mit einer Auflösung von 10µs, also dem
Zahlenwert von 100 für 1ms bis 200 für 2ms. Dieses Raster lässt
genügend Spielraum zur Erkennung von Impulsbreitenfehlern nach unten
und oben.

Meine "Messroutinen" arbeiten aber grundsätzlich mit Hysterese,
Änderungen von einem Schritt werden ignoriert. Somit "zappelt" der
Messwert nicht.

Beispiele (aber nicht mit Tiny26 und nicht in BASCOM) findet man hier:
http://www.hanneslux.de/avr/mobau/index.html
und speziell hier:
http://www.hanneslux.de/avr/mobau/impkorr/impulskorr.html
Die Programme sind zwar aus heutiger Sicht auch nicht optimal, aber sie
funktionieren. Selbstverständlich werden die Zeiten mittels Timer
gemessen und erzeugt.

...

von Arno H. (Gast)


Lesenswert?

Wenn die Signale durchgeschliffen sind, ist es sowieso zu spät. Löte sie
wieder zusammen und mach eine Schleife.
Jetzt wieder zum ernst des Lebens!
Muss das Signal unbedingt durch den µC bevor es an den Servo geht? Der
µC macht doch nur eine Freigabe, oder habe ich das falsch verstanden?
Arno

von Peter D. (peda)


Lesenswert?

Ganz grob abschätzen kann man mit ner Zählschleife.

Will man aber messen, dann geht das nur mit nem Timer.

Ausnahme:
Man macht die Zählschleife in Assembler, daß sie immer die exakt
gleiche Durchlaufzeit hat (auch bei 8Bit-Übertrag) und schaltet während
der Messung sämtliche Interrupts ab.


Peter

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.