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
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.
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...
Ε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?
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.
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.
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?
@ 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
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
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.
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)
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.