Forum: Mikrocontroller und Digitale Elektronik Wie funktioniert PWM über DMA [Allgemein]


von Andy (Gast)


Lesenswert?

Hallo zusammen, ich hoffe ihr könnt mir wieder weiterhelfen.

Ich habe in einem Projekt mit einem Mikrocontroller, ein 
pulsweitenmoduliertes Signal mit Hilfe der Timer realisiert. Bei der 
Planung dazu bin ich auf eine Alternative gestoßen, bei der 
Speicherregister mit dem DMA an den GPIOs ausgegeben werden, ich konnte 
mich, aus Zeitmangel, allerdings nicht länger damit beschäftigen.
Das würde ich ganz gerne jetzt nachholen und auch mal versuchen, aber 
mir fehlt noch ein wenig an Hintergrundwissen, welche 
Peripheriekomponenten werden benötigt und wie ist der Ablauf.
Hat da vielleicht jemand noch etwas mehr Ahnung oder eine Seite mit 
einer guten Erklärung?

Vielen dank im vorraus
Gruß Andy

von c-hater (Gast)


Lesenswert?

Andy schrieb:

> Hallo zusammen, ich hoffe ihr könnt mir wieder weiterhelfen.

Höchstens sehr begrenzt.

> Ich habe in einem Projekt mit einem Mikrocontroller, ein
> pulsweitenmoduliertes Signal mit Hilfe der Timer realisiert. Bei der
> Planung dazu bin ich auf eine Alternative gestoßen, bei der
> Speicherregister mit dem DMA an den GPIOs ausgegeben werden

Ja, kann man machen. Ist aber eine ähnliche Notlösung wie etwa, eine 
SPI-Schnittstelle zur Ausgabe von Bilddaten aus einem Framebuffer an 
einen VGA-Monitor zu verwenden. Geht sicher, aber richtig benutzte, 
spezialisierte Hardware ist immer besser als solche Nötlösungen.

> Das würde ich ganz gerne jetzt nachholen und auch mal versuchen, aber
> mir fehlt noch ein wenig an Hintergrundwissen, welche
> Peripheriekomponenten werden benötigt und wie ist der Ablauf.

Ersteres hängt von der verwendeten Hardwareplattform ab, die du uns in 
deiner unendlichen Weisheit natürlich wohlweislich verschwiegen hast 
(ich tippe: RasPi) und letzteres ist überaus trivial: Man berechnet das 
Muster in einem Stück RAM vor und läßt es dann die DMA zyklisch 
ausgeben. Schon fertig.

Naja, fast...

Interessant wird es nämlich erst, wenn sich der Duty-Faktor der PWM im 
Betrieb auch mal ändern soll. Dann wird's nämlich kompliziert bei der 
Notlösung. Dann ist mindestens ein Double-Buffer-Schema für die DMA 
angesagt und auch das löst nicht alle Probleme, denn der Buffer will 
auch noch im genau richtigen Moment umgeschaltet werden, was nicht immer 
so einfach ist, wie es sich anhört...

Aber auch das hängt von der verwendeten Hardwareplattform ab, die du uns 
in deiner unendlichen Weisheit natürlich wohlweislich verschwiegen 
hast...


Mit PWM-fähigen Timern lebt es sich viel leichter...

von MaWin (Gast)


Lesenswert?

DMA kann sehr schnell sein. Also legt man das ein/ausschaltmuster (von 
mehr als 1 Kanal, ein byte erlaubt 8) im Speicher ab, vorbereitet, und 
lässt dann die DMA das ans Port schicken (z.B. 129 bytes nacheinander 
und dann 127 pause).
Vor allem wenn man LEDs binär dimmt, also 1, 2, 4, 8, 16,... 128 
Zeiteinheiten an/aus kann die DMA zu sehr kurzen Zeiteinheiten führen, 
und während der 128 Zeiteinheiten kannn man neu berechnen.
Haben wir damals für Video auf LED-Wänden gemacht.

von halbgarer Vollpfosten (Gast)


Lesenswert?

Andy schrieb:
> Hat da vielleicht jemand noch etwas mehr Ahnung oder eine Seite mit
> einer guten Erklärung?

Wenn die Erklärung gut ist, wirst Du es anschließend nicht mehr machen 
wollen ;-)

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.