-
        

Ergebnis 1 bis 3 von 3

Thema: Servo ansteuerung

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    08.06.2009
    Beiträge
    18

    Servo ansteuerung

    Anzeige

    Hallo!

    Ich versuche mit einem Mega32 mit 16MHz ein Servo anzusteuern.
    Das erzeugendes Steuersignals mithilfe des Timer0 funktioniert bereits, aber wenn ich den Wert der ausschlaggebend für die Position des Servos ist in der Hauptschleife ändern möchte reagiert der uC nicht darauf. Ich kann mir das ganze nicht so ganz erklären.

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    #ifndef F_CPU
    /* Definiere F_CPU, wenn F_CPU nicht bereits vorher definiert 
       (z.B. durch Übergabe als Parameter zum Compiler innerhalb 
       des Makefiles). Zusätzlich Ausgabe einer Warnung, die auf die
       "nachträgliche" Definition hinweist */
    #warning "F_CPU war noch nicht definiert, wird nun mit 1000000 definiert"
    #define F_CPU 16000000UL     /* Quarz mit 1,000000 Mhz */
    #endif
    #include <util/delay.h>     /* in älteren avr-libc Versionen <avr/delay.h> */ 
    
    void delay_ms(uint16_t ms) {
        for(; ms>0; ms--) _delay_ms(1);
    }
    
    
    
    //Timer Variable deklarieren
    uint16_t t = 0;
    //Servopositionsvariablen
    uint16_t servo1; // zwichen 900 - 2100 
    
    
    /*
    Servos & Timer initialisieren
    */
    void servo_init()
    {
    	//Die Steuersignale der Servos liegen an Port D an!
    	//Port D als Ausgang definieren
    	DDRD = 0xff;
    
    	//Timer initialisieren
    	TCCR0 = (1<<CS00);
    	TCNT0 = 96;
    	TIMSK|=(1<<TOIE0);
    	//Intrerrupts einschalten
    	sei();
    }
    
    //ISR beim überlauf des Timers T0
    ISR(TIMER0_OVF_vect){
    	TCNT0 = 96;	
    	
    	t = t+10;
    	if(t==20000){
    		t = 0;
    		//Servo-steuer-impuls einschalten
    		PORTD = 0x01;
    	}
    
    	//Routine zum abschalten der Servo-steuer-impulse
    	if(t>servo1){
    		//Servo-steuer-impuls ausschalten
    		PORTD = 0x00;
    	}
    	
    
    }
     
    int main( void )
    { 
    	
    	servo1 = 900;
    	
    	servo_init();
    	sei();
    	DDRC = 0x00;
    	PORTC = 0xff;
    	
    	delay_ms(1000);
    	servo1 = servo1 + 1200;
    
     
    
    	while( 1 ) { 
    		servo1 = 900 + PINC;
            }
    	
        return 0; // Wird von int main()  verlangt
    }
    Das Problem liegt in diesem Codeabschnitt

    Code:
    	while( 1 ) { 
    		servo1 = 900 + PINC;
            }
    Ich hoffe ihr könnt mir bei der Fehlerbehebung helfen.

    Gruß Christoph

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    "servo1" muss volatile sein.
    MfG
    Stefan

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    08.06.2009
    Beiträge
    18
    super danke! so funktioniert das ganze.

    Was nur ein bisschen komisch ist, ist das das Servo seinen vollen Ausschlag bei einer Impulslänge von 500 - 1775 us hat.Normalerweiße sollte die impulslänge laut RN-Wissen 1-2ms dauern http://www.rn-wissen.de/index.php/Servo. Habe ich da irgendwas falsch programmiert, oder kann das auch ein Fehler meines Servos sein?


    edit:

    Ich habe das Servo nun zum testen an einen Modellbau empfänger angeschlossen und die maximalen Winkel mit einer Fernbedinung eingestellt. Die Winkel entsprachen einer Impulslänge von 1-2ms in meinem Programm. Von daher gehe ich davon aus das mein Programm soweit richtig ist, es aber möglich ist das Servo noch weiter zu übersteuern.

Berechtigungen

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