Forum: Mikrocontroller und Digitale Elektronik 2 PWM Signale mit Atmega 32 / Timer 1


von Axel L. (axelleibold)


Lesenswert?

Guten Tag

ich hätte mal eine Frage da ich irgendwie nicht weiterkomme.

ich will mit dem 16 bit Timer1 des Atmega 32, 2 PWM Signale an den 
Ausgängen 0C1A und OC1B erzeugen.

Der Atmega 32 kann dem Datenblatt zufolge 4 PWMs. 1. PWM mit Timer0, 2. 
PWM mit Timer2 und demzufolge muss ich wohl 2 PWM Signale mit dem 16 Bit 
Timer1 erzeugen.

Die Frage ist welche Bits ( TCCR1A, TCCR1B....???)muss ich setzten, um 
an den genannten Ausgängen 2 PWM Signale zu bekommen???

Wenn mir jemand weiterhelfen könnte wäre ich sehr dankbar.

von Johannes M. (johnny-m)


Lesenswert?

Was für eine PWM soll es denn sein? Eigentlich steht alles in der großen 
Tabelle bei der Registerbeschreibung der TCCR1x. Entweder ne PWM mit 
festem TOP-Wert (8-, 9- oder 10-Bit-PWM, Fast {Modus 5, 6 oder 7} oder 
Phase Correct {Modus 1, 2 oder 3}) oder variabel mit ICR1 als TOP (Modus 
8, 10 oder 14, je nachdem ob es Fast, Phase Correct oder Phase and 
Frequency Correct sein soll). Dann noch die COM1nx-Bits entsprechend 
setzen, so dass an den Ausgängen auch die entsprechenden Signale 
ausgegeben werden. Fertig...

Für die meisten Anwendungen ist Fast PWM völlig OK. Die anderen 
braucht's eigentlich hauptsächlich, wenn es um Schalttotzeiten bei 
Halbbrückenansteuerungen o.ä. geht.

von hans (Gast)


Lesenswert?


von Johannes M. (johnny-m)


Lesenswert?

hans wrote:
> Atmel kann helfen:
>
> http://www.atmel.com/dyn/resources/prod_documents/doc2503.pdf
Überflüssiger Hinweis, da der OP das Datenblatt nach eigenen Angaben 
bereits besitzt!

von Axel L. (axelleibold)


Lesenswert?

DAnke schonmal
Ich kann mit dem Timer1 aber auf jeden Fall 2 PWM Signale erzeugen, 
ODER??

von Christoph S. (mixer) Benutzerseite


Lesenswert?

Axel Leibold wrote:
> DAnke schonmal
> Ich kann mit dem Timer1 aber auf jeden Fall 2 PWM Signale erzeugen,
> ODER??

Man kann mit dem Timer1 2 PWM Signale hardwaremässig erzeugen!

Ob du zu den Auserwählten zählst wo das können kann ich von hier nicht 
sagen!

von hans (Gast)


Lesenswert?

@Johannes:
>Überflüssiger Hinweis, da der OP das Datenblatt nach eigenen Angaben
>bereits besitzt!

Besitzen reicht nicht!!

von Johannes M. (johnny-m)


Lesenswert?

hans wrote:
> @Johannes:
>>Überflüssiger Hinweis, da der OP das Datenblatt nach eigenen Angaben
>>bereits besitzt!
>
> Besitzen reicht nicht!!
Stimmt zwar im Prinzip, aber warum soll er es sich nochmal runterladen? 
Das bringt dann auch nicht weiter.

von gast (Gast)


Lesenswert?

Das Datenblatt zu besitzen heißt nicht, dass man alles auf Anhieb 
versteht.
Ich hab da auch öfters Probleme und muss hier im Forum nachfragen. Ist 
doch was ganz normales

von Markus W. (mark-169)


Lesenswert?

Hallo zusammen,

Ich realisiere gerade das gleiche wie Axel, nur habe ich ein Problem 
damit:
OC1B funktioniert einwandfrei, OC1A jedoch nicht.
Ich habe folgendes gemacht:

1
TCCR1A =    (1 << COM1A1)
2
         |  (0 << COM1A0)
3
         |  (1 << COM1B1)
4
         |  (0 << COM1B0)   //Fast-PWM: Compare Mode set (non-inverting) A+B
5
         |  (1 << WGM11)    //--> Waveform Generation Mode: 5
6
         |  (0 << WGM10);
7
     
8
TCCR1B =    (1 << WGM13)
9
         |  (1 << WGM12)
10
         |  (0 << CS12)    //clk/256
11
         |  (0 << CS11)
12
         |  (1 << CS10);

Außerdem füttere ich OCR1AL/OCR1BL mit Daten von einem DMX-Board!

Ich sitze nun schon ewig davor und komme einfach nicht weiter!
Hat jemand eine Idee was falsch ist?

Danke

gruß Markus

von Markus W. (mark-169)


Lesenswert?

Hallo

Hat den niemand eine Idee oder einen Tip???
Bin über jede Hilfe dankbar, denn ich bin hier am Verzweifeln!!!
Die Hardware ist schon fertig und auf 2 Kanäle ausgelegt...und nun geht 
der eine nicht!!!!

Also bitte helft mir!

von Falk B. (falk)


Lesenswert?

@ Mark Walter (mark-169)

Poste mal VOLLSTÄNDIGEN Quelltext als Anhang.

MFG
Falk

von Markus W. (mark-169)


Angehängte Dateien:

Lesenswert?

hallo falk,

Danke für die Antwort!

Hier mal die Dateien.

PWM wird in pwm.c initialisiert
Die Ansteuerung findet in der while-Schleife in main.c statt

gruß markus

von Johannes M. (johnny-m)


Lesenswert?

>  DDRD   = (1<<PD5);
> [...]
>  DDRD   = (1<<PD4);
Das tut schon fast weh. Die zweite Zeile überschreibt das, was Du in der 
ersten gemacht hast! Danach ist der OC1A-Pin wieder als Eingang 
konfiguriert.

von Markus W. (mark-169)


Lesenswert?

Oh je!!!

Ich hab endlich den Fehler gefunden!
DDRD von OC1A und OC1B wurden nacheinander gesetzt! Ist natürlich 
blödsinn, da der 2. Befehl den ersten überschrieben hat!

Naja ich hatte mir die PWM-Routine mal hier heraus gesucht...
Wie das jemals funktioniert haben soll ist mir schleierhaft!

frank trotzdem vielen dank, ist dir vielleicht noch was anderes 
aufgefallen?

gruß markus

PS: Glaube nie an die Perfektheit anderer und vorallem nicht an deine 
eigene!!!

von Markus W. (mark-169)


Lesenswert?

Habs ja grad gemerkt

Aber auf so was "einfaches" achtet man dann halt leider nicht mehr...
Wie oft bin ich die Tabellen von TCRN1A/B durchgegangen!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.