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

Thema: Warum funktioniert diese software PWM nicht?

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355

    Warum funktioniert diese software PWM nicht?

    Hallo RNler!

    Ich habe es nun endlich mal geschafft ein Programm zu schreiben, welches die PWM per software erzeugen sollte. Timer 1 läuft mit 10kHz und die gewünschte PWM frequenz ist 1kHz. Ich habe eine 8bit auflösung gewählt.

    In der ISR werden nur die Timer overflows gezählt und dann je nachdem ob der Comparewert erreicht ist werden die PWM-Steps um 1 erhöht. Wenn nun die PWM-Steps kleiner sind als der vorgebene Wert, wird der PORT auf High gesetzt, wenn nicht dann wird er auf Low gesetzt. Also alles so wie bei einer Hardware PWM auch.

    Trotzdem messe ich nur ca. 4Hz und ein Tastverhältnis von 99%, obwohl der Vergleichswert 127, also 50% duty cycle, ist.

    Code:
    #ifndef F_CPU
    #define F_CPU 16000000UL
    #endif
    
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    
    #define F_CNT 10000
    #define F_PWM 1000
    #define PWM_RES 255
    #define Prescaler 8
    
    #define OCR1A_val ((F_CPU / F_CNT) / (2*Prescaler)) - 1
    
    uint8_t PWM_setting[8];
    
    volatile unsigned int pwm_steps = 0;
    volatile unsigned int overflows = 0;
    
    int main(void){
        
        TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS11); // CTC mode prescaler 8
        TIMSK1 |= (1<<OCIE1A); // compare match interrupt
        
        OCR1A = OCR1A_val;
        
        DDRC = 0xFF;
        
        for(uint8_t i = 0; i < 8; i++){
            PWM_setting[i] = 127; // 50% duty cycle
        }
        
        sei();
    
        while(1){
            
            if( pwm_steps < PWM_setting[0] ){
                PORTC |= (1<<0);
            }
            else{
                PORTC &= ~(1<<0);
            }
        }
        
        return 0;
    }
    
    ISR(TIMER1_COMPA_vect){
        
        if(overflows < (F_CNT / F_PWM)){
            overflows++;
        }
        else{
            pwm_steps++;
            overflows = 0;
        }
        
        if(pwm_steps > PWM_RES){
            pwm_steps = 0;
        }
    }
    Habe schon mehere Anläufe genommen, jedoch weigerte es sich bis jetzt immer zu funktionieren

    MfG

    Torrentula
    Geändert von Torrentula (09.02.2012 um 18:18 Uhr)
    MfG Torrentula

Ähnliche Themen

  1. Gleichstrommotor-Ansteuerung via µP funktioniert nicht richtig, warum?
    Von papuadive im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 4
    Letzter Beitrag: 03.01.2012, 09:17
  2. Warum funktioniert diese Print nicht?!
    Von TheTeichi im Forum Elektronik
    Antworten: 111
    Letzter Beitrag: 03.12.2011, 11:28
  3. Diode: Warum funktioniert das so und nicht *so* ?
    Von -schumi- im Forum Elektronik
    Antworten: 9
    Letzter Beitrag: 11.05.2011, 10:17
  4. RS-232-Schnittstelle funktioniert nicht ganz richtig! Warum?
    Von Walich im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 17
    Letzter Beitrag: 08.05.2007, 17:51
  5. Warum funktioniert diese Schaltung?
    Von Amri im Forum Elektronik
    Antworten: 11
    Letzter Beitrag: 10.06.2005, 11:36

Berechtigungen

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

12V Akku bauen