Forum: Mikrocontroller und Digitale Elektronik 16-Bit-PWM mit 10 bis 100 kHz


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Cyberfuzzy (Gast)


Lesenswert?

Hallo,

gibt es die Möglichkeit, mit einem Mikrocontroller (z. B. ATmega) eine 
16-Bit-PWM zu erzeugen, wobei die PWM-Frequenz im Bereich von 10 bis 100 
kHz liegen soll?

Wenn ich einen normalen ATmega (getaktet mit 20 MHz) nehme, dann komme 
ich bei 16 Bit nur auf eine PWM-Frequenz von ca. 305 kHz (prescaling 
deaktiviert). Und soweit ich weiß kann ich den externen Takt für den 
PWM-Timer nicht größer machen als die Hälfte des Taktes vom µC, oder?

Also wenn es eine andere Möglichkeit gibt, evtl. auch mit Hilfe eines 
32-Bit Controllers, dann bin ich für jeden Hinweis dankbar.

Vielen Dank schon mal :-)


Grüße
Cyberfuzzy

von Peter D. (peda)


Lesenswert?

Cyberfuzzy schrieb:
> gibt es die Möglichkeit, mit einem Mikrocontroller (z. B. ATmega) eine
> 16-Bit-PWM zu erzeugen, wobei die PWM-Frequenz im Bereich von 10 bis 100
> kHz liegen soll?

Tja, die Mathematik läßt sich nicht überlisten:
100kHz * 65536 = 6,6GHz

PWM ist also der falsche Ansatz.


Peter

von Εrnst B. (ernst)


Lesenswert?

16Bit PWM erfordert, dass der µC von 0 bis 2^16 zählt.
die 100kHz-vorgabe erfordert, dass er das 100.000 mal pro Sekunde tut.
Also brauchst du eine Zähl-Frequenz von ~6.5 GHz. Viel Glück bei der 
Suche.

Alternative: PWM analog erzeugen.

von Falk B. (falk)


Lesenswert?

@Cyberfuzzy (Gast)

>gibt es die Möglichkeit, mit einem Mikrocontroller (z. B. ATmega) eine
>16-Bit-PWM zu erzeugen, wobei die PWM-Frequenz im Bereich von 10 bis 100
>kHz liegen soll?

Nein.

>Wenn ich einen normalen ATmega (getaktet mit 20 MHz) nehme, dann komme
>ich bei 16 Bit nur auf eine PWM-Frequenz von ca. 305 kHz (prescaling
>deaktiviert).

Jo.

> Und soweit ich weiß kann ich den externen Takt für den
> PWM-Timer nicht größer machen als die Hälfte des Taktes vom µC, oder?

Eben.

>32-Bit Controllers, dann bin ich für jeden Hinweis dankbar.

Siehe Netiquette. Sag uns, was du INSGESAMT machen willst. 16 Bit 
PWM bei 100 KHz brauchen die allerwenigsten Menschen.

MFG
Falk

von Falk B. (falk)


Lesenswert?

@  Εrnst B✶ (ernst)

>Also brauchst du eine Zähl-Frequenz von ~6.5 GHz. Viel Glück bei der
>Suche.

Gibt es, z.B Piccolo von TI. Dort hat man aber keine 6,5 GHz sondern 
Delay Lines.

>Alternative: PWM analog erzeugen.

Schöne Illusion, dort 16 Bit Auflösung und Genauigkeit halbwegs 
rauscharm hinzubekommen.

MFG
Falk

von Oliver (Gast)


Lesenswert?

Falk Brunner schrieb:
> Schöne Illusion, dort 16 Bit Auflösung und Genauigkeit halbwegs
> rauscharm hinzubekommen.

um dich selber zu zitieren:

Falk Brunner schrieb:
> 16 Bit
> PWM bei 100 KHz brauchen die allerwenigsten Menschen.

Oliver

von Εrnst B. (ernst)


Lesenswert?

Falk Brunner schrieb:
> Schöne Illusion, dort 16 Bit Auflösung und Genauigkeit halbwegs
> rauscharm hinzubekommen.

Ja, das ist sportlich. Allein einen Sägezahn/Dreieck so verzerrungsfrei 
hinzukriegen würd ich mir nicht zutrauen.

Aber vielleicht braucht der TE das ja nicht.
Meine Glaskugel sagt:
Er will eine LED mit PWM dimmen, ohne Flackern und außerhalb des 
hörbaren Bereichs. Um auch den "dunklen" Anfang sauber und stufenlos 
hinzukriegen, wünscht er sich 16 Bit.

