Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo Drehweite
hallo,
bin derzeit dabei mich in den bereich von motoren einzuarbeiten und habe unter rn-wissen den artikel zu servos gelesen. dazu hätte ich mal eine ziemlich grundlegende frage:
das steuersignal wird mit dem des potis verglichen wodurch sich der motor ein gewissen stück in eine gewisse richtung dreht. auf welche position bezieht sich nun die drehweite? immer relativ zur aktuellen position oder gibt es eine art 0 stellung?
radbruch
14.09.2008, 14:08
Hallo
Standartservos haben einen Drehbereich von etwas mehr als 180°. Dabei entspricht eine bestimmte Impulslänge des Signals einer bestimmten Stellung des Servos. Die Impulslänge für die Mittelstellung sollte 1,5ms betragen, -90° wären dann 1ms und +90° entspräche 2ms. Die Drehung erfolgt immer absolut auf die der Impulslänge entsprechende Position.
Die Impulserzeugung mittels Mikrokontroller verwendet meist eine ISR die je nach Rechenleistung des Kontrollers und der geforderten Servoauflösung unterschiedlich schnell aufgerufen wird. (siehe Beispiel RN-Wissen: Servos) Bei der gängigen Taktfrequenz von 100kHz wird die ISR alle 10 µs aufgerufen. Ein Impuls von 150 ISR-Aufrufen Länge entspricht dann mit 1,5ms der Mittelstellung, 100 bzw. 200 Aufrufe jeweils den Endstellungen.
Mit 100kHz erhält man also eine Auflösung der Positionen von ca. 50 Schritten pro 90°. Wenn man weniger Schritte benötigt kann man die ISR seltener aufrufen und damit den Kontoller etwas entlasten. Ebenso kann man mit einem schnelleren Takt die Auflösung erhöhen, allerdings darf dabei die ISR nicht zu lange sein um einen Zeitüberlauf zu vermeiden.
Gruß
mic
ah verstehe, die impulslänge wird also mit einer bestimmten stellung verbunden und nicht mit einer auslenkung um eine gewisse gradzahl. also steht der motor bei einer pulslänge von x ms immer an der gleichen position
radbruch
14.09.2008, 14:41
Genau richtig erkannt.
Zusätzlich haben die Servos meist einen "Totpunkt", d.h. nur wenn sich die Impulslänge um einen bestimmten Betrag ändert wird die neue Position angefahren. Das verhindert ein Zittern bei leicht schwankenden Impulslängen (verursacht z.B. durch Interrupts mit höherer Priorität). Allerdings kann es auch bewirken dass bei einzelschrittweiser Änderung der Impulsdauer das Servo nicht jeder Änderung folgt sondern mehrere Schritte zusammenfasst.
Hallo z3ky,
Es gibt natürlich eine 0-Stellung bei einem Servo.
Der Getriebemotor im Servo stellt das Poti nach, bis der empfangene Puls mit dem intern erzeugtem übereinstimmt. Je größer die Abweichung umso größer die Motorgeschwindigkeit (Regelung)
@radbruch:
einen 100kHz Interrupt würde ich nicht verwenden. Es reichen 2 Interrupts mit einem 16Bit Timer, einer setzt den Port und der nächste löscht ihn wieder.
Gruß, Michael
nochmal zusammengefasst:
liegt ein impuls von 1,5ms an sollte der servo auf 0-stellung sein. ändert man den impuls sagen wir auf 2ms steht er bei 90°. geh ich zurück auf 1,5 bin ich wieder in der nullstellung. sollte doch so dein oder? folglich würde man so auch nie eine volle umdrehung schaffen.
radbruch
14.09.2008, 16:58
Hallo
folglich würde man so auch nie eine volle umdrehung schaffen.Das geht schon deshalb nicht weil 1.: das Poti nicht so weit drehen kann und 2.: die meisten Servos eine mechanische Sperre besitzen (wohl um das Poti vor Überdrehung zu schützen). Man kann den Drehbereich aber vergrößern indem man das Poti über ein Zwischengetriebe antreibt und den mechanischen Anschlag entfernt:
http://i2.ytimg.com/vi/IpIFPm5fswY/default.jpg (http://www.youtube.com/watch?v=IpIFPm5fswY)
http://www.youtube.com/watch?v=IpIFPm5fswY
Es reichen 2 Interrupts mit einem 16Bit Timer, einer setzt den Port und der nächste löscht ihn wieder.... und damit belegt ein einziges Servo den kompletten Timer.
Es gibt unzählige Möglichkeiten die Impulse zu erzeugen. Man sollte eben diejenige auswählen die zu dem geplanten Projekt am besten passt. Mein Favorit ist im Moment die Ansteuerung per ADC-Interrupt. Dabei kann ich nebenher noch meine analogen Eingänge einlesen und belege keinen Timer. Allerdings hat der ADC-Interrupt eine sehr geringe Priorität, aber damit kann ich leben :)
Die ADC-ISR meines aktuellen Projekts steuert Servos und wertet den ADC-Eingang am selben Pin aus. Der ADC läuft dabei im Dauerlauf (noch in der Entwicklung):
ISR(ADC_vect)
{
static uint16_t count=0; // Zykluszähler
if (count>pos[0]) // Servoimpuls senden?
{
DDRA |= 2; // nein, Pin auf Ausgang
PORTA &= ~2; // und low
}
else
{
DDRA &= ~2; // Impuls senden, Pin auf Eingang
PORTA |= 2; // und high per PullUp
}
if (count>pos[1]) // Servoimpuls senden?
{
DDRA |= 1;
PORTA &= ~1;
}
else
{
DDRA &= ~1; // Impuls senden, Pin auf Input
PORTA |= 1; // und high
}
if(count==10)
{
line[0]=ADC; // ADC auswerten und neuen Kanal setzen
ADMUX = (0<<REFS1) | (1<<REFS0) | (0<<ADLAR) | 1;
}
if(count==20)
{
line[1]=ADC;
ADMUX = (0<<REFS1) | (1<<REFS0) | (0<<ADLAR) | 0;
}
if(count<1000) count++; else count=0; // Zyklus fertig?
}
Parallel zum Servo ist ein Phototransistor (mit einem 560Ohm-Widerstand in Reihe) geschaltet. Der Servoimpuls wird über den internen PullUp bei einem auf Eingang geschaltetem Pin ausgegeben. Während des Impulses wird die Spannung am Eingang (selber Pin!) gemessen. Der Trick dabei: Auch bei voll beleuchtetem Phototransistor wird der Pegel vom Servo immer noch als High erkannt. Die Wahl des Reihenwiderstandes ist dabei etwas kritisch, spart aber gleichzeitig Platz und Pins. Mein Projekt soll mal auf einem tiny13 laufen. Das selbe Prinzip kann man z.B. auch bei Tasten verwenden und einen Servo zusammen mit einem Taster an den selben Pin hängen.
Das läuft im Moment auf einem 8MHz-Mega32 mit prescal /16, also mit 8000000/16/ca. 13(Zyklen_pro_Sample) = 38kHz. Mitte ist der Wert 53, das passt doch so in etwa ;)
Gruß
mic
Hallo Radbruch,
.. und damit belegt ein einziges Servo den kompletten Timer.
meist bleibt es ja nicht bei einem Servo.
Die Rechenzeit beschränkt sich auf 100 IRQs pro Sekunde und obendrein ist damit die beste Auflösung erreichbar.
Gruß, Michael
radbruch
14.09.2008, 18:59
Die Rechenzeit beschränkt sich auf 100 IRQs pro Sekunde
So habe ich das noch nie betrachtet und deshalb auch noch nicht versucht. Netter Ansatz :)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.