Forum: Mikrocontroller und Digitale Elektronik Frage zu PWM-Minimalwert


von pwm (Gast)


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

von Martin S. (led_martin)


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

von Chefkoch (Gast)


Lesenswert?

Ich würde bei der Variante sogar tippen, dass das Verhältnis besser als 
49/50 ist.
Oder braucht der Timerkomparator wirklich einen Timer-Tick, um ein 
Ergebnis zu generieren? Dann bleibt es bei den 49/50.
Wenn das Ergebnis asynchron ermittelt wird geht es mit 
Hardwaregeschwindigkeit.

von pwm (Gast)


Lesenswert?

Martin Schlüter schrieb:
> Am 'hinteren' Ende geht es nämlich so, daß gar keine
> Impulse generiert werden.

Ah danke, das ist ein guter Tipp! werde ich probieren. Ich hab das im 
Datenblatt nicht erkannt.

von Michael R. (Firma: Brainit GmbH) (fisa)


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")

von Amateur (Gast)


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.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Amateur schrieb:
> Trifft diese Abfrage zu, schaltest Du den Pin auf "Ausgang" und gibst
> eine 0 aus.
Siehe oben: das geht viel eleganter, und noch dazu ohne dass man den 
aktuellen takt "abbricht"

von Martin S. (led_martin)


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

von Amateur (Gast)


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".

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.