von Peter D. (peda)


Lesenswert?

Ich hab mal einen 16Bit Analogwert mit 2*8Bit PWM erzeugt. Beide 
Ausgänge über 1k und 255k addiert und dann auf den Tiefpaß. 
Funktionierte sehr gut.


Peter

von weg mit dem Trog (Gast)


Lesenswert?

Natuerlich kann man mit einen AVR einen 16 bit PWM mit 50_100kHz 
erzeugen. Dazu benoetigt man einen Trick. Das MSB wird in den 8bit PWM 
geladen. So laeuft der PWM ab 16MHz mit 67kHz. Mit dem LSB zaehlt man 
beim Timeroverflow die Zyklen und schaltet dann zwischen MSB und MSB+1 
um. Dh die Subzyklen laufen mit 256 Hz oder so.

von Falk B. (falk)


Lesenswert?

@  Peter Dannegger (peda)

>Ich hab mal einen 16Bit Analogwert mit 2*8Bit PWM erzeugt. Beide
>Ausgänge über 1k und 255k addiert und dann auf den Tiefpaß.
>Funktionierte sehr gut.

Glaubst du. Hast du es SOLIDE nachgemessen?

Ist hier das gleiche Problem wie wenn man glaubt mit einfachen 1% 
Widerständen einen 8 Bit R2R DAC bauen zu können. Ist nicht möglich. 
Ebensowenig wie 16 Bit PWM durch einfache gewichtete Addition zwei 8 Bit 
PWMs. Denn die MSB-PWM muss die GLEICHE absolute Genauigkeit haben wie 
deine LSB PWM, sonst bekommt deine Kennlinie Unstetigkeiten und Knicke.

MfG
Falk

von Jobst M. (jobstens-de)


Lesenswert?

Falk Brunner schrieb:
> Denn die MSB-PWM muss die GLEICHE absolute Genauigkeit haben wie
> deine LSB PWM, sonst bekommt deine Kennlinie Unstetigkeiten und Knicke.

Aber das lässt sich relativ einfach abgleichen.

Solange der TO jedoch nicht herausrückt, was er machen möchte, ist eine 
weitere Diskussion unnötig. Vielleicht benötigt er einen richtigen 16 
Bit DAC, vielleicht bringt ihn auch eine PDM weiter.


Gruß

Jobst

von Stephan (Gast)


Lesenswert?

weg mit dem Trog schrieb:
> Natuerlich kann man mit einen AVR einen 16 bit PWM mit 50_100kHz
> erzeugen. Dazu benoetigt man einen Trick. Das MSB wird in den 8bit PWM
> geladen. So laeuft der PWM ab 16MHz mit 67kHz. Mit dem LSB zaehlt man
> beim Timeroverflow die Zyklen und schaltet dann zwischen MSB und MSB+1
> um. Dh die Subzyklen laufen mit 256 Hz oder so.

Sowas wie Bresenham für PWM.
Ist halt keine 16-Bit-PWM die einen Wechsel 1001/65535 auf 1002/65535 
innerhalb eine Zyklus astrein abbilden würde. Für die allermeisten Fälle 
funktioniert das aber einwandfrei.

Mit wechselnden Periodendauern lässt sich des Ideal besser annähern. Für 
1001/65535 und 1001/65535 z.B. Sprünge zwischen 1/65 und 1/66, max 2 
Zyklen ohne Wechsel.
Am oberen und unteren Ende läufts aber wieder auf Deine Logik raus.

Praktisch sind 16Bit bei 100kHz Unfug. Alleine die Ein-/Ausschaltzeiten 
des Portpins werden mit ein paar Grad Temperaturänderung schon um mehr 
als die 1,5ns auseinanderdriften. Von nachfolgenden Schaltern und 
Bauteilstreuung ganz zu schweigen.
Ohne Ausregelung macht das keinen Sinn.

von Harglbar (Gast)


Lesenswert?

Oder Delta-Sigma-Modulation in Software->USART->Tiefpass

von Cyberfuzzy (Gast)


Lesenswert?

Guten Morgen,

vielen Dank schon mal für die vielen Antworten. Ich konnte sie leider 
erst jetzt lesen.

Falk Brunner schrieb:
> Siehe Netiquette. Sag uns, was du INSGESAMT machen willst. 16 Bit
> PWM bei 100 KHz brauchen die allerwenigsten Menschen.

