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
vielleicht solltest du als grundlegende Idee beherzigen, dein Programm hier reinzustellen, zumindest die Teile, wie du misst und den Wert wieder ausgibst.
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
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.
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. ...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.