mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zur Steuerung von Servos


Autor: Sebastian Feger (sebbi1989)
Datum:

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

Autor: Zoch (Gast)
Datum:

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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Sebastian Feger (sebbi1989)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Uwe (Gast)
Datum:

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


Autor: Sebastian Feger (sebbi1989)
Datum:

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

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.