PWM, ATMega - Möglichkeiten

Gast #1959653
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
Gast #1959656
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.
#1959662
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...
Gast #1959697
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?
Gast #1959786
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?
Gast #1959804
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.
#1959825
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)
Gast #1960659
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.

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