mikrocontroller.net

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


Autor: Herbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Axel Düsendieb (axel_jeromin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie schnell soll denn die PWM Frequenz sein?

Autor: Herbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Herbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Herbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Herbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Herbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Herbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.