N'abend zusammen,
im Moment baue ich einen Quadrocopter.
Auf der Hauptplatine befindet sich ein ATMega8 ein SPI 433Mhz Funkmodul und ein 3-Kanal G-Sensor.
Alles bis auf die Ansteuerung der 4 Motoren funktioniert.
Der bisher geschriebene Code sieht so aus:
Taktfrequenz: 16Mhz
Die Startsequenz funktioniert.Code:#define running 1 //Motoren #define VORNE 1<<PD5 #define LINKS 1<<PB0 #define RECHTS 1<<PC5 #define HINTEN 1<<PC0 #define VORNE_EIN PORTD|=VORNE; #define VORNE_AUS PORTD&=~VORNE; #define LINKS_EIN PORTB|=LINKS; #define LINKS_AUS PORTB&=~LINKS; #define RECHTS_EIN PORTC|=RECHTS; #define RECHTS_AUS PORTC&=~RECHTS; #define HINTEN_EIN PORTC|=HINTEN; #define HINTEN_AUS PORTC&=~HINTEN; //PWM TIMER volatile int iValVorne = 0; volatile int iValLinks = 0; volatile int iValRechts = 0; volatile int iValHinten = 0; int pwmCount = 0; int pwmStep = 0; #define TIMERVALUE_0 235 //235 mit Vorteiler 8 (20 Steps = 10us) #define VORTEILER_0 0b00000010 //Vorteiler: 8 int main( void ) { //Timer initialisierung // Timer 0 konfigurieren TCCR0 = VORTEILER_0; // Prescaler 8 // Overflow Interrupt erlauben TIMSK |= (1<<TOIE0); TCNT0 = TIMERVALUE_0; //Ports definieren DDRB |= 0b11000011; DDRC = 0b11100011; // Port C als Eingang DDRD = 0b11111111; //PWM-Werte einstellen iValVorne,iValLinks,iValRechts,iValHinten = 0; VORNE_AUS LINKS_AUS RECHTS_AUS HINTEN_AUS sei(); //Interrupts starten //Startsequenz der Motoren _delay_ms(1000); iValRechts = 100; iValLinks = 100; iValVorne = 100; iValHinten = 100; _delay_ms(200); iValRechts = 0; iValLinks = 0; iValVorne = 0; iValHinten = 0; _delay_ms(1000); //Startsequenz ENDE // Hauptschleife des Programms while ( running ) { } } /* ################################################################################ */ /* ############################# Timer ######################################## */ /* ################################################################################ */ ISR(TIMER0_OVF_vect) { TCNT0 = TIMERVALUE_0; // 20us if(pwmStep == 0) { //1. ms HINTEN_EIN VORNE_EIN LINKS_EIN RECHTS_EIN } if(pwmStep == 1){ //2. ms if(pwmCount==iValVorne) VORNE_AUS //else VORNE_EIN if(pwmCount==iValLinks) LINKS_AUS //else LINKS_EIN if(pwmCount==iValRechts) RECHTS_AUS //else RECHTS_EIN if(pwmCount==iValHinten) HINTEN_AUS //else HINTEN_EIN } if(pwmStep > 1){ //3. bis 20. ms HINTEN_AUS VORNE_AUS LINKS_AUS RECHTS_AUS } if(pwmCount++ == 99){ if(pwmStep++==19){ pwmStep = 0; } pwmCount = 0; } }
Wenn ich einen Wert in iValHinten stecke, fängt der Brushlessregler an zu Piepsen (Break->Fehlerhaftes Signal)
Bei allen anderen Ansteuerungen funktioniert.
Wenn ich alle anderen Motoren rausnehme und nur den hinteren Motor ansteuere, dann funktioniert das ganze.
Ich würde sagen, dass es dadurch nicht an der Hardware liegt (Kalte Lötstellen etc.)
Sieht vllt. einer von euch einen Fehler in der Ansteuerung???
Über Hilfe würde ich mich sehr freuen
Danke und Gruß,
Zitrone







Zitieren


Lesezeichen