PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servos ansteuern



x-ryder
10.07.2004, 10:06
Hi

Ich habe versucht mit Bascom einen Servo anzusteuern aber irgendwie
will der nicht so richtig wie ich will.

$regfile = "m8def.dat"
$crystal = 14745600

Config Servos = 1 , Servo1 = Portc.5 , Reload = 10

Config Portb = Output

Enable Interrupts

Dim I As Word
Do
For I = 0 To 100
Servo(1) = I
Waitms 1000
Next

For I = 200 To 0 Step -1
Servo(1) = I
Waitms 1000
Next
Loop


End
Der läuft aber immer nur in eine Richtung.
Da ich ihn für eine Robotersteuerung verwenden will, brauche ich aber die andere
Richtung auch noch...

Vielleicht kann mir jemand helfen.

Danke im Voraus.

Martin

Michael
10.07.2004, 13:41
Hallo x-ryder,
guckst du hier:
http://www.elektronik-projekt.de/forumview_showthread_threadid_1238.html
Gruss, Michael

x-ryder
10.07.2004, 14:07
Hi

Erstmal Danke aber wie kann ich den Servo denn dauerhaft in die andere Richtung drehen lassen?

Was sagt das Waitms...?
Was sagt das Servo(1)=...
Was soll die for-Schleife?

Martin

Michael
10.07.2004, 14:20
Hallo x-ryder,
deine Fragen klingen so, als ob du überhaupt nichts verstanden hättest.
Da du Bascom auf dem Rechner hast, ist es sicher ein leichtes für dich, mal auf die Hilfe-Funktion zurückzugreifen. Alle deine Fragen sind dort ausreichend erklärt.
Das Kopieren des Codes hast du doch auch geschafft?
Gruss, Michael

x-ryder
10.07.2004, 14:32
Hi

Ja das kopieren hab ich geschafft aber mein Problem ist, dass ich da in der Hilfe ziemlich wenig verstehe und da ist ja auch nicht erklärt was z.B. das Waitms soll...

Wenn du das so gut kannst (Rang) dann schreib doch mal nen bitte neuen Code mit Kommentaren.

Das Prog soll einfach nur 1 sek nach links dann 1 sek nach rechts...
(Der Servo wurde modifiziert)

Martin

Michael
10.07.2004, 14:41
Hallo x-ryder,

da ist ja auch nicht erklärt was z.B. das Waitms soll...
wie bitte??
Das hab ich eben direkt aus der Hilfe kopiert:

WAITMS 10 'wait for 10 mS

was gibt es daran nicht zu verstehen?
Alle deine anderen Befehle sind ebenso in der Hilfe zu finden, oder hast du gar nicht gesucht?

Wenn du das so gut kannst (Rang) dann schreib doch mal nen bitte neuen Code mit Kommentaren.
Hmmm, meinst du mit Rang die Anzahl der Beiträge? Darauf solltes du in einem Forum nicht auf das Können schliessen.
Zurück zu deiner Frage: Hast du eigentlich meinen ersten Link gelesen?
Gruss, Michael

x-ryder
10.07.2004, 14:46
Mann Mann

Du solltest auch nicht denken das ich blöd bin...

Natürlich weiss ich was Waitms ist. Ich will hier aber wissen was dieses Waitms bewirkt.
Ob der Servo während dieser 10 ms in die andere Richtung steuert oder WANN er dies tut damit ich das Programm von deinem Link so modifizieren kann das ich es gebrauchen kann.

Martin

Michael
10.07.2004, 15:00
Hallo x-ryder,
du bist hartnäckig, das gefällt mir ;)
Hättest du die Hilfe zum Thema Servo gelesen, wüsstest du, dass der Servo-Impuls mit Hilfe einer Interrupt-Routine erzeugt wird. Dazu wird Timer0 benutzt. Der angegebene Reload-Wert multipliziert mit dem Wert, den du Servo(x) mitgibst, ist die Impulszeit in µS (Mikrosekunden).
Servo(x) sollte also zwischen 100 und 200 liegen.
um das Servo zu bewegen, muss nur dieser Wert geändert werden, klar?
Du änderst also den Wert, wartest ein bisschen, änderst ihn wieder, wartest, usw, usw. Wartest du nicht, wirst du keine Änderung bemerken, weil alles viel zu schnell geht. Wartest du zu lange (wie in der Hilfe)wirst du keine Änderung bemerken, weil alles viel zu langsam geht.
Verstanden?
Gruss, Michael

x-ryder
10.07.2004, 15:09
gut ich glaub das hab ich jetzt versanden...
jo servo(1)=... iss die wartezeit die der servo haben soll.
d.h.: wenn servo(1)=100 und reload=10 dann wartet der servo 100 µs und läuft dann wieder 10 µs und wie bekommt amn nun die andere drehrichtung.