Also es geht um eine Stromregelung für ein Batterieladegerät. Die 
Batteriezelle (z. B. eine 3,6 Volt Zelle) hängt in Serie mit einem 
Widerstand (0,1 Ohm) am Ausgang eines Abwärtswandlers. Strombereich ist 
1 mA bis 25 A. (Ich weiß, dass es sportlich klingt bei 25 A noch um 1 mA 
genau zu regeln, aber möglich sein sollte es doch, oder?)

Eingangsspannung des Wandlers = 7,5 Volt. Über das Tastverhältnis kann 
die Ausgangsspannung eingestellt werden.

Bei einer 8-Bit-PWM könnte ich die Ausgangsspannung also auf 7,5 V / 2^8 
= 29,3 mV genau einstellen.

Bei 29,3 mV ändert sich der Strom bei einem Widerstand von 0,1 Ohm 
(Innenwiderstand der Batteriezelle vernachlässigt) aber schon um 293 mA.
-> unbrauchbar

Wenn ich das Ganze mit einer 16-Bit-PWM mache, dann kann ich die 
Ausgangsspannung auf ca. 144 µV genau einstellen. Der Strom ist somit 
auf 1,14 mA genau einstellbar. Das wäre ein guter Wert.

Das Problem ist hier nur, dass ich bei geringen PWM-Frequenzen sehr 
große Induktivitäten einsetzen müsste, die auch noch einen großen Strom 
(bis etwas über 25 A) aushalten müssen. So etwas ist sehr schwer zu 
finden. Mit einer hohen PWM Frequenz wäre das alles einfacher.

Ich hoffe ich konnte einigermaßen rüber bringen, was ich machen will. 
Gibt es für mein Vorhaben vielleicht bessere Ansätze?

von Falk B. (falk)


Lesenswert?

@Cyberfuzzy (Gast)

>Also es geht um eine Stromregelung für ein Batterieladegerät.

Aha.

>Die Batteriezelle (z. B. eine 3,6 Volt Zelle) hängt in Serie mit einem
>Widerstand (0,1 Ohm) am Ausgang eines Abwärtswandlers. Strombereich ist
>1 mA bis 25 A. (Ich weiß, dass es sportlich klingt bei 25 A noch um 1 mA
>genau zu regeln, aber möglich sein sollte es doch, oder?)

SEHR Sportlich und praktisch unsinnig. Einen Ladestrom von 25A braucht 
man bestenfalls auf 0,1 A genau, real reicht vielleicht 1A Toleranz.

Und an 0,1 Ohm fallen bei 25A satte 62,5W verlustleistung ab. Das willst 
du nicht wirklich. Eher Faktor 10 kleiner, ggf noch weniger.

>Bei einer 8-Bit-PWM könnte ich die Ausgangsspannung also auf 7,5 V / 2^8
>= 29,3 mV genau einstellen.

Theoretisch ja, praktisch baut man meist eher einen Stromregler und 
misst die Spannung.

>Bei 29,3 mV ändert sich der Strom bei einem Widerstand von 0,1 Ohm
>(Innenwiderstand der Batteriezelle vernachlässigt) aber schon um 293 mA.
>-> unbrauchbar

Für 25A mehr als genau genug.

>Wenn ich das Ganze mit einer 16-Bit-PWM mache, dann kann ich die
>Ausgangsspannung auf ca. 144 µV genau einstellen.

Theoretisch. Wenn nix rauscht, Offsets etc.

> Der Strom ist somit auf 1,14 mA genau einstellbar. Das wäre ein guter
> Wert.

Das ist akademischer Unsinn fernab jeglicher praktischer Machbarkeit und 
vor allem Notwendigkeit.

Wenn du schon einen derartig großen Strombereich abdecken willst, nimm 
mehrere Messbereiche, z.B. 2,5A und 25A. Dann reicht auch 8-10 Bit PWM 
locker.

>Ich hoffe ich konnte einigermaßen rüber bringen, was ich machen will.

Ja

>Gibt es für mein Vorhaben vielleicht bessere Ansätze?

Ja.

MFG
Falk

von Lästermaul (Gast)


Lesenswert?

Ach Falk....

wir sind hier ein Hobbybastlerforum.

Ob technisch oder betriebswirtschaftlich sinnvoll - ist doch erst mal 
ziemlich nebensächlich. Ob es machbar ist - auch erst mal nicht so 
wichtig.

Wenn sich der Cyberfuzzy an einem unrealisierbaren Projekt die Hörner 
abstoßen möchte - warum nicht. Vielleicht sucht sich der gute Mann 
nachher einen seriösen Nickname.

