durchgeschliffene Servosignale beruhigen?

Gast #359132
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
Gast #359134
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
Gast #359135
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.
#359136
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.

...
Gast #359137
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
#359138
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

Antwort schreiben

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.

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.