Forum: Mikrocontroller und Digitale Elektronik Frage zur Steuerung von Servos


von Sebastian F. (sebbi1989)


Lesenswert?

Hallo,

bisher hatte ich noch keine Erfahrung in der Steuerung von Servos durch 
einen Miconcontroller. Ich hab jetzt jedoch mal an meinem Standartservo 
von Graupner ein wenig herumpropiert, und siehe da, nach einiger Zeit 
tüfteln, es geschafft den, dass ich den Servo in eine Richtung steuern 
kann. Ich habe dazu 2 der Servoleitungen an 5V bzw. 0V gehängt. Die 
andere Leitung an einen Port, den das Programm an - und aussteuert. Wie 
gesagt, das funktioniert jedoch nur in eine Richtung. Wenn ich übrigens 
das Kabel, der Leitung an 0V per Hand dran mach, und weg nehme, dann 
geht mit jedem Kontakt an 0V der Servo in die andere  Richtung. Doch wie 
kann ich das im Programm realisieren, ich kann ja nicht 0V setzen, und 
rücksetzen. Wäre nett wenn mir jemand helfen könnte.

Danke und schönen Gruß

von Zoch (Gast)


Lesenswert?

Tja, der Signaleingang, der gelbe Draht, wird mit einem HCMOS 
angesteuert. Die Pulsbreite ist 0.8 bis 2.2ms, die Repetitionsrate ist 
20ms. Die 20ms muessen nicht so genau sein, die 0.8 bis 2.2ms schon. dh 
die 0.8 bis 2.2ms sollten mit einem Comparecounter gemacht werden.

Z

von Hannes L. (hannes)


Lesenswert?


von Sebastian F. (sebbi1989)


Lesenswert?

Danke für eure Hilfe bis hierher.

Ich habe, da ich nicht so viel von Timern weiß, die Einstellung der 
Zeitabstände durch das runterzählen von Registern realisiert. Sollte ja 
theoretisch genau so funktioniern, oder?

Wenn ich den Port 2.0, an dem die Steuerleitung des Servos hängt, für 
eine Breite von 1ms setzte, und dann eine Pause von 20ms einrichte, dann 
steuert der Servo wie gewünscht in, für meine Anwendungszwecke genau 
gewünschter Geschwindigkeit, langsam nach links.

So wie ich das verstanden habe müsste man ja nur die zeitliche Länge, in 
der der Port 2.0 gesetzt ist auf 2ms verlängern, um eine Steuerung nach 
rechts zu erreichen, richtig? Wenn ich das jedoch mache, wiederum bei 
einem zeitlichen Abstand von 20ms dazwischen, dann steuert der Servo 
jedoch wieder nach links, und zwar in einer viel zu schnellen 
Geschwindigkeit.

Wäre nett wenn mir da jemand eine Antwort geben könnte, was ich falsch 
mache.

von Karl H. (kbuchegg)


Lesenswert?

Sebastian Feger wrote:

> Wäre nett wenn mir da jemand eine Antwort geben könnte, was ich falsch
> mache.

Was du mal prinzipiell falsch machst:
Du stellst die Frage "Warum dein Programm nicht
so funkntioniert, wie du dir das vorstellst"
zeigst aber dein Programm nicht her.

von Uwe (Gast)


Lesenswert?

Hi!
<für meine Anwendungszwecke genau gewünschter Geschwindigkeit, langsam 
<nach links.
.
.
<und zwar in einer viel zu schnellen Geschwindigkeit.

Dann stimmt mit deiner 1ms schon irgendwas nicht, weil nur noch winzige 
Abweichungen von Ist und Soll die Geschwindigkeit absenken.
Auch im 2. Fall scheint die Zeit nicht zu passen. Wenn ich mich aber 
recht entsinne, gibt es auch Servos mit negativer Ansteuerung, also 
1-2ms L-Flanke. Wäre allerdings eine Stolperfalle, eigentlich immer 
positive Flanke.

Ein langsames hinlaufen zur Sollposition kannst du nur durch 
rampenartiges hoch/runterfahren deines Sollwertes erreichen. Dein 
Grundproblem wird aber vermutlich die Flankenerzeugung überhaupt sein. 
Da du aber nicht sagst wie du deine Programme erstellst kann dir nicht 
geholfen werden.

MFG Uwe


von Sebastian F. (sebbi1989)


Lesenswert?

Ok, im Folgenden mein Programm:


include REG_8252.pdf
code at 0

mov    r1,#1
mov    r2,#2
mov    r3,#40
mov    r4,#250
mov    r5,#2
mov    r6,#3
mov    r7,#4

start:      mov  a,p1
      anl  a,r1
      cjne  a,#1,lioderre
      sjmp  mitte
lioderre:      mov  a,p1
anl  a,r2
        cjne  a,#2,links
        sjmp  rechts
links:        setb  p2.0
        acall  signalhaltenli
        clr  p2.0
        acall  pausezwanzig
        sjmp  links
rechts:        setb  p2.0
        acall  signalhaltenre
        clr  p2.0
        acall  pausezwanzig
        sjmp  rechts
mitte:        setb  p2.0
        acall  signalhaltenmitte
        clr  p2.0
        acall  pausezwanzig
        sjmp  mitte


signalhaltenli:          djnz  r4,signalhaltenli
            mov  r4,#250
            djnz  r5,signalhaltenli
            mov  r5,#2
            ret
signalhaltenre:          djnz  r4,signalhaltenre
            mov  r4,#250
            djnz  r7,signalhaltenre
            mov  r7,#4
            ret
signalhaltenmitte:        djnz  r4,signalhaltenmitte
            mov  r4,#250
            djnz  r6,signalhaltenmitte
            mov  r6,#3
            ret
pausezwanzig:          djnz  r4,pausezwanzig
            mov  r4,#250
            djnz  r3,pausezwanzig
            mov  r3,40
ret
end

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.