Forum: Mikrocontroller und Digitale Elektronik TC0 PWM ATMEGA644P


von Christoph P. (titanfire)


Lesenswert?

Hallo,

ich versuche aktuell eine PWM auf einem ATMEGA644P zu realisieren, komme 
aber trotz Tutorial und langer suche nicht weiter.

Ich nutze das Atmel Studio 7 und einen AVRISP mkII und progammiere in C.
Der Controller nutzt den interen Takterzeuger, hier habe ich keine 
Veränderungen vorgenommen

Hier die Codeausschnitte:
1
  DDRB = (1<<DDB3);
2
3
/********************************************************************/
4
  /* Init TC0 -> LED PWM                        */
5
  /********************************************************************/
6
  //Inverting mode for OC0A -> PB3
7
  TCCR0A |= (1<<COM0A1) | (1<<COM0A0);
8
  
9
  //Fast PWM
10
  TCCR0B |= (1<<WGM02);
11
  TCCR0A |= (1<<WGM01);
12
  TCCR0A |= (1<<WGM00);
13
  
14
  //Set clock soure (activate timer)
15
  TCCR0B |= (1<<CS01);
16
17
  OCR0A = 255;

Den Ausgang habe ich über einen 10k Widerstand auf Masse gelegt und 
versuche das Signal mit einem Oszilloskop zu messen.
Leider liegt der Ausgang jedoch dauerhaft auf 0V, unabhängig davon 
welchen Wert ich in OCR0A schreibe.

Ändere ich die Konfiguration von OC0A auf Toggle, kann ich eine 
Rechteckfrequenz mit von OCR0A messen. Diese hat jedoch immer ein 
Tastgrad von 0,5.

Was mache ich falsch?

von spess53 (Gast)


Lesenswert?

Hi

>Den Ausgang habe ich über einen 10k Widerstand auf Masse gelegt und
>versuche das Signal mit einem Oszilloskop zu messen.

Der Ausgang ist aber OC0B, denn OCR0A ist ja schon als Top-Register 
beschäftigt. OC0B ist aber nicht konfiguriert.

MfG Spess

von Christoph P. (titanfire)


Lesenswert?

Vielen Dank für die Antwort.

Habe die Änderung übernommen:
1
  DDRB = (1<<DDB4);
2
3
/********************************************************************/
4
  /* Init TC0 -> LED PWM                        */
5
  /********************************************************************/
6
  //Inverting mode for OC0B -> PB4
7
  TCCR0A |= (1<<COM0B1) | (1<<COM0B0);
8
  
9
  //Fast PWM
10
  TCCR0B |= (1<<WGM02);
11
  TCCR0A |= (1<<WGM01);
12
  TCCR0A |= (1<<WGM00);
13
  
14
  //Set clock soure (activate timer)
15
  TCCR0B |= (1<<CS01);
16
17
  OCR0A = 255;

Leider kann ich weiterhin nicht vom einem PWM-Signal sprechen. Egal was 
ich für OCR0A angebe, am Ausgangssingal tut sich nicht wirklich viel. 
Für Phasenrichtiges PWM sieht aus auch nicht anders aus, das hatte ich 
auch schonmal probiert...

von spess53 (Gast)


Lesenswert?

Hi

>Leider kann ich weiterhin nicht vom einem PWM-Signal sprechen. Egal was
>ich für OCR0A angebe, am Ausgangssingal tut sich nicht wirklich viel.
>Für Phasenrichtiges PWM sieht aus auch nicht anders aus, das hatte ich
>auch schonmal probiert...

OCR0A ist auch nur für den Topwert der PWM zuständig. Der PWM-Wert wird 
über OCR0B eingestellt. Allerdings muss OCR0B <=OCR0A sein.

MfG Spess

von Christoph P. (titanfire)


Lesenswert?

Ich gebe zu dass aktuell noch nicht so ganz zu verstehen, aber es 
funktioniert jetzt. Danke :)

von spess53 (Gast)


Lesenswert?

Hi

>Ich gebe zu dass aktuell noch nicht so ganz zu verstehen, aber es
>funktioniert jetzt. Danke :)

Warum? Du stellst eine fast PWM mit OCR0A als Top ein. Damit bestimmt 
OCR0A den möglichen Wertebereich (und die Frequenz) der PWM. Für die 
PWM-Einstellung bleibt dann nur noch OCR0B mit dem Ausgang OC0B übrig.

Bei einem 16-Bit-Timer kannst du auch das IC-Register als Top-Register 
benutzen. Dann hättest du auch OCR1A und OCR1B für die PWM zur 
Verfügung.

MfG Spess

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.