-         

Ergebnis 1 bis 10 von 10

Thema: Servo Drehweite

  1. #1

    Servo Drehweite

    Anzeige

    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?

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    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

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    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

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    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.

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    alles klar danke!

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    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

  7. #7
    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.

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    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://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):

    Code:
    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

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    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

  10. #10
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    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 :)

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •