-
-
Erfahrener Benutzer
Begeisterter Techniker
Also wäre es am sinnvollsten die schritgeschwindigkeit soweit gochzuschrauben das er sich selbst stabilisiert
-
Super-Moderator
Lebende Robotik Legende
-
Erfahrener Benutzer
Begeisterter Techniker
XD sieht ja witzig aus XD
Ma sehn was sich draus machen läst
DU kennst aber nich zufällig ein Chip der PWM besser kann als der MIcro Controller ?
Ein weiteres Problem ist mir gerade aufgefallen
Der verzettelt sich manchmal und weis dnn nich mehr wo er war
also bleibt das Bein stehn und es passiert garnix mehr
mfg Feratu
-
Super-Moderator
Lebende Robotik Legende
Wenn es um die Steuerung von Servos geht, dann gibt es auch einen Servo Controler. Es ist aber auch nur ein entsprechender Controler mit Spezialaufgabe.
http://www.google.de/search?hl=de&q=...ntroller&meta=
Ich wollte in der Diskussion nicht abschweifen, es ist aber nach den angesprochenen Themen ein weites Feld. Schlimmstenfalls kann man ja später noch einen Thread zu den speziellen Themen der Bewegungen aufmachen, das entwickelt sich dann...
Manfred
-
Erfahrener Benutzer
Begeisterter Techniker
Na der SD20 Controller hört sich dochmal sehr gut an ;P
danke dir ;P
NUr die Frage ist
1. Kann ich den mit meinem Chip verbinden ? (I²C Bus sollte der eigentlich haben)
2. Ich habe den MAX 232 an meinem Chip hängen um damit Texte zum PC zu senden. Aber der Servo Controller benötigt die selben Pins.
Kann ich nun Beide an die Leitung hängen ohne das sie sich im Weg stehn ?
ps: In dem Thread geht es einfach um beides ^^
-
Erfahrener Benutzer
Roboter Genie
Feratu, bist du sicher, das die Fuses in deinem µC nicht zufällig den Takt durch 8 teilen?
Servosteuerung mache ich übrigens per Software, die mit 10 Servos ganz ordentlich und flatterfrei funktioniert und nicht viel Rechenzeit erfordert.
Ich steuere die Servos nacheinander in einer Interrupt-Routine an.
Diese Routine schaltet in einem Rutsch den aktuellen Servo ab, schaltet den nächsten an und belegt einen Timer mit einem passenden Wert, sodaß dessen Überlauf nach 1-2ms diesen Servo abgeschaltet und den folgenden einschaltet usw.
Nach einem Durchgang aller Servos kommt eine Pause, die 20ms - (summe aller servozeiten) lang ist, wozu ich einen n+1. virtuellen Servo setze.
Gruß MeckPommER
-
Erfahrener Benutzer
Begeisterter Techniker
Also meine Fusebits sind genauso eingestellt wie hier beschrieben
https://www.roboternetz.de/wissen/in...sebitquarz.gif
Ich bin lediglich die Schritte durchgegangen und habe das Programm verändert.
Oder liegt das vielleicht an den Kondensatoren die am Quarz hängen
Bei einem 8MHz quarz sind es 22pF könnte ja sein das andere eingesetzt werden müssen.
Das is mir grade erst aufgefallen ^^
Könntest du mal einen Programm ausschnitt posten?
ps: ich programmier in Bascom unter Basic
-
Erfahrener Benutzer
Fleißiges Mitglied
Also zu Basic kann ich nichts sagen. Ich denke, die Servosteuerung sollte in Assembler geschrieben werden.
Ich mache das bei einem PIC wie folgt:
In der Totzeit (18 ms, wo keine Servos aktiv sind) werden die Abschaltzeiten der einzelnen Servos berechnet, (Z.B. Servo 1 nach 1,9 ms, Servo 2 nach 1.2 ms, Servo 3 nach 1.8 ms, Servo 4 nach 1.8 ms).
Diese Werte werden jetzt nach aufsteigender Zeit sortiert:
(1.2 - Servo 2), (1.8 - Servo 3 und Servo 4), (1.9 Servo 1)
Jetzt berechne ich nur die Differenzen bis zum Ausschalten des jeweils nächsten Servos (Startwert ist 0.0 ms):
(S2 - 1.2) , (S3 & S4 - 06), (S1 - 0.1)
Diese Werte schreibe ich in eine zweispaltige Tabelle. 1. Wert ist ein Bitmap aller auszuschaltenden Servos. 2. Wert ist die Zeit bis zum Ausschalten der nächsten Servos.
0x00 | 1.2 ; Start, noch keine Servos ausschalten, 1.2 ms warten
0x02 | 0.6 ; S2 ausschalten, 0.6 ms warten
0x0c | 0.1 : S3 und S4 abschalten (Bits 3 und 4), 0.1 ms warten
0x01 | 0.0 : S1 abschalten und fertig
Die Interrupt-Routine kriegt einen Pointer auf die erste Zeile der Tabelle als Parameter.
Meine Timer-Interrupt-Routine macht jetzt folgendes (nachdem sie einmal zum Zeitpunkt 0ms angestoßen wurde);
XOR Spalte 1 der Tabelle mit den Ausgabe-Ports der Servos.
Setze nächsten Timer-Interupt auf den Wert der Spalte 2 der Tabelle.
Erhöhe Zeilen-Pointer in die Tabelle um 1.
Vorteile:
- Die Interrupt-Routine ist extrem schnell.
- Es können mehrere Servos gleichzeitig ausgeschaltet werden, da immer 8 Bit am Port gleichzeitig gekippt werden können.
- Die Anzahl der Servos ist hauptsächlich durch die Anzahl der Ports beschränkt.
Nachteile:
Etwas RAM-Verbrauch durch die angelegte Tabelle.
Ist softwaretechnisch ein ziemlicher Aufwand, das Ganze elegant und effizient hinzubekommen, funktioniert aber tadellos.
-
Erfahrener Benutzer
Begeisterter Techniker
Also das Prinzip habe ich soweit verstanden und muss sagen gute idee ^^
Aber wie bekomst du die genaue Zeit hin ?
ich glaube mit W
Waitms 1.2
is das nicht getan ^^
Oder hast du noch einene 2. Timer laufen der dir das berechnet ?
Ich dachte mir vll wäre es ja möglich eine timer zu machen der alle 20ms ein interupt auslöst.
Gleichzeitig läuft ein wesentlich schnellerer Timer der einfach nur drin hat
also
Dim a as word
Interup_timer2_
load timer2 xxx
a = a + 1
return
Der andere Timer hingegen hat
interupt_timer_der 20ms_hat:
load ....
porta.0 = 1
..
..
porta.7 = 1
a = 0
do
If a >= 100 then porta.0 = 0
...
...
If a >= 180 then porta.7 = 0
loop until a = 500 'das sollen dann halt 2ms sein
Return
In der Hauptschleife steht halt drin was für ein Wert der jeweilige servo hat
Ich probier das ma aus ;P
-
Erfahrener Benutzer
Begeisterter Techniker
Schade geht nich XD
wer häts gedacht ^^
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen