Archiv verlassen und diese Seite im Standarddesign anzeigen : Servos ansteuern
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
Hallo x-ryder,
guckst du hier:
http://www.elektronik-projekt.de/forumview_showthread_threadid_1238.html
Gruss, Michael
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Hallo Gast-E-Fan,
warum benutzt du nicht die Bascom-eigenen Servoroutinen?
Steht alles in der Hilfe...
Gruß, Michael
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
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
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.
@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.
Hallo E-Fan,
hmmm, nichts spricht dagegen, statt "Servos = 2" einen anderen Wert einzutragen. Vielleicht "Servos = 13" ?
Entsprechende Portdefinitionen vorrausgesetzt...
Gruß, Michael
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.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.