Forum: Mikrocontroller und Digitale Elektronik PWM mit ATMega8


von einsteiger (Gast)


Lesenswert?

Hallo
Will mit meinem Atmega8 PWM verwenden! Nur funktioniert das bis jetzt 
nicht... Kann mir jemand sagen was ich hier falsch mache?
1
#include <avr/io.h>
2
3
int main(){
4
  DDRB = (1<<PB1);
5
  TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<WGM11) | (1<<WGM10); 
6
  TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS12);
7
  OCR1A = 0x00FF;  
8
  while(1){}
9
}
Was ich mir dabei denke:
-WGM müsste denn PWM mode auswählen
-COM ob das Signal inverted wird oder nicht
-CS den Prescaler
-OCR den TOP value
Falls etwas nicht stimmt verbessert mich bitte!
Hoffe ihr könnt mir helfen!

von spess53 (Gast)


Lesenswert?

Hi

Und wo ist dein Compare-Wert (OCR1B)?

MfG Spess

von einsteiger (Gast)


Lesenswert?

ich hab gedacht für Channel A ist das OCR1A!?

von spess53 (Gast)


Lesenswert?

Hi

>ich hab gedacht für Channel A ist das OCR1A!?

Du hast im Mode15 nur einen PWM-Kanal. Dabei ist OCR1A der Höchstwert 
des Zählers (Top) und OCR1B der Compare-Wert. Wenn du 2 Kanäle haben 
willst, solltest du Mode14 nehmen.

MfG Spess

von frage (Gast)


Lesenswert?

wie gehts nun weiter wenn man mal fragen darf

von spess53 (Gast)


Lesenswert?

Hi

>wie gehts nun weiter wenn man mal fragen darf

Wie soll es weitergehen? Wenn man es richtig macht, funktioniert es.

MfG Spess

von frage (Gast)


Lesenswert?

ich muss nur noch meinen vergleichswert eintragen und der zählt dann 
quasi als hoch und runter?

wenn ich es simuliere klappt es irgwie nicht

von spess53 (Gast)


Lesenswert?

Hi

>ich muss nur noch meinen vergleichswert eintragen und der zählt dann
>quasi als hoch und runter?

Der muss aber kleiner als der OCR1A-Wert sein.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Der Simulator hat einige Probleme mit PWM bei 16-Bit Timern. Im 
vorliegenden Fall scheint das der Fall zu sein.

MfG Spess

von einsteiger (Gast)


Lesenswert?

OK aber was ist dann der Unterschied zwischen TOP und Compare value? ich 
hab gedacht beim TOP value wird immer die Spannung an OC1 gändert? 
Welcher Pin wird dann eig bei Mode 15 verwendet? OC1A oder OC1B?

von einsteiger (Gast)


Lesenswert?

Ich habs jetzt auch mal so versucht:
1
#include <avr/io.h>
2
3
int main(){
4
  DDRB = (1<<PB1);
5
  TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<WGM11) | (1<<WGM10);
6
  TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS12);
7
  OCR1A = 0xFFFF;  
8
  OCR1B = 0x00FF;
9
10
  while(1){}
11
}
funktioniert aber auch nicht...

von Karl H. (kbuchegg)


Lesenswert?

einsteiger schrieb:
> OK aber was ist dann der Unterschied zwischen TOP und Compare value? ich
> hab gedacht beim TOP value wird immer die Spannung an OC1 gändert?


Der TOP Wert (Top = Obergrenze) ist der Wert, bis zu dem der Timer 
zählt.

Für eine PWM brauchst du 2 spezielle Zählerstände. Bei einem der beiden 
wird der Pin auf 1 geschaltet, beim anderen auf 0.

Bei allen Fast-PWM Modi ist es so, das der eine spezielle Zählerstand 
der Übergang vom höchsten möglichen Timerwert auf 0 ist. Den andern 
speziellen Zählerstand gibst du in einem Register vor.

Der Timer zählt also laufend (jetzt nur als Beispiel)
1
  0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, ...

und während der Timer zählt, sorgt die PWM Logik dafür, dass der Pin 
entsprechend dem Zählerstand auf 0 oder 1 gesetzt wird. Hat dein 
Verrgl4eichsregister den zb den Wert 3, dann ergibt sich
1
  Timer: 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, ...
2
  Pin:   1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, ...

steht das Vergleichsregister auf 7, dann hast du
1
  Timer: 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, ...
2
  Pin:   1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, ...

wie du siehst, ist der Ausgang jetzt länger auf 1 als zuvor.
Mit dem Vergleichsregister legst du also fest, wie lange der AUsgang auf 
1 geht und wie lange auf 0.

Aber wer sagt eigentlich, dass der Timer immer nur bis 8 zählen soll? 
Niemand. Und genau da kommt der TOP Wert ins Spiel. In diesem Beispiel 
wäre der TOP Wert 8 gewesen. Du kannst ihn aber auch auf von mir aus 12 
setzen. Mit einem Vergleichswert von wieder 3, ergibt sich dann
1
  Timer: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 1, 2, 3, 4, 5, ...
2
  Pin:   1, 1, 1, 1, 0, 0, 0, 0, 0, 0,  0,  0,  0, 1, 1, 1, 1, 0, 0, ...

> Welcher Pin wird dann eig bei Mode 15 verwendet? OC1A oder OC1B?

Steht alles im Datenblatt.

von einsteiger (Gast)


Lesenswert?

Ok das mit OCR1A und OCR1B hab ich begriffen! Aber warum funktioniert 
mein Programcode dann nicht!? Hab an den OC1A eine LED gehängt und den 
Code wie oben bereits gezeigt draufgespielt!?

von Karl H. (kbuchegg)


Lesenswert?

Du hast gesetzt WGM10, WGM11, WGM12, WGM13

Laut Datenblatt ist das Modus 15

Modus 15 bedeutet:
  TOP Wert:        OCR1A
  Vergleichswert:  OCR1B   (muss so sein, weil A ja schon für TOP
                            gebraucht wird)

OCR1A setzt du.
Aber wo setzt du OCR1B?
Wo schaltest du den OC1B Pin auf Ausgang?
Wo teilst du dem Timer mit, dass der den OC1B Pin ansteuern soll?

Falls du es jetzt immer noch nicht begriffen hast:
Du kannst nicht den A-Kanal nehmen. OCR1A fungiert als TOP Wert und ist 
damit automatisch aus dem Rennen.

von Raiko (Gast)


Lesenswert?

Ich muss mal wirklich den  Karl heinz Buchegger (kbuchegg) loben. Deine 
Erklärung ist echt gut und vorallem auch verständlich. Danke!

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.