Grüße an alle Hobbybastler, die ihre verrückten Ideen noch nicht 
verloren haben.

von m.n. (Gast)


Angehängte Dateien:

Lesenswert?

Anbei ein Pseudocode, wie man mit einem AVR eine 16-Bit PWM mit hoher 
Ausgangsfrequenz erzeugen kann: ungetestet + qick&dirty!
Beim Aufruf der Interrupt-Routine mit 100kHz, wird beispielsweise mit 
dem Wert 0x8000 ein Signal mit 50kHz ausgegeben. Dieses läßt sich leicht 
filtern. Für andere PWM-Werte werden 10µs Impulse gleichmäßig verteilt 
über das Gesamtintervall ausgegeben.

Zum besseren Verständnis verweise ich auf meine Seite, wo die Beispiele 
2 und 3 die Funktion für 8-Bit-PWM besser erklären. Vielleicht hilft es 
Dir weiter.
http://www.mino-elektronik.de/soft-pwm/pwm_software.htm

von Εrnst B. (ernst)


Lesenswert?

Wobei so ein Schaltregler mit dickem Ausgangselko und Akku dahinter ein 
sehr träges System sind.

Für die Regelung auf 1mA brauchst du also garkeine 16Bit PWM:
es reicht, wenn sich die Einschaltdauer über z.B. 1 Sekunde, 10 
Sekunden, ... gemittelt auf deine 16, 20, 24, ... Bit genau einstellen 
lässt.
Und das wiederum ist überhaupt kein Problem, das macht dir ein Tiny25 so 
nebenbei.
(Tiny{2,4,8}5 wegen der PLL auf 64MHz, mit der der PWM-Timer laufen 
kann)

Damit sind wir wieder beim Bresenham für PWM, auf den ja weiter oben 
schon verwiesen wurde.

von fragender (Gast)


Lesenswert?

Stephan schrieb:
> wie Bresenham für PWM.

Ich hab google benutzt, bin aber nicht so richtig fündig geworden.
Wie kann ich unter der Verwendung des Hardware-PWMs eines zum Bsp. 
Atmega die Auflösung des 8Bit PWMs, bei maximaler Frequenz, durch 
Verwendung von Bresenham verbessern, bei gleicher PWM-Frequenz?

würde mich über eine Erklärung freuen.
Danke

von Michael S. (rbs_phoenix)


Lesenswert?

Cyberfuzzy schrieb:
> Wenn ich einen normalen ATmega (getaktet mit 20 MHz) nehme, dann komme
> ich bei 16 Bit nur auf eine PWM-Frequenz von ca. 305 kHz (prescaling
> deaktiviert).

Denke eher, dass du 305Hz meinst oder? Sonst hätteste ja mehr als du 
willst.

Ich denke auch, dass da 16bit reichlich ist. Vorallem hörts ja beim/nach 
dem DAC nicht auf. Dann brauchst du eine genaue Spannungsreferenz, 
genaue Widerstände, wobei diese bei Wärme (die du bei 62,5W bestimmt 
hast) auch ihren Widerstandswert ändern. Dazu wie gesagt keine 
einstreuende und/oder induzierte Spannung.


Lästermaul schrieb:
> Ach Falk....
>
> wir sind hier ein Hobbybastlerforum.
>
> Ob technisch oder betriebswirtschaftlich sinnvoll - ist doch erst mal
> ziemlich nebensächlich. Ob es machbar ist - auch erst mal nicht so
> wichtig.

Naja.. Das Forum soll helfen, Leute kommen her um Hilfe zu bekommen oder 
zu geben. Und wenn ein Vorhaben nur unter enormen umständen, wenn 
überhaupt möglich, realisiert werden kann, dann würde mich es persönlich 
interessieren, wenn ich da an etwas nicht gedacht habe. Und jeden zu 
sagen "Ja mach mal", wo man es ziemlich genau weiß, dass da nicht das 
gewünschte Ziel rauskommt, bringt auch nichts. Dann kann man es auch 
sein lassen und jeden einfach machen lassen.


Was ich jedoch gesehen habe ist beim dsPIC33 die High-Speed 16bit PWMs.
Section 43: High-Speed PWM - 
http://ww1.microchip.com/downloads/en/DeviceDoc/70323D.pdf

Auf Seite 49 ist ein Configurations- bzw. Rechenbeispiel für 100kHz.

