TC0 PWM ATMEGA644P

OP #5053433
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?
Gast
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
OP
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...
Gast
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
Gast
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.