mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik durchgeschliffene Servosignale beruhigen?


Autor: Dominik Schmidt (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Dominik Schmidt (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

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

...

Autor: Arno H. (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

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.