von Jobst M. (jobstens-de)


Lesenswert?

m.n. schrieb:
> Anbei ein Pseudocode, wie man mit einem AVR eine 16-Bit PWM mit hoher
> Ausgangsfrequenz erzeugen kann

Das ist aber keine PWM, sondern die von mir schon angesprochene PDM 
(Puls-Dichte-Modulation)

Je höher der Wert, desto höher die Anzahl der einsen.
Im mittleren Wertebereich ist die Ausgangsfrequenz am höchsten, zu 
beiden Enden nimmt sie sehr schnell ab.


Gruß

Jobst

von Cyberfuzzy (Gast)


Lesenswert?

Vielen Dank schon mal für die vielen guten Hinweise!


Michael Skropski schrieb:
> Cyberfuzzy schrieb:
>> Wenn ich einen normalen ATmega (getaktet mit 20 MHz) nehme, dann komme
>> ich bei 16 Bit nur auf eine PWM-Frequenz von ca. 305 kHz (prescaling
>> deaktiviert).
>
> Denke eher, dass du 305Hz meinst oder? Sonst hätteste ja mehr als du
> willst.

Ja richtig, ich meinte 305Hz.

von MirkoB (Gast)


Lesenswert?

Warum immer so ein rumgehampel mit der PWM um eine Referenzspannung zu 
erzeugen?
Für knapp 5€ gibt es einen MCP4922 mit 2 12-Bit DACs. (mit 
URef-Eingang!)

Im Datenblatt gibt es einen Abschnitt "6.7 Designing A Double-Precision
DAC Using A Dual DAC" - da kann man aus 2x12Bit einen mit 24Bit basteln.
(Wofür man das auch immer braucht).

Copy&Paste aus dem Datenblatt:

• 12-Bit Resolution
• ±0.2 LSB DNL (typ)
• ±2 LSB INL (typ)
• Single or Dual Channel
• Rail-to-Rail Output

Mirko

von Falk B. (falk)


Lesenswert?

@MirkoB (Gast)

>Warum immer so ein rumgehampel mit der PWM um eine Referenzspannung zu
>erzeugen?

Das will keiner.

Beitrag "Re: 16-Bit-PWM mit 10 bis 100 kHz"

"Eingangsspannung des Wandlers = 7,5 Volt. Über das Tastverhältnis kann
die Ausgangsspannung eingestellt werden."

von Harald W. (wilhelms)


Lesenswert?

Lästermaul schrieb:
> Ach Falk....
>
> wir sind hier ein Hobbybastlerforum.
>
> Ob technisch oder betriebswirtschaftlich sinnvoll - ist doch erst mal
> ziemlich nebensächlich. Ob es machbar ist - auch erst mal nicht so
> wichtig.

Wenn man ein 5stelliges Budget hat, lässt sich das sicher machen.
Wenn man dann noch Herrn von Klitzing wegen der Genauigkeit als
technischen Berater engagiert, wird das Budget aber sicherlich
sechsstellig.
Gruss
Harald

von MirkoB (Gast)


Lesenswert?

> "Eingangsspannung des Wandlers = 7,5 Volt. Über das Tastverhältnis kann
> die Ausgangsspannung eingestellt werden."

> Das Problem ist hier nur, dass ich bei geringen PWM-Frequenzen sehr
> große Induktivitäten einsetzen müsste, die auch noch einen großen Strom
> (bis etwas über 25 A) aushalten müssen.

...irgendwie konfus...

Klingt für mich wie ein Step-Up, der komplett im AVR laufen soll.
Vielleicht sollte man den Regelteil auslagern und den AVR nur zum 
steuern benutzen?

von MirkoB (Gast)


Lesenswert?

edit: Step-Down statt Step-Up ;)

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Lesenswert?

MirkoB schrieb:
> Im Datenblatt gibt es einen Abschnitt "6.7 Designing A Double-Precision
> DAC Using A Dual DAC" - da kann man aus 2x12Bit einen mit 24Bit basteln.
Wers glaubt...

> Copy&Paste aus dem Datenblatt:
> • ±0.2 LSB DNL (typ)
Deshalb geht das nicht!
Wenn der ADC fürs "Grobe" bestenfalls auf 0,2% genau ist, dann können im 
Idealfall noch 2 Bits dazugewonnen werden. Ist leider so. Denn sonst 
würde ja jeder einen teuren 16-Bit Wandler durch 2 Stück 8-Bit Wandler 
ersetzen, oder?

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]
  • [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.