-         

Ergebnis 1 bis 4 von 4

Thema: PWM probleme mit ATMega32

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    25
    Beiträge
    384

    PWM probleme mit ATMega32

    Anzeige

    Moin Moin,

    ich möchte mit meinem ATMega32 zwei Motoren Ansteuern. Die Dafür vorgesehene PWM einstellunge krieg ich aber irgendwie nicht hin . Als erstes weiß ich nicht welche COM bits ich setzten soll. Für mich kland Toggle on compare Match richtig also hab ich COM1A0 und COM1B0 gesetzt. Für Fast PWM im 8bit modus hab ich WGM12 und WGM10 gesetzt. als Prescaler hab ich 8, also hab ich CS11 noch gesetzt. Aber irgendwie funktioniert das ganze noch nicht Wirklich wo ist der Fehler? Hier nochmal der Code :
    Code:
    #define F_CPU 11059200
    #include <avr\io.h>
    #include <avr\interrupt.h>
    #include <inttypes.h>
    
    void init(void)
    {
    	DDRB =	(1<<PB0) | (1<<PB1);
    	TCCR1A=  (1<<COM1A0) | (1<<COM1B0) | (1<<WGM10);
    	TCCR1B= (1<<WGM12) | (1<<CS11);
    }
     
    void LEDON (void)
    {
    	PORTB = (1<<PB0)|(1<<PB1);
    }
    
    inline void Geschwindigkeit(unsigned char left_speed, unsigned char right_speed)
    {
    	OCR1AH = left_speed;
    	OCR1BH = right_speed;
    }
    
    /*inline void Richtung(unsigned char left_dir, unsigned char right_dir)
    {
    	PORTD = (PORTD &~ ((1 << PD4) | (1 << PD5))) | left_dir;
    	PORTB = (PORTB &~ ((1 << PB4) | (1 << PB5))) | right_dir;
    }*/
    
    
    int main (void)
    {
       init();
       while (1) 
       {
       LEDON();
       Geschwindigkeit(250,250);
          
       }
    return 0;
    }
    mfg
    Erik

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.08.2005
    Alter
    33
    Beiträge
    685
    Also:

    • Timer 1 -> pd.4 und pd.5
      nimm doch normalen Modus


    zB.:

    Code:
    #define F_CPU 11059200 
    #include <avr\io.h> 
    #include <avr\interrupt.h> 
    #include <inttypes.h> 
    
    void init(void) 
    { 
         DDRD |= (1<<4)|(1<<5);
         TCCR1A = (1<<COM1A1)|/*(1<<COM1A0)*/(1<<COM1B1)|/*(1<<COM1B0)|(1<<FOC1A)|(1<<FOC1B)|(1<<WGM11)|*/(1<<WGM10);  
    	 TCCR1B = /*(1<<ICNC1)|(1<<ICES1)|(nix)|(1<<WGM13)|(1<<WGM12)|(1<<CS12)|*/(1<<CS11)/*|(1<<CS10)*/; 
    } 
      
    void LEDON (void) 
    { 
         PORTD |= (1<<4)|(1<<5); 
    } 
    
    inline void Geschwindigkeit(int left_speed, int right_speed) 
    { 
       OCR1A = left_speed; 
       OCR1B = right_speed; 
    } 
    
    
    int main (void) 
    { 
         init(); 
         while (1) 
         { 
             LEDON(); 
             Geschwindigkeit(250,250);  
         } 
    //return 0;  -> wird nie erreicht (oben Endlosschleife)
    }
    Mal leider gerade kein Testboard liegen, hoffe es funktioniert trotzdem.

    Gruß Stefan

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.383
    du solltest nicht permanent Geschwindigkeit(); aufrufen, sondern möglichst NUR DANN wenn der wert sich ÄNDERT! gut möglich das du den counter damit verwirrst, aber auf anhieb seh cih nix schlechtes bei

    mh HALT
    OCR1AH = left_speed;
    OCR1BH = right_speed;

    ouh mann ... RTFM soll heissen bitte das datenblatt ordentlich lesen, du schreibst nur in das HIGH byte ... logisch das die änderungen NIE ankommen, das HIGH byte ist double buffered und wird NUR dann geschrieben wenn auch das LOW byte geschrieben wird .... lass das H am ende BITTE ganz weg und schreib nicht getrennt in low und high byte, liess das datenblatt um zu begreifen WARUM

    EDIT: ein klein wenig zu langsam, Reeper hat es richtig gemacht in seiner geschwindigkeitsfunktion .... PS reeper es ist kein problem wenn er die bits im DDR setzt, bringt aber nix, weil die pin-einstellungen des Timer die DDR vollständig überlagern

    trotzdem sollte man das OCR register nur dann updaten wenn auch wirklich ein neuer wert vorhanden ist, es gibt timer-modi auf bestimmten megas die wegen sowas rumspinnen

    EDITEDIT: iwie gruselig ... ich hab mir nur das datenblatt ausgedruckt und wenn mir langweilig war darin gelesen ... und es bleibt sogar hängen ... ich werde nie wieder auf druckware schimpfen auch wenn cih kein bücherfreund bin

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    25
    Beiträge
    384
    Ok danke kapiert

Berechtigungen

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