Forum: Mikrocontroller und Digitale Elektronik ATMega: wie viele Software PWMs @ 10Bit Auflösung und ca. 150 Hz sind möglich?


von Jack (Gast)


Lesenswert?

Hi,

bisher habe ich nur Erfahrung mit Hardware PWM gemacht. Jetzt stellt 
sich mir die Frage, ob ich ein neues Projekt auf einem ATMega beginnen 
soll oder ob das von vornherein aussichtslos ist.

Und zwar würden mich die schätzungsweise maximal möglichen Software PWMs 
unter folgenden Vorraussetzungen interesseieren

- ATMega @ 16 MHz, genügend Pins einfach vorrausgesetzt (kein 
Multiplexing)
- 10 Bit Auflösung
- etwa 150 Hz
- nebenbei zu erledigende Aufgaben: Empfang von PWM-Werten über USART, 
SPI oder I2C (was sich eben gerade anbietet)

15x PWM wäre wohl das Mindeste, was ich benötige. Wenn ich da an den 
Grenzen wäre muss man damit leben, mehr kann allerdings auch nicht 
schaden.

Wie gesagt, das auszutüfteln, wie das am schnellsten abläuft, schaffe 
ich, denke ich zumindest, selber - lediglich die Machbarkeit würde mich 
interessieren, bevor ich mich Stunden davorsetze ...

von Stefan (Gast)


Lesenswert?

Kommt auf die Implementierung an!

Les dir mal das da durch und mach mal n paar überschlagsmäßige 
Berechnungen auf der Grundlage des Artikels.

von Stefan (Gast)


Lesenswert?


von Matthias L. (Gast)


Lesenswert?

>10 Bit Auflösung
>- etwa 150 Hz

wären ca 150kHz Timertakt. (ca 6,5µs, @16MHz alle 104Befehle)

>15x PWM
Vielleiht lässt sich das ja auch mit Hardware machen. Indem du den 
OutputCompare-Interrupt nimmst und beim Auslösen dieses einfach den 
besagten Pin per Software zuschaltest.
Damit sollte sich die Prozessorauslastung "relativ" in Grenzen halten. 
Ich habe dazu allerdings keine Erfahrungswerte, glaube auber, mal von 
peda einen entsprechenden Artikel gelesen zu haben.

PS: Link meines Vorposters ;-)

von Adrian (Gast)


Lesenswert?

Hallo wenn du das PWM in Software machst und das ganze vielleicht damit 
bei UART empfang die PWM nicht gestört wird, das ganze mittels Interrupt 
sollte das Kein Problem sein.

Ich habe einen Mega16 schon mal "gezungen" an allen Pins Soft-PWM 
auszugeben, es geht, der uC ist aber dann recht gut ausgelastet.

Das Programm habe ich in Bascom geschrieben, nach ein paar Versuchen bei 
denen ich Programierfehler von mir ausgemerzt habe lief es einwandfrei.
Der Sollwert wurde über UART übertragen, dazu habe ich jedem Pin einen 
Buchstaben zugeordnet. Das ganze sieht dann so aus:

A552
H132
usw.

Der Buchstaben kennzeichnet das Ausgabepin und der Wert hintendran 
bezeichnet das PWM-Verhältnis.
Als Trennzeichen habe ich Kommata benutzt.

Das ganze war für eine Art "Super-RGB-Licht" als ich vor ca. einem 
halben Jahr angefangen habe mit den AVRs. Es geht übrigends immer noch 
:)

Adrian

von Franz (Gast)


Lesenswert?

Aus welchem  Grund benötigst Du 10 Bit PWM?

Für Wechselrichter genügen meines Erachtens 8 Bit. Siehe Oszi-Bild der 
Netzspannung.

mfg
Franz

von Jack (Gast)


Lesenswert?

>Aus welchem  Grund benötigst Du 10 Bit PWM?

Ganz klassisch: LEDs

8 Bit Auflösung sind bei einer annähernd logarithmischen Kurve im 
unteren Bereich dann doch etwas knapp ... oder meint ich nicht ?

von Falk B. (falk)


Lesenswert?

@ Jack (Gast)

>8 Bit Auflösung sind bei einer annähernd logarithmischen Kurve im
>unteren Bereich dann doch etwas knapp ... oder meint ich nicht ?

Für die meisten Sachen reichen 8 Bit, siehe LED-Fading

MfG
Falk

von Lupin (Gast)


Lesenswert?

Vielleicht geht es so: Eine liste mit den PWM Werten im Speicher haben 
die immer so sortiert ist, dass der niedrigste Wert als erstes kommt. Du 
musst dieser Liste dann auch den entsprechenden Port/Pin zuweisen (zB 
durch eine zweite Liste).

Dann legst du einen interrupt für output compare und einen für timer 
overflow an.
Im overflow interrupt setzt du alle PWM Ausgänge auf HIGH.
Im output compare interrupt setzt du den entsprechenden Pin wieder auf 
LOW und lädst das output compare register mit den nächst höheren PWM 
Wert. So hangelst du dich von der kürzesten zur längsten PWM durch.

Am besten würde das von der Implementation her funktionieren wenn du 
einen ganzen Port als PWM Ausgänge definierst.

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.