- 3D-Druck Einstieg und Tipps         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: Servo hat das große Zittern

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    29.01.2009
    Beiträge
    15

    Servo hat das große Zittern

    Anzeige

    Powerstation Test
    Hallo zusammen,

    mein Servo hat das große Zittern:

    Ich versuche ihn über das Control M32 Board des RP6 anzusteuern. Dabei verwende ich die Standard PWM Betriebsart des Timers 1 und der Servo liegt mit seiner Steuerleitung an PIND5.

    Das Problem:
    Der Servo dreht zwar wie befohlen, zittert aber mächtig.
    Kann ich ihm das Zittern abgewöhnen ?

    Viele Grüße

    Igeligel




    Hier mein Code:

    Code:
    #include "RP6ControlLib.h"
    
    void initServo(void) 
    {
    	DDRD   |= (1 << PD5);						// define PIND5 as output
    	TCCR1B |= (1 << CS12);										// systemclock :256
    	TCCR1A |= (1 << COM1A1) | (1 << WGM11) | (1 << WGM11);	// 9bit PWM-mode
    	OCR1A   = 26;								// set compare value
    	sei();										// enable interrupts
    }
    
    
    int main(void)
    {
    	uint8_t counter=0;
    
    	initRP6Control();
    	initServo();
    
    	startStopwatch1(); // Stopwatch1 starten!
    
    	while(true) 
    	{
    		// Check if a key is pressed:
    		uint8_t key =  getPressedKeyNumber(); 
    		
    		// If button 1 is pressed => turn servo to the right
    		if (key==1 || ch=='u') {
    			OCR1A++;
    			setStopwatch1(0);
    			while(getStopwatch1() < 200) {
    				counter++;
    			}
    		}
    	
    		// If button 2 is pressed => turn servo to the left
    		if (key==2 || ch=='d') {
    			OCR1A--;
    			setStopwatch1(0);
    			while(getStopwatch1() < 200) {
    				counter++;
    			}
    		}
    		
    		
    		// If no button is pressed => do nothing
    		if (key==0) {
    		}
    	}
    }

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo IgelIgel,

    so kann das nicht gehen.
    Aber es gibt genau für deinen Ansatz (Servo-Ansteuerung an PIND5 mit PWM) eine fertige Version für die RP6Control M32 hier ...:
    https://www.roboternetz.de/phpBB2/viewtopic.php?t=34407
    Such mal in dem Thread nach der Datei RP6Control_Servo2.zip (8.10.07)!

    Gruß Dirk

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    29.01.2009
    Beiträge
    15
    Hallo Dirk,

    Danke für die schnelle Antwort und den Link.

    Nachdem mein Code den Servo so erzittern ließ, hatte ich Deinen Code ebenfalls schon ausprobiert.

    Gleiches Ergebnis: ebenfalls viel Zittern und Gewackel.

    Du schreibst "so kann das nicht gehen".
    Warum kann das so nicht gehen ?
    Was ist grundsätzlich falsch an meinem Code ?

    Viele Grüße
    Igeligel

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Ich dachte immer die Hardware-PWM würde bei Servos nicht funktionieren. Offensichtlich lag ich da falsch:

    https://www.roboternetz.de/phpBB2/ze...=412101#412101

    Allerdings ist mit dieser Technik die Anzahl der Servos durch die vorhandenen (und sonst nicht genutzten) PWM-Timer beschränkt. Oder liege ich da auch falsch? Eine echte Alternative scheint mir da nur die Verwendung eines Counters der die Impulse für mehrere Servos nacheinander erzeugt. Nacheinander ist auch zur Verringerung der Anlaufströme (Gleichzeitigkeitsfaktor) sinnvoll.

    Gruß

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

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    29.01.2009
    Beiträge
    15
    Hallo Radbruch,

    Danke für die Mühen und den Link.
    Ich verstehe nur den Zusammenhang zu meinem "Zitterservo" nicht.
    Sollte ich diesen anderen Code ebenfalls ausprobieren ?

    Viele Grüße
    Igeligel

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    29.01.2009
    Beiträge
    15
    Hi Leute,

    soeben schaut mir mein Sohn (7 Jahre) über die Schulter (je länger er mir zuschaut, desto weniger muß er Mathe machen ...) und hat die Lösung des Problems:

    Papa, der Servo zittert so, weil er sich so anstrengen muß.

    Viele Grüße

    Igeligel

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Nachdem mein Code den Servo so erzittern ließ, hatte ich Deinen Code ebenfalls schon ausprobiert. Gleiches Ergebnis: ebenfalls viel Zittern und Gewackel.
    Also, bei mir zittert oder wackelt nichts.
    Was ich mir vorstellen kann:
    Wenn die beiden Anschlagswerte (LEFT_TOUCH und RIGHT_TOUCH) nicht auf dein Servo abgestimmt sind, dann gibt es in beiden Endstellungen ein "Brummen". Das liegt daran, dass das Servo gegen seinen Anschlag arbeitet.

    Das kann man in meinem Programm einfach durch Anpassen der beiden Konstanten verhindern: Danach gibt es das Brummen oder Zittern nicht mehr und der Drehbereich des Servos ist richtig eingestellt.
    Also: Dein Sohn hat Recht! Das Servo strengt sich an, weil seine Bewegungsgrenzen noch nicht abgeglichen sind.

    Gruß Dirk

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    29.01.2009
    Beiträge
    15
    Hallo Dirk,

    ein Zittern im Rechts-/Links-Anschlagbereich wäre zu erklären.

    Der Servo zuckt aber auch auf seiner Fahrt von rechts nach links (z.B. wenn ich Dein Testprogramm laufen lasse).

    Ich glaube, ich werde ihn mal an mein myAVR MK1 Board mit einem ATmega8 hängen und schauen, was dann passiert.

    Viele Grüße

    Igeligel

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo IgelIgel,
    Der Servo zuckt aber auch auf seiner Fahrt von rechts nach links (z.B. wenn ich Dein Testprogramm laufen lasse).
    Ok, ich werde auch noch mal einen Testlauf machen, das Oszi dranhalten und wieder berichten ...

    Gruß Dirk

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo IgelIgel,

    so, ich habe die Anschlagswerte auf die Norm (1ms..2ms Impuls) gesetzt:
    #define LEFT_TOUCH 1000 // Left servo touch (~1.0ms)
    #define RIGHT_TOUCH 1000 // Right servo touch (~2.0ms)

    ... und die task auf die Schnelle so verändert, dass sich das Servo ganz langsam auf seine 3 Hauptpositionen (Links/Mitte/Rechts) bewegen kann:
    Code:
    void task_SERVO(void)
    {static uint8_t pos;
    // -----------------------------------------------------------------------
    // Your test code for positioning the servo here:
    	if (getStopwatch1() > 5000) {		// Change position every ~5s
    		if (pos == 0) {
    			while (position > 1) {
    				position -= 2;
    				setSERVO(position);
    				setCursorPosLCD(0, 0);
    				writeStringLCD_P("Servopos.: ");
    				writeIntegerLCD(position, DEC);
    				writeStringLCD_P("  ");
    				mSleep(10);
    			}
    		}								// Position of servo
    		if (pos == 1) {
    			while (position < MIDDLE_POSITION) {
    				position += 2;
    				setSERVO(position);
    				setCursorPosLCD(0, 0);
    				writeStringLCD_P("Servopos.: ");
    				writeIntegerLCD(position, DEC);
    				writeStringLCD_P("  ");
    				mSleep(10);
    			}
    		}
    		if (pos == 2) {
    			while (position < RIGHT_TOUCH) {
    				position += 2;
    				setSERVO(position);
    				setCursorPosLCD(0, 0);
    				writeStringLCD_P("Servopos.: ");
    				writeIntegerLCD(position, DEC);
    				writeStringLCD_P("  ");
    				mSleep(10);
    			}
    		}
    		if (pos == 3) {
    			while (position > MIDDLE_POSITION) {
    				position -= 2;
    				setSERVO(position);
    				setCursorPosLCD(0, 0);
    				writeStringLCD_P("Servopos.: ");
    				writeIntegerLCD(position, DEC);
    				writeStringLCD_P("  ");
    				mSleep(10);
    			}
    		}
    	
    		pos++;
    		if (pos > 3) {pos = 0;}
    		setStopwatch1(0);
    	}
    // -----------------------------------------------------------------------
    }
    Ergebnis:
    Das Servo bewegt sich ganz ruhig von links nach rechts und umgekehrt. Laut Oszi liegt der Impuls zwischen 1 und 2 ms, also ok.

    Wie ist das bei dir? Reagiert das Servo irgendwie merkwürdig?

    Gruß Dirk

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad