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