- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 3 von 3

Thema: Software PWM für 4 Motoren (Quadrocopter) auf ATMega8

  1. #1

    Software PWM für 4 Motoren (Quadrocopter) auf ATMega8

    Anzeige

    Praxistest und DIY Projekte
    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
    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;
    	}
    }
    Die Startsequenz funktioniert.
    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

  2. #2
    Hi ich nochmal,

    der Fehler liegt in diesem Block:

    Code:
    //Motoren
    #define VORNE  1<<PD5
    #define LINKS 1<<PB0
    #define RECHTS 1<<PC5
    #define HINTEN 1<<PC0
    die jeweiligen Ausdrücke müssen geklammert werden.

    So muss es aussehen.


    Code:
    //Motoren
    #define VORNE   (1<<PD5)
    #define LINKS    (1<<PB0)
    #define RECHTS (1<<PC5)
    #define HINTEN (1<<PC0)

    Gruß
    Zitrone

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Der "Fehler" liegt wohl eher hier:

    #define VORNE_AUS PORTD&=~VORNE;

    Nach der Ersetzung durch den Preprozessor würde das dann so aussehen:

    #define VORNE_AUS PORTD&=~1<<PD5;

    Die Bindung der Tilde ~ an die 1 ist größer als bei Shift:

    http://de.wikibooks.org/wiki/C-Progr...Priorit%C3%A4t

    Das vermute ich mal als Ursache. Im Zweifel immer klammern!

    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!

Ähnliche Themen

  1. -=4C=- Quadrocopter
    Von Salvador im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 42
    Letzter Beitrag: 15.05.2009, 19:43
  2. Atmega 32 - 4 Motoren mittels Software PWM
    Von gunni7909 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 16.01.2009, 23:10
  3. Problem mit Bascom Software UART und ATmega8
    Von Buzii12 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 23.10.2008, 12:20
  4. Servoansteuerung mit Software PWM und ATmega8(EDIT: neu 644)
    Von hosti im Forum C - Programmierung (GCC u.a.)
    Antworten: 8
    Letzter Beitrag: 29.08.2008, 14:35
  5. Motoren Synchronisieren, Software
    Von 23dennis im Forum Motoren
    Antworten: 6
    Letzter Beitrag: 10.03.2005, 09:36

Stichworte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad