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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.