PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo ansteuerung



ChristophB
23.10.2009, 19:30
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.



#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



while( 1 ) {
servo1 = 900 + PINC;
}


Ich hoffe ihr könnt mir bei der Fehlerbehebung helfen.

Gruß Christoph

sternst
23.10.2009, 20:18
"servo1" muss volatile sein.

ChristophB
23.10.2009, 20:36
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.