-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: PWM Attiny25

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2009
    Beiträge
    103

    PWM Attiny25

    Anzeige

    Hallo!

    Seit einigen Tagen versuche ich, auf einem Attiny25 auf Lochraster eine PWM mit dem Timer0 zu erstellen.

    Auf einem Atmega32, mit einem anderem selbsterstellen Quellcode und dem RN Control1.4, klappt es, der Tastgrad ist mit dem Oszi schön zu sehen.

    Die Lochrasterplatine mit dem Attiny25 funktioniert ebenfalls. Einen zweiten Kontroller habe ich bereits in der Platine mit gleichem Ergebnis ausprobiert.
    Den Quellcode habe ich gemäß Datenblatt erstellt.

    Was kann ich noch beachten?

    Walter

    Code:
    #define F_CPU 8000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    
    
    
    
            
    int main (void){
    
    	DDRB = (1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB4);
    	TCCR0A = (1<<WGM00) | (1<<COM0A0) | (1<<COM0A1);
    	TCCR0B = (1<<WGM02) | (1<<CS02) | (1<<CS00);
    
    	OCR0A = 100;
    
    	while(1){
    	
    		}
    	}

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Wie bitte?!
    Mit dem Atmega32 funktionierts und mit dem ATtiny auf der Lochraster ebenfalls? Na dann ist doch alles Prima.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2009
    Beiträge
    103
    Hallo TobiKa!

    Sorry, Missverständnis, zurück an den Start:

    Mein Vorhaben:
    Ein Gleichstromverbraucher soll durch einen einzelnen PWM-Kanal gesteuert werden.

    Der Weg dorthin:
    Den ersten Versuchsaufbau habe ich mit einem Atmega32 erstellt, funktioniert. Für einen einzelnen PWM-Kanal wäre der Atmega32 überdimensioniert. Nun will ich dafür den wesentlich kleineren Attiny25 einsetzen.

    Der gepostete, nichtfunktionierene Code ist vom Attiny25.

    Auf der Lochrasterplatine des Attiny25 habe ich bereits ein anderes Programm für einen Attiny25 erfolgreich raufkopiert. Die Hardware (Platine) des Attiny ist ok.

    Die Frage:
    Der gepostete Code erzeugt keine PWM. Was habe ich übersehen?

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Interrupts nicht freigegeben?

    Code:
       DDRB = (1<<PB0) | (1<<PB1) | (1<<PB2) | (1<<PB4);
    	// PWM, PhaseCorrect, OCRA ist Top!
       TCCR0A = (1<<WGM00);
       TCCR0B = (1<<WGM02);
       // Set OC0A on Compare Match when up-counting. Clear OC0A on
    	// Compare Match when down-counting.
    	// OC0A  ist PB0 (Pin5)
    	TCCR0A |= (1<<COM0A0) | (1<<COM0A1);
    	// Prescaler /1024 (8MHz/1024/512=15,29Hz)
       TCCR0B |= (1<<CS02) | (1<<CS00);
    
       OCR0A = 127;
       OCRA = 255; // ?
       sei();
    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Sicher das du die richtigen Regeister benutzt? Wo hast du das Beispiel her?

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2009
    Beiträge
    103
    Danke für eure Antworten.

    Interrupts habe ich enabled und das sei() im Code gelassen. Interrupts waren jedoch für PWM nicht erforderlich. Die entsprechenden includes kopiere ich einfach weiter, was der Präprozessor nicht braucht, wirft er raus.

    Die Register Description des Timer0 vom Attiny25 liegt ausgedruckt beim PC und war die Grundlage für das Programm. Um eine PWM zu erzeugen, sind IMHO CompareOutputMode, ClockSelect und WaveformGenerationMode zu setzen.

    Für den Atmega32 reichen diese Angaben, für den Attiny25 offensichtlich nicht.

    Gäbe es sonst noch etwas zu beachten?

    mfg
    Walter

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Mal von vorne, welche Frequenz möchtest du? Welche Art von PWM?...?

    Code:
    TCCR0A = (1<<COM0A1) | (1<<WGM01) | (1<<WGM00);
    TCNT0  = 0;
    OCR0A  = 128;  //50%
    TCCR0B = (1<<CS02);

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Das mit den Interrupts war natürlich Quatsch, sorry.

    WGM2 und WGM0 gesetzt ist PhaseCorrectPWM mit OCRA als Top!

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    30.09.2006
    Beiträge
    734
    Schau dir nochmal an, bis wohin dein Timer zählt. Entweder den Top Wert auf 0xff ändern oder OCR0C verwenden.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2009
    Beiträge
    103
    Als Last ist vorerst ein Elektromagnet vorgesehen, welcher an 24 - 48V mit ~0,34H und ~24Ohm die PWM glattbügeln wird. Um die Endstufe mit der Freilaufdiode nicht unnötig mit Schaltvorgängen zu belasten, ist eine möglichst niedrige PWM Frequenz angestrebt.

    WGM02 und WGM00 ergibt PhasenCorrect mit OCRA als Top.
    CS02 und CS00 ergibt einen Prescaler von 1024.
    Die Auswirkung COM0Ax (Signalinvertierung) ist mir derzeit noch gleichgültig.

    Bei der Verwendung von OCRA als Registername im Quellcode wirft ARV-Studio die Fehlermeldung: undeclared - first use in this function.

    Der Timer0 des Attiny hat zwei PWM-Kanäle, deren Taktverhältnis mit den OutputCompareRegistern OCR0A und OCR0B definiert werden.

    Danke für weitere Antworten.

    Walter

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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