www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM mit Atmega16 ohne CTC und Fast PWM


Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend, ich versuche gerade eine PWM mitmeinem Atmega16 zu 
erzeugen, allerdings kann ich CTC und Fast PWM nicht verwenden, da Fast 
PWM ja nicht auf 0 gehen kann und CTC ja immer ein 50/50 Signal ausgibt.

Was ich möchte ist eigentlich wie Fast PWM nur das es auch auf 0 gehen 
kann.

Soll heißen bei 255 soll TOP sein, und ich kann mit OCR1A den duty cycle 
einstellen.

Dabei fällt ja auch Phase correct PWM aus. und nun steh ich an, was ich 
machen sollte, das sollte doch funktionieren oder ? nur womit?

Danke !

Lg
heinz

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heinz schrieb:
> Guten Abend, ich versuche gerade eine PWM mitmeinem Atmega16 zu
> erzeugen, allerdings kann ich CTC und Fast PWM nicht verwenden, da Fast
> PWM ja nicht auf 0 gehen kann

Na ja. Das ist jetzt aber Augenauswischerei.
Man kann die PWM ja auch invertieren, dann ereicht man den Full-Wert 
nicht aber dafür 0.

Allerdings kann man ja auch das hier machen.
Anstelle einer 0 ins OCR Register zu schreiben, genügt es ja auch den 
Timer einfach abzuschalten und den Ausgabepin händisch auf 0 zu setzen.
Oder eben umgekehrt, wenn man die PWM invertieren lässt, dann muss man 
sich händisch um den 100% Wert kümmern.
Welches davon einfacher ist, hängt dann auch davon ab, welcher Wert 
häufiger vorkommen wird.

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das würde gehen, aber kann ich nicht auch mit Timer2 mit Phase 
correct PWM auch das erzeugen was ich möchte ?

Autor: David Kress (kresley81)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da würde ich etwas in der Art schreiben:

im init:
DDRB |= 0x08; //als Ausgang definieren
PORTB &= ^0x08; //Ausgang auf low


und dann:

void SetPWM(int ocrValue)
{
   if (ocrValue == 0)
   {
      TCCR0 &= ^((1<<COM00)|(1<<COM01)); //Port disconnecten,
   }
   else
      OCR0 = ocrValue;
}

Autor: David Kress (kresley81)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vergessen: im else muss der port natürlich wieder an den timer angehängt 
werden.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
David Kress schrieb:
> Vergessen: im else muss der port natürlich wieder an den timer angehängt
> werden.

Und natürlich den Pin vom Timer wegnehmen und auf 0 setzen.
Respektive im else dann natürlich wieder das Gegenteil: Pin wieder an 
den Timer koppeln.

Autor: Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Danke für die Antworten, bringt mir das Vorteile gegenüber Phase and 
Frequency correct PWM ? Wo ich ja auch ICR als TOP Wert und mit OCR1A 
den Vergleichswert einstellen kann?

Lg
Heinz

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.