Forum: Mikrocontroller und Digitale Elektronik PWM, ATMega - Möglichkeiten


von Herbie (Gast)


Lesenswert?

Hi ihr,

ich habe da eine Frage bezüglich der PWM eines Mikrocontrollers vom 
Hause Atmel.
Es ist eher eine programmiertechnische Frage.

Ich würde gerne wissen, wie man elegant eine PWM erzeugen kann, die auf 
Wunsch mal 1-2 Pulse auslässt, aber dann wieder ganz normal weiter 
arbeitet.

Ich rufe z.B. eine Funktion auf und daraufhin lässt die PWM zwei Pulse 
(oder auch nur einen) aus. Ist so etwas möglich?

Vielen Dank für eure Hilfe.

mfg
Herbie

von Axel D. (axel_jeromin) Benutzerseite


Lesenswert?

wie schnell soll denn die PWM Frequenz sein?

von Herbie (Gast)


Lesenswert?

Die sollte im Bereich von 100 kHz liegen. Ist aber noch nicht 
entschieden. Ich wollte mich halt erstmal erkundigen, aber wenn es mit 
100 kHz geht, würde ich es darauf festlegen.
Für Vorschläge bin ich dankbar.

Danke für die schnelle Antwort.

von Εrnst B. (ernst)


Lesenswert?

Herbie schrieb:
> PWM eines Mikrocontrollers vom
> Hause Atmel.

Atmel macht viele, viele verschieden µCs mit verschiedenen Architekturen 
(AVR, AVR32, ARM, '51, ...)

Ich nehme einfach mal an, du meinst AVR:

Wenns nicht stört, dass der Puls erst in der nächsten Periode ausfällt, 
kein großes Problem.

In der Overflow/Top-ISR einfach den Output-Compare wegschalten, Zähler 
einrichten, nach X weiteren ISR-Aufrufen den Orginalwert wieder 
zurückkopieren.

Ggfs geht auch in der ISR einfach das DDR-bit des Pins abzudrehen oder 
die WGM-Modi zu verwurschteln.

Edit: Kann aber bei 100kHz schon seehr knapp werden von der Zeit in der 
ISR...

von Herbie (Gast)


Lesenswert?

Εrnst B✶ schrieb:
> Ich nehme einfach mal an, du meinst AVR:

Ja, ich meinte AVR - das habe ich noch vergessen zu erwähnen, 
Entschuldigung.

Εrnst B✶ schrieb:
> Wenns nicht stört, dass der Puls erst in der nächsten Periode ausfällt,
> kein großes Problem.

Das dürfte kein Problem sein, ob der Puls jetzt 10 us später ausfällt 
oder zeitgleich, macht keinen Unterschied.


Εrnst B✶ schrieb:
> In der Overflow/Top-ISR einfach den Output-Compare wegschalten, Zähler
> einrichten, nach X weiteren ISR-Aufrufen den Orginalwert wieder
> zurückkopieren.
>
> Ggfs geht auch in der ISR einfach das DDR-bit des Pins abzudrehen oder
> die WGM-Modi zu verwurschteln.

Ich stelle also den Timer so ein, dass das Overflow-Bit immer bei meiner 
eingestellten Periode (10 µs/100kHz) gesetzt wird. Und da kann ich dann 
einen Counter inkrementieren, der bei einem bestimmten Wert (eins oder 
zwei, in meinem Falle) wieder den Pin hinzuschaltet o.ä.

Εrnst B✶ schrieb:
> Edit: Kann aber bei 100kHz schon seehr knapp werden von der Zeit in der
> ISR...

Was heißt sehr knapp? Die Mikrocontroller schafft es nicht in der Zeit 
eine Variable zu inkrementieren und zu vergleichen und einen Pin an- 
bzw. abzuschalten?
Also würde der µC das dann nicht schaffen?
Ich dachte mit einem Takt von so 8 Mhz müsste der bei 10 us ja genug 
Zeit haben, oder irre ich mich da?

von ... (Gast)


Lesenswert?

Das finde ich nicht. Du hast 80 Takte für alles und dann steht der 
nächste Interrupt wieder an. Ich würde empfehlen auf jeden Fall die 
Taktfrequenz auf das Maximum aufzudrehen! Hier 16 MHz.

von Herbie (Gast)


Lesenswert?

Was ist denn so ein Richtwert, an dem man sich halten sollte? Also bei 
dem man gewährleisten kann, dass die Befehle noch sauber ausgeführt 
werden?

Vielen Dank für eure Hilfe.

von Herbie (Gast)


Lesenswert?

Ist es möglich, im Laufe eines Programms den Interrupt vom Timer zu 
aktivieren bzw. deaktivieren? Dann würde ja nicht immer der 
TOV-Interrupt kommen, sondern nur dann, wenn ich ihn enabled habe, oder?

von Falk B. (falk)


Lesenswert?

@  Herbie (Gast)

>Ist es möglich, im Laufe eines Programms den Interrupt vom Timer zu
>aktivieren bzw. deaktivieren?

Sicher.

> Dann würde ja nicht immer der
> TOV-Interrupt kommen, sondern nur dann, wenn ich ihn enabled habe, oder?

Was sonst. Siehe Timer und Interrupt

MfG
Falk

von spess53 (Gast)


Lesenswert?

Hi

>Dann würde ja nicht immer der TOV-Interrupt kommen, sondern nur dann, wenn
>ich ihn enabled habe, oder?

Das hat aber nichts mit der PWM zu tun. Die läuft trotzdem weiter.

MfG Spess

von Herbie (Gast)


Lesenswert?

Ja, sie soll ja weiterlaufen, nur ab und an, ein paar Pulse auslassen.

Das Problem wäre nur, wenn die Pulse, die ausgelassen werden sollen 
regelmäßiger auftreten.
Wenn z.B. aus irgendeinem Grund jeder zweite Puls ausgelassen wird, dann 
habe ich nur 80 Zyklen Zeit, um alle Programmabschnitte im Quelltext 
abzuarbeiten und das würde dann knapp werden.

von Karl H. (kbuchegg)


Lesenswert?

Herbie schrieb:

> Wenn z.B. aus irgendeinem Grund jeder zweite Puls ausgelassen wird, dann
> habe ich nur 80 Zyklen Zeit, um alle Programmabschnitte im Quelltext
> abzuarbeiten und das würde dann knapp werden.

So wenig sind 80 Zyklen dann auch wieder nicht.
Da bringt man schon so einiges unter.
Als Faustregel würde ich mal so um die 15 bis 20 Zyklen für eine ISR 
veranschlagen, die nichts tut. Und eine Variable erniedrigen und je nach 
Wert ein Bit ein einem Konfigurationsregister setzen oder löschen, das 
sind nochmal vielleicht 10 Zyklen dazu.


(Disclaimer: Alle Zahlen aus dem Bauch heraus und absichtlich eher 
konservativ hoch angenommen. Für exakte Zahlen einfach mal in den 
Assembler Output schauen)

von Herbie (Gast)


Lesenswert?

Wenn ich jeden zweiten Puls auslassen würde, käme das doch eigentlich 
auch mit einer Frequenzhalbierung gleich - also könnte ich anstatt (für 
das kontinuierliche Auslassen einiger Pulse) in ISRs rumzuspielen, doch 
einfachdie Frequenz halbieren.

Auf jeden Fall danke für eure bisherige Hilfe.

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.