p.s.: ich will den servo als antrieb benutzen, dazu brauche ich die andere richtung.

du bist überigens auch hartnäckig... O:)

Martin

Michael
10.07.2004, 15:26
Hallo x-ryder,

d.h.: wenn servo(1)=100 und reload=10 dann wartet der servo 100 µs und läuft dann wieder 10 µs
nein, servowert _mal_ Reloadwert = Impulszeit. Die muss dann zwischen 1000 (Servo läuft linksrum) und 2000 (rechtsrum) liegen. Du beeinflusst _nur_ die Impulszeit, die Pausenzeit (ca.20mS) wird von Bascom automatisch generiert.
Zusammenfassend sollten Werte für servo(x) zwischen 100 und 200 liegen.
Gruss, Michael

x-ryder
10.07.2004, 15:32
Also:

Bei meinem Testprogramm:


$regfile = "m8def.dat"
$crystal = 14745600

Config Servos = 1 , Servo1 = Portc.5 , Reload = 10

Config Portb = Output

Enable Interrupts

Dim I As Word
Do
Servo(1) = 100
Loop


End

passiert folgendes: er läuft rechtsrum mit kleinen verzögerungen.

bei diesem Programm:

$regfile = "m8def.dat"
$crystal = 14745600

Config Servos = 1 , Servo1 = Portc.5 , Reload = 10

Config Portb = Output

Enable Interrupts

Dim I As Word
Do
Servo(1) = 200
Loop


End

passiert folgendes: er dreht sich nach rechts mit größeren verzögerungszeiten

Michael
10.07.2004, 15:37
Hallo x-ryder,
was meinst du mit kleinen und grossen Verzögerungen?
Aber da du den Servoport nicht als Ausgang geschaltet hast, bekommt das Servo wahrscheinlich kein Signal, bzw. eines mit schlechter Qualität.
mit Config Portc = Output sollte es klappen ;)
Gruss, Michael

x-ryder
10.07.2004, 15:43
jo danke erst mal das iss wahr mit dem config portc=output aber leider funzt es immer noch nicht.

das mit den ausfallzeiten ist so gemeint:

wenn servo(1)=100 dann:
dreht sich fast kontinuierlich nach rechts

wenn servo(1)=200 dann:
dreht sich immer kurz stoppt dann für ich denke die gleiche zeit (ca 200 ms) und läuft dann wieder diese zeit u.s.w. das ganze nach rechts.

ich will das nun so umdrehen das der fast kontinuierlich nach links läuft und nicht nach rechts

Michael
10.07.2004, 16:03
Hallo x-ryder,
hmm, jetzt hab ich das ganze hier mal aufgebaut und sehe es mir mit dem Oszi an, saubere Impulse, kein Wackeln mit diesem Code:

$regfile = "m8def.dat"
$crystal = 14745600

Config Servos = 1 , Servo1 = Portc.5 , Reload = 10

Config Portc = Output
Enable Interrupts

Do
Servo(1) = 200
Wait 2
Servo(1) = 100
Wait 2
Loop

End
Das Servo bewegt sich 2 Sekunden nach links und 2 Sekunden nach rechts und das wiederholt sich dann.
Vielleicht hast du ja noch irgendwo ein elektrisches Problem? Wie ist Reset vom Mega8 beschaltet? Kommen Störungen vom Servo in die Mega8-Elektronik? Stabile Versorgung,Kondensatoren,etc.
Gruss, Michael

x-ryder
10.07.2004, 16:07
ne jetzt macht er 2 sek ne rechtsdrehung und dann 2 sek wieder dieses gewackele.

aber am board kanns nicht liegen das iss nen fertig aufgebautes controllerboard was bis jetzt immer gut funktioniert hat...

sogar mit nem glcd hat es keine störungen verursacht.

gibt es noch eine hardwaremäßig bedingte ursache, vielleicht liegt es am servo selbst?

Martin

x-ryder
10.07.2004, 16:17
Ich glaub ich weiss jetzt waran es liegt...
Ich hab beim modifizieren das poti ausgebaut und keine Widerstände reingesetzt...

Könnte das die Lösung sein?
Und wenn ja dann: Was für Widerstände müssen da rein?

Martin

Michael
10.07.2004, 19:14
Hallo x-ryder,

das poti ausgebaut und keine Widerstände reingesetzt...
Arrrrgh, wie soll denn die Servoelektronik regeln ohne Rückkopplung?
Wert ist 2mal 1/2er Potiwert, etwas drüber schadet nicht. Beispiel: Poti5kOhm -> 2 Widerstände je 2,7kOhm.
Gruss, Michael

09.08.2004, 11:57
Ich denke mal, das meine Frage hier am besten reinpasst, damit kein neues Thema eröffnet werden muss. Wenn nicht bitte nicht lynchen! :D

