PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega8 Timer2 PWM Stoppen



demmy
11.11.2012, 18:32
Hallo zusammen,

ich möchte an einem Atmega8 am Pin 17 mittels Timer2 ein PWM-Signal ausgeben.
Das funktioniert soweit auch.

Nun zu meiner Frage, gibt es eine Möglich das PWM-Signal zu stoppen und wieder aufzunehmen? Das heißt, der Ausgangspin soll dann dauerhaft auf Low bleiben.

Mein Programm sieht in Auszügen momentan so aus.




Pwm_pin Alias Portb.3
Config Pwm_pin = Output
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Up , Prescale = 256

Pwm2 = Sollwert



Ich habe gelesen, dass wenn man einen Timer als PWM nutzt die Befehle Stop Timer und Enable Timer unwirksam sind. Ist das so?

Der einzige Weg der mir momentan einfällt wäre den Pwm_compare auf 0 zu setzen, aber wäre das eine saubere Lösung?

Gruß

for_ro
11.11.2012, 19:00
Ich habe gelesen, dass wenn man einen Timer als PWM nutzt die Befehle Stop Timer und Enable Timer unwirksam sind. Ist das so?

Enable Timer2 gibt den Overflow Interupt des Timer frei, was auch bei PWM funktioniert.
Stop Timer nimmt dem Timer seine Taktquelle, was den Timer bei seinem aktuellen Wert stoppt. Sollte bei PWM auch gehen.

Searcher
11.11.2012, 20:16
...gibt es eine Möglich das PWM-Signal zu stoppen und wieder aufzunehmen? Das heißt, der Ausgangspin soll dann dauerhaft auf Low bleiben ...Der einzige Weg der mir momentan einfällt wäre den Pwm_compare auf 0 zu setzen, aber wäre das eine saubere Lösung?

Ja, ist im Datenblatt auch so beschrieben oder ...


Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Up , Prescale = 256
Ich habe mal im BASCOM Simulator geschaut, was das Konfigurationskommando macht.

Im TCCR2 Register werden gesetzt die Bits: WGM20, COM21, CS22 und CS21
Bedeutet Phase Correct PWM, OC2 wird low bei Comparematch wenn TCNT hochzählt und high beim Runterzählen ( = non-inverted PWM). Prescaler auf 256.

Außerdem wird das DDRB Register schon richtig gesetzt. "Config Pwm_pin = Output" ist also nicht nötig.

Im Datenblatt steht:

The extreme values for the OCR2 Register represent special cases when generating a PWM
waveform output in the phase correct PWM mode. If the OCR2 is set equal to BOTTOM, the output
will be continuously low and if set equal to MAX the output will be continuously high for noninverted
PWM mode.

Danach sollte OC2 auf low bleiben, wenn Du OCR2 auf 0 setzt (BOTTOM). Kommt mir etwas komisch vor, da er beim Runterzählen und Comparematch den Pin ja setzt und bei OCR2 = 0 dann plötlich low bleiben soll.

Wenn es nicht hinhaut, sollte es dann aber mit OCR2 bzw PWM2 = 255 (MAX) klappen.

Gruß
Searcher

MagicWSmoke
11.11.2012, 20:49
Um den Pin wieder selbst kontrollieren zu können, gibt's unter Config Timerx den Paramter "Disconnect", Config Timerx erneut damit aufgerufen koppelt die PWM-Einheit vom OCx-Pin ab, wobei der Pin ein Ausgang bleibt. Aber er kann dann mit den üblichen Befehlen auf 1 oder 0 gesetzt werden.

demmy
12.11.2012, 22:22
Ok vielen Dank zusammen,

es funktioniert jetzt einwandfrei! :)

Ich bin allerdings mit meiner Schaltung noch nicht ganz zufrieden. Ich habe sie jetzt mal testweise so aufgebaut:

23710

Was haltet Ihr davon? Wäre es besser den IRFPC40 über einen Optokoppler vom Steuerungsteil zu trennen? Brauche ich evtl. noch einen Pull-Down-Widerstand an G ?

Gruß