mikrocontroller.net

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


Autor: Jack (Gast)
Datum:

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

Autor: Stefan (Gast)
Datum:

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Matthias Lipinsky (lippy)
Datum:

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

Autor: Adrian (Gast)
Datum:

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

Autor: Franz (Gast)
Datum:

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

Autor: Jack (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

Autor: Lupin (Gast)
Datum:

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

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.