Ich habe folgendes Problem:
Ich will mit einem 2313 mehr als zwei Servos ansteuern, und habe mir eine Routine zusammengebastelt, mit der zumindest das Anfahren von zwei Positionen funktioniert. Nun kommt aber erschwerend hinzu, daß der Postionswechsel laaaaangsaaaam von statten gehen soll. (ein bis zwei Sekunden von Pos.1 nach Pos.2). So weit so gut etwas rumgepfrimelt und im Simulator klappts auch einwandfrei. Ich freu mir ein Loch in den Bauch, schwupps alles in den 2313 gebrannt und erwartungsvoll den Testschalter umgelegt.
Und was passiert: NÜSCHTS
Das sich alle 20ms wiederholende Signal was der µC von sich gibt bleibt stur bei 1,5ms - bei allen acht Ausgängen versteht sich. Wat mach ich falsch????

Anbei hab ich mal die wichtigtens Programmpunkte:
(weiß leider nicht wie ich die Progschnipsel anders Posten kann)

$regfile = "2313def.dat"
$crystal = 10000000

Dim A As Byte
Dim B As Word
Dim C( 8 ) As Word
Dim D As Word
Dim E As Word
.
C(1) = 3750
Config Portb = Output
Config Portd = Input
Portb = 0

Kontrolle:
If A = 8 Then
For E = 1 To D
Next
End If
If Portd.0 = 1 Then Gosub Decr1 Else Gosub Incr1
.
If A > 7 Then A = 0
If A = 0 Then B = C(1)
.
Goto Anf

Anf:
Pulseout Portb , A , B
A = A + 1
Goto Kontrolle

Decr1:
Decr C(1)
If C(1) < 3475 Then C(1) = 3475
Return

Incr1:
Incr C(1)
If C(1) > 3750 Then C(1) = 3750
Return


mfG der E-Fan

Michael
09.08.2004, 15:14
Hallo Gast-E-Fan,
warum benutzt du nicht die Bascom-eigenen Servoroutinen?
Steht alles in der Hilfe...
Gruß, Michael

Netbird
09.08.2004, 15:34
Hallo x-ryder,

bei einem vollständig funktionierenden Servo (mit Poti!!) ist die Ausschlagsweite noch typabhängig. Ich lasse z.B. bei einem Graupner-Servo i von 30 bis 110 laufen und wieder rückwärts... Damit überstreiche ich den zulässigen Drehwinkel von 180 Grad.

Viel Erfolg, Harald

Michael
09.08.2004, 20:38
Hallo Netbird,
hast du die Beiträge von x-ryder gelesen?
Dann wüsstest du, daß seine Servos keine Anschlagsweite mehr haben....
und auch kein Poti....
Gruß, Michael

Netbird
09.08.2004, 21:20
Hallo,

ja, hab ich gelesen. Deshalb steht das auch in meinem Beitrag. Ich dachte, es hilft zusätzlich zu wissen, dass die Dauer der Steuerimpulse typabhängig ist.
Da ich mehrere unterschiedliche Typen benutze, muss ich immer wieder Anpassungen vornehmen. Die Demo-Beispiele führen da manchmal zu Fehlversuchen.

Gruß, Harald.

E-Fan
10.08.2004, 08:14
@Michael:

So weit bin ich auch schon gewesen! ;)
Wie ich das verstanden habe, kann man nur zwei Servo's mit diesem Befehl ansteuern. Ich möchte aber die verbleibende Zeit nutzen um bis zu 13 Servos kontrollieren zu können was rein rechnerisch kein Problem ist, da das Steuersignal welches generiert wird bei mir nicht länger als 1,5ms dauert.
Die Internen Timer kann ich da cuh nur bedingt nehmen weil die Sprünge in die Interruptroutinen für meinen Fall zu lange dauern würden.

Michael
10.08.2004, 16:00
Hallo E-Fan,
hmmm, nichts spricht dagegen, statt "Servos = 2" einen anderen Wert einzutragen. Vielleicht "Servos = 13" ?
Entsprechende Portdefinitionen vorrausgesetzt...
Gruß, Michael

E-Fan
11.08.2004, 14:23
Die Servofunktion hab ich nicht richtig zum laufen bekommen. Die Wiederholfrequenz war zu gering weshalb die Geräte "stotterten". Ich habe anstelle dessen jetzt eine Routine, die 8 Servos ansteuern kann (für mehr reicht der Flash im 2313 nicht) und die Wiederholfrequenz des Steuersignals liegt zwischen 50,001 und 50,015 Herz. - ist also nahezu optimal. :D Mag vielleicht etwas umständlich Programmiert sein, aber wie heißt's doch so schön:
Never touch a running system!
Ausserdem reicht die verbleibende Zeit noch um insgesamt 4 I²C-Portexpander auszulesen und 4 zu beschreiben. Mehr will ich gar nicht weil der µC damit für die vorgesehene Verwendung schon total überdimensioniert ist.