Forum: Mikrocontroller und Digitale Elektronik TC0 PWM ATMEGA644P


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Christoph P. (titanfire)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von spess53 (Gast)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.