Frage zu PWM-Minimalwert

Gast #4005407
Lesenswert?

Hallo, vielleicht weiß jemand eine Lösung für mein Problem: Ich erzeuge 
mit einem Mega8 mit dem Timer1 eine PWM - indem ich werte von 0 bis 49 
in OCR1A / OCR1B schreibe, Initialisierung siehe unten. Mein Problem: 
Ich kann mit dem OCR1B keine "0" also 0V erzeugen.

Ist das prinzipbedingt? Wenn ich in das OCR1B eine 0 scheibe, tritt ja 
sofort der Compare-Match ein, wo OC1B zurückgesetzt wird. Aber offenbar 
wird grundsätzlich erstmal eingeschaltet, wenn der Timer bei 0 ist, und 
das erzeugt eine sehr kleine "Nadel" - kann man das durch passendere 
Initialisierung ändern?

1
   'PWM 20kHz Mode 14: Set OC1A, Clear OC1B on compare match
2
   TCCR1A = &B11100010
3
   TCCR1B = &B00011001
4
   'Top-Wert für 20 kHz: 0 bis 49 = 50 Schritte
5
   ICR1 = 49
6
   OCR1A = 0
7
   OCR1B = 0
#4005452
Lesenswert?

Das ist prinzipbedingt, Atmel beschreibt das auch im Datenblatt so. 
Vielleicht kannst Du das Problem aber, für deine Anwendung, entschärfen, 
indem Du umgekehrt rechnest, also die PWM invertierst, und auch deine 
Werte invertierst, also für PWM 49 schreibst Du 0 in OCR1B, und für PWM 
0 schreibst Du 49. Am 'hinteren' Ende geht es nämlich so, daß gar keine 
Impulse generiert werden. Dann hast Du bei maximaler Ansteuerung halt 
nur 49/50 EIN-Zeit, da fällt es meist aber nicht so auf. (Bei einer 
Beleuchtung sieht man dieses fehlende 1/50 nicht, wenn das Licht aber 
nie ganz ausgeht, fällt das wohl auf.)

Mit freundlichem Gruß - Martin
(Firma: Brainit GmbH) #4005491
Lesenswert?

Eine saubere Lösung ist, eine kleine Funktion für das Setzen des 
PWM-Wertes zu machen, und dort bei PWM Wert = 0 den PWM-Mode 
abzusschalten, idR ist das ein bit (von mode 2 auf Mode 0), WGM kann 
gleich bleiben, die Funktion des WGM ändert sich dann von "Clear OC0B on 
Compare Match, set OC0B at BOTTOM, (non-inverting mode)" auf "Clear OC0B 
on Compare Match" (also nur clearen, nie setzen), was weiters den 
Vorteil hat dass der letzte Impuls noch sauber weiterläuft (kein 
"knacksen")
Gast #4005519
Lesenswert?

Da das Setzen des aktuellen PWM-Wertes sowieso etwas dauert, kannst Du 
auch eine Abfrage auf 0 einbauen.
Trifft diese Abfrage zu, schaltest Du den Pin auf "Ausgang" und gibst 
eine 0 aus.
Übrigens: Es dauert sowieso einige Zeit, bis sich die 
Filterkondensatoren von fast null auf "richtig" null entladen haben.

So fehlt Dir auch kein Wert.
#4005595
Lesenswert?

@Chefkoch (Gast):

Das läuft Alles taktsynchron ab, was auch gut so ist, da bleibt 
tatsächlich ein Impuls von einem Taktzyklus Länge, die aber auch 
ziemlich konstant ist. Wer will schon einen Impuls von halber, oder 
warn's doch 2/3, Taktzyklus-Länge, und das wäre dann auch noch von 
Betriebsspannung, Temperatur, ... abhängig.

Mit freundlichen Grüßen - Martin
Gast #4005620
Lesenswert?

@Michael
Natürlich sollte, wenn "0" auf dem Programm steht das Zählerregister, 
für den geeigneten Zeitpunkt, abgefragt werden. Ist ja auch R/W.

Wenn ich aber davon ausgehe, dass nicht von Max nach 0 Umgeschaltet 
werden soll, so ist die "Taktverkürzung" wohl nicht so schlimm.

Da es sich in der Praxis immer um ein "herunterschalten“ handelt, bist 
Du schnell in der Abteilung: "Kannst Du machen wie Du willst".

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren