PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Code zur Ansteuerung eines Servos



the_Ghost666
14.04.2005, 17:19
Moin zusammen
hat jemand eine fertige Assemblerroutine oder eine C-Funktion um einen Modellbauservo anzusteuern? ich denke an etwas, dass einen wert von 0-255 bekommt und damit dann die verschiedenen positionen ansteuert. das ganze dann für 1 -2 servos an einem PIC. Hat jemand sowas auf lager?

WireMeier
14.04.2005, 17:47
Moin zusammen
hat jemand eine fertige Assemblerroutine oder eine C-Funktion um einen Modellbauservo anzusteuern? ich denke an etwas, dass einen wert von 0-255 bekommt und damit dann die verschiedenen positionen ansteuert. das ganze dann für 1 -2 servos an einem PIC. Hat jemand sowas auf lager?

Hallo!

Weiß nicht, ob Dir damit gehofen ist, aber ich habe mit dem CControl-BASIC einen einfachen rechts-links-Lauf für einen gehackten (Anschlag entfernt) Modelbauservo einfach mit ein paar FOR-Schleifen realisiert. Genauer gehts mit dem CControl BASIC-Ibterpreter geschwindigkeitsbedingt eh nicht.

#vor
for z=1 to 200
port1=on
port1=off
next z
return

#rueck
for z=1 to 100
port1=on
for c=1 to 1
b=1
next c
port1=off
for c=1 to 1
b=1
next c
next z
return

OK - bei dem Listing sträuben sich wohl so manchem die Haare, war auch nur so auf die Schnelle eingehackt. aber es funktioniert. Die inneren FOR-Schleifen waren eigentlich zum genaueren Einstellen gedacht. Der "Vorlauf" ist beim CCBASIC schon so am Geschwindigkeitslimit, das innere Verzögerungsschleifen bereits die Impulse zu sehr verzögert hätten. Durch einen ähnlichen Aufbau in Assembler oder C und Experementieren mit den Durchlaufzahlen für innrere und äußere Schleife sollten schnell passable Werte herauszufinden sein. Durch ein (zugegebenermaßen primitives) Duplizieren und anpassen der Routinen lässt sich auch die Ansteueruzng mehrerer Servos realisieren. Die genaue Position wird dann ebenfalls durch Angleichen der Schleifendurchläufe erreicht.

the_Ghost666
15.04.2005, 11:44
hätte denn jemand einen fertigen Assembler oder C code? das würde das sehr vereinfachen, da ich kein basic verstehe

PicNick
15.04.2005, 13:17
Nun aber ehrlich: wenn du Assembler und C kannst, mußt du auch das Beispiel vom WireMeier lesen können und umsetzen, da hast du schließlich mehr davon.
Oder bevorzugst du grundsätzlich "outsourcing" (man läßt andere schreiben)

15.04.2005, 15:23
nö,aber gerade mit dieser verdammten servoroutine hab ich seit wochen probleme, ich weiß nicht ob ich irgendwo einen denkfehler habe, aber ich bekomms nicht gebacken. ich hab mir alles selbst beigebracht und das mach ich , indem ich mir fertige sachen ansehe und dann nachbaue. copypaste hab ich noch nie gemacht

eFFex
15.04.2005, 15:38
wie wärs du schaust dir den basic code von Wiremeier an...
da ist kein Begriff, Befehl, etc. drin, der nicht genauso in C existiert...
und dann baust du das ganze einfach in C nach...?

chr-mt
15.04.2005, 16:33
Hi,
ich nehme mal an, daß Du das gerne selber programmieren willst?
Falls nicht, gibt es bei http://www.milinst.com unter "Animatronics -> Servo driver Board" einen 8-pinnigen Chip (etwas schwer zu finden, da kein Bild), der 3 Servos ansteuern kann und so weit ich weiß das macht, was du benötigst. Habe den vor Jahren mal ausprobiert.
Angesteuert wird der Chip seriell, ich glaube mit 9600,n,8,1
Auch Positionsrückmeldungen (wie steht das Servo gerade) kann man abfragen.


Gruß
Christopher

the_Ghost666
15.04.2005, 19:42
also, ich hab mir da was überlegt. ich würd gerne wissen ob das so klappt, dann mach ich mir nen code draus.
ich habe nen PIC16F84 mit 4mhz. den vorteiler vom timer0 stell ich auf 4, damit ist jeder takt genau 4µs lang. 1ms durch 256 sind rund 4µs. jetzt stell ich nen timer0 interrupt ein. erst lass ich ihn einmal durchlaufen, macht 1ms.sobald der timer im zweiten durchgang meinen wunschwert x erreicht hat, schalt ich das signal ab, damit hab ich dann X+1ms erreicht. jetzt noch weitere 8 durchläufe und ich hab 20ms durch. dann beginnt das spiel von vorne. um den zweiten servo zu starten hab ich ja zeit wenn der timer vom anderen servo nicht benutzt wird. so, wo liegen meine denkfehler. ich glaub einer liegt darin, dass ich den timer ja überprüfen muss wann er x erreicht richtig?

the_Ghost666
16.04.2005, 13:18
also ich hab nochmal überlegt und gesucht, wenn ich assembler verwende, kann ich 250 schritte machen, weil jeder vergleich 4µs dauert. nur überleg ich grad wie ich 2 servos steuer, denn ich hab ja den vorteiler schon auf 1. muss ich dafür etwa einen 8mhz quarz nehmen oder geht das noch anders?

the_Ghost666
16.04.2005, 16:48
was macht ein servomotor wenn ich ihm für eine oder 2 perioden von 20ms kein signal gebe?

stegr
16.04.2005, 16:58
Du kannst doch das Timer0-Register mit einem bestimmten Wert vorladen und somit wieder einen Interrupt auslösen lassen und musst nicht drauf prüfen, ob der Wert stimmt (Vorladewert=255-Sollwert).

Hab mir aber noch nicht so genau durchgelesen, ob das ganze in dem Kontext, wo du es brauchst, so Sinn macht - das da oben ist mir nur beim Querlesen aufgefallen...

Und ich würde dir empfehlen gleich auf irgendeinen anderen PIC-Typ umzusteigen, da die 16F84er zum einen schweineteuer sind (für ihre Leistung) und zum anderen wenig Ressourcen haben (kein HW-UART, kein I²C, usw) - vom Stromverbrauch möcht ich gar nicht erst anfangen.
Empfehlen kann ich dir den 16F627 als direkten Ersatz (Pinkompatibel), oder die ganze 16F87X-Reihe - davon besonders die 16F870er(28-Piner) und wenn man mal ein wirklich richtig großes Projekt macht den 16F876(28er) bzw. 16F877(40er) (je nach Anzahl der Portpins).

MfG
Stefan

chr-mt
16.04.2005, 18:19
was macht ein servomotor wenn ich ihm für eine oder 2 perioden von 20ms kein signal gebe?
Der müßte normalerweise einfach auf der letzten Position stehen bleiben., solange er nicht durch mechanische Einwirkung weggedreht wird.
Das Problem ist, die Festhaltekraft des Servos nimmt mit sinkender Impulsrate ab.
Je mehr Impulse man an's Servo Sendet, desto stärker bleibt das Servo auf der Stelle.
Deshalb gibt's im Modellbaubereich sog. Servobooster, die das Signal doppelt so oft an's Servo senden um die Festhaltekraft zu erhöhen.

Gruß
Christopher

the_Ghost666
16.04.2005, 20:58
ne, der 16f84 ist schon ok, ich hab ihn hier liegen, bin äußerst günstig dran gekommen. und ich will ja einen kleinen verbauen. in der elektor (zeitschrift) vom april gibts einen walker der mit 2 servos und 2 fühlern ausgestattet ist. diesen möchte ich nachbauen aber mit nem pic weil ich mit atmels nicht umgehen kann und auch keinen programmer hab.
sonst nehm ich nur den pic 16F876/7 A.
mh also wenn ich abwechseln den einen, dann den anderen anspreche dann geht das auch.. mhh
soweit ich weiß braucht der pic 2takte um den neuen timerstand zu initialisieren, das müsste man einrechnen, ne? aber wie bekomm ich mit einem timer dann 2 servos hin

23.04.2005, 15:02
Ich hab mir mal folgendes überlegt:

Wenn ich sowohl das AN, als auch das Abschalten des Servoausgangs zeitlich so in eine Zählscheife einbaue, das beides genau gleich viel Zeit frisst und ich für jeden Schleifenlauf abfrage, ob die für den entsprechenden Servo bestimmte Anschalthäufigkeit (Pulsbreite) erreicht ist wäre das doch eine sehr simple wenn möglicherweise auch nicht die effizienteste Ansteuerungstechnik.

Ich will das hier nochmal in CCBASIC verdeutlichen - der Ablauf ist ja leicht auf jede andere struktuierte Sprache übertragbar. (noch nicht getestet und mit CCBASIC geschwinigkeitstechnisch wohl auch nicht machbar)

Die eingesetzten Werte (vor allem für Periodendauer) sind natürlich rein fiktiv und müssen rausgefunden werden.

' Hier erfolgt normal die Parametrisierung von aussen...
ANFANG:

PulsBreiteServo1=1500 ' (mikrosekunden)
PulsBreiteServo2=2000
PulsBreiteServo3=1700

FOR I=1 TO 20000 ' Periodendauer
IF I<=PulsBreiteServo1 THEN PORT1=ON
IF I<=PulsBreiteServo2 THEN PORT2=ON
IF I<=PulsBreiteServo3 THEN PORT3=ON

IF I> PulsBreiteServo1 THEN PORT1=OFF
IF I> PulsBreiteServo2 THEN PORT2=OFF
IF I> PulsBreiteServo3 THEN PORT3=OFF
NEXT I

GOTO ANFANG

Smi
25.04.2005, 09:29
also ghost ich arbeite gerade an so ner steuerung.Bin jetzt bei 9 servos.
Hab nen 16f873A mit 28 pins. 4mhz und benutze Timer2.Den kann man auf gewünchten wert einstellen. bei mir 100.
Die auflösung ist nicht die beste 10-20 die servos sind aber sehr stark
und für mein bein reicht es.