Forum: Mikrocontroller und Digitale Elektronik STM32: PWM auf falschem Pin


von Tobias P. (hubertus)


Lesenswert?

Hallo,
mir ist bei meinem aktuellen Bastelprojekt ein Missgeschick passiert. 
Ich habe eine Leiterplatte gelayoutet und da benutze ich einen 
PWM-Output des STM32F407VE. Die PWM soll eine Auflösung von mindestens 
18 Bits haben. Ihr ahnt schon was das Problem ist :-)
Ich wusste, dass die meisten Timer des STM32 nicht 32 Bits haben, 
deshalb habe ich extra im Datenblatt nachgeschaut, und einen Satz nicht 
richtig gelesen. Jedenfalls habe ich versehentlich Timer 3 als Output 
für die PWM verwendet. Der kann aber nur 16 Bits.
OK, zuerst dachte ich, dass nun alle meine Leiterplatten Schrott sind, 
aber ich hatte folgende Idee:
könnte man nicht Timer 5 (der 32 Bits hat!) im PWM-Modus laufen lassen, 
und jeweils bei Überlauf und bei Match einen Interrupt generieren und 
dann dort den jeweiligen Ausgang als GPIO manuell setzen bzw. löschen? 
Da die PWM-Frequenz ja aufgrund der hohen Auflösung niedrig sein wird, 
dürfte sich so die Interruptlast in Grenzen halten.
Wichtig wäre vor allem, dass der Jitter sehr klein ist, und hier kommt 
meine Frage: muss ich irgendwas beachten, sodass die Interruptlatenz 
immer gleich gross ist? oder kann man die sowieso von vornherein nicht 
genau garantieren? denn die 18 Bit PWM geht auf einen DAC, daher wird 
jeder entstehende Jitter auch direkt in die Ausgangsspannung eingehen.

Oder gäbe es noch einen anderen möglichen Workaround für das Problem, 
ohne Fädeldraht zu verwenden oder eine neue Leiterplatte zu machen?

Was für ein dummer Fehler. Wieso eigentlich bauen die immer noch 16 Bit 
Timer in einen 32er Mikrocontroller ein? die NXP haben alle durchweg 32 
Bits.

Grüsse,
Tobias

von Ingo Less (Gast)


Lesenswert?

Tobias P. schrieb:
> Wichtig wäre vor allem, dass der Jitter sehr klein ist
Und damit fällt deine Interrupt-Lösung raus...

> Oder gäbe es noch einen anderen möglichen Workaround für das Problem,
> ohne Fädeldraht zu verwenden oder eine neue Leiterplatte zu machen?
Vermutlich nicht, aber was ist daran denn so schlimm, du hast doch nur 
eine Leiterplatte!? Ich würde erstmal einen Workaround mit Fädeldraht 
machen und weiter in Betrieb nehemen. Wenn alles zu 100% läuft kannst du 
immernoch darüber nachdenken, einen neue Platine fertigen zu lassen oder 
du lässt es dann so...

von A. B. (Gast)


Lesenswert?

Tobias P. schrieb:
> richtig gelesen. Jedenfalls habe ich versehentlich Timer 3 als Output
> für die PWM verwendet. Der kann aber nur 16 Bits.
> OK, zuerst dachte ich, dass nun alle meine Leiterplatten Schrott sind,
> aber ich hatte folgende Idee:
> könnte man nicht Timer 5 (der 32 Bits hat!) im PWM-Modus laufen lassen,

Eventuell kann man Timer 5 (als Master) und Timer 3 (als Slave) intern 
kaskadieren und einen passenden Modus für Timer 3 finden. Da muss man 
sich aber durchs RM wühlen ...

von Peter D. (peda)


Lesenswert?

Tobias P. schrieb:
> Ihr ahnt schon was das Problem ist :-)

Nicht wirklich, wozu braucht man eine 18Bit-PWM?

Tobias P. schrieb:
> die 18 Bit PWM geht auf einen DAC

Bahnhof?

Entweder nimmt man eine PWM mit Tiefpaß oder einen DAC.

von Tobias P. (hubertus)


Lesenswert?

Ingo Less schrieb:
> Und damit fällt deine Interrupt-Lösung raus...

nein, wenn die Interruptlatenz konstant ist, hat man keinen Jitter, 
sondern nur einen konstanten zeitlichen Versatz des PWM-Signals zum 
Timer.

Ingo Less schrieb:
> Ich würde erstmal einen Workaround mit Fädeldraht
> machen und weiter in Betrieb nehemen

Fädeldraht will ich ja eben nicht.

Peter D. schrieb:
> Nicht wirklich, wozu braucht man eine 18Bit-PWM?

weil man einen hochauflösenden DAC bauen will.

Peter D. schrieb:
> Bahnhof?
>
> Entweder nimmt man eine PWM mit Tiefpaß oder einen DAC.

PWM-DAC, schon gehört? man filtert die PWM und hat damit einen DAC. Und 
ja, 18 Bit sind so möglich. Eventuell mehr. Genau das wollte ich ja 
testen.


A. B. schrieb:
> Eventuell kann man Timer 5 (als Master) und Timer 3 (als Slave) intern
> kaskadieren und einen passenden Modus für Timer 3 finden. Da muss man
> sich aber durchs RM wühlen ...

danke, gute Idee, dies schaue ich mir mal an!

von Ingo Less (Gast)


Lesenswert?

Tobias P. schrieb:
> nein, wenn die Interruptlatenz konstant ist, hat man keinen Jitter,
> sondern nur einen konstanten zeitlichen Versatz des PWM-Signals zum
> Timer.
Ich kann dir sagen, sie ist nicht konstant

von Tobias P. (hubertus)


Lesenswert?

Ingo Less schrieb:
> Ich kann dir sagen, sie ist nicht konstant

danke, das wollte ich wissen und habe ich auch befürchtet. Ich nehme an, 
sie ist nicht konstant, weil einige Instruktionen wie z.B. POP mit 
mehreren Registern länger dauern. Wenn der Interrupt im falschen 
Zeitpunkt auftritt....

von Ingo Less (Gast)


Lesenswert?

Entweder kannst du mit ner Timerkaskade was softwareseitig retten oder 
du musst mit Fädeldraht einen Workaround kontruieren

von Peter D. (peda)


Lesenswert?

Tobias P. schrieb:
> man filtert die PWM und hat damit einen DAC.

So mache ich das üblicher Weise.
Aber Du wolltest doch noch einen DAC dahinter schalten:

Tobias P. schrieb:
> die 18 Bit PWM geht auf einen DAC

Wozu das denn?

von Ingo Less (Gast)


Lesenswert?

Peter D. schrieb:
> Aber Du wolltest doch noch einen DAC dahinter schalten:
Ich denke er meint einen DAC hinter der PWM bestehend aus RC + OPV...

von Squierrel (Gast)


Lesenswert?

Jitter ist nicht konstant, kann aber mit etwas Zeit-Puffer mit ein paar 
Zeilen Assembler Code konstant gemacht werden.
Man kann auch mit dem Timer einen DMA Triggern, der passende Daten 
ablegt. Ist allerdings auch nicht Jitter frei ;) und die Frage ob das in 
einer Bit Band Area liegt wahrscheinlich bei weiteren Pins die auf dem 
Port verwendet werden essenziell.

von Peter D. (peda)


Lesenswert?

Man kann den Jitter durchaus auf einen CPU-Zyklus konstant halten. Dazu 
braucht man einen 2. Timerinterrupt der um den maximal möglichen Jitter 
voreilend ist und die zweit höchste Priorität hat.
In diesem Interrupt setzt man die CPU auf idle und wartet dann auf den 
eigentlichen PWM-Interrupt, der die höchste Priorität hat.

von Ingo Less (Gast)


Lesenswert?

Peter D. schrieb:
> Man kann den Jitter durchaus auf einen CPU-Zyklus konstant halten. Dazu
> braucht man einen 2. Timerinterrupt der um den maximal möglichen Jitter
> voreilend ist und die zweit höchste Priorität hat.
> In diesem Interrupt setzt man die CPU auf idle und wartet dann auf den
> eigentlichen PWM-Interrupt, der die höchste Priorität hat.
Also ich hätte inzwischen wahrscheinlich den Fädeldraht schon 3x 
angelötet...

von Tobias P. (hubertus)


Lesenswert?

Peter D. schrieb:
> So mache ich das üblicher Weise.
> Aber Du wolltest doch noch einen DAC dahinter schalten:

ja, einen PWM-DAC! :-)
es ist ein Sallen-Key Tiefpassfilter 4. Ordnung. Um die 18 Bit Dynamik 
ausnutzen zu können, ist die Filterkurve entsprechend optimiert.

Squierrel schrieb:
> Man kann auch mit dem Timer einen DMA Triggern, der passende Daten
> ablegt. Ist allerdings auch nicht Jitter frei ;) und die Frage ob das in
> einer Bit Band Area liegt wahrscheinlich bei weiteren Pins die auf dem
> Port verwendet werden essenziell.

das mit dem DMA habe ich mir auch überlegt. Weshalb ist der DMA nicht 
jitterfrei? Bitband wäre möglich.

Ingo Less schrieb:
> Also ich hätte inzwischen wahrscheinlich den Fädeldraht schon 3x
> angelötet...

Ja ich auch. Aber ich sagte doch schon, dass ich keinen Fädeldraht will! 
;-)

von W.S. (Gast)


Lesenswert?

Tobias P. schrieb:
> Die PWM soll eine Auflösung von mindestens
> 18 Bits haben. Ihr ahnt schon was das Problem ist :-)

Ja: mangelndes Nachdenken bei der Planung. 18 Bit ist eine Menge! - da 
würde ich nie und nimmer über PWM nachdenken und schon gar nicht sowas 
direkt aus dem störverseuchten µC heraus. Wenn überhaupt, dann würde ich 
über einen SigmaDelta-Modulator nachdenken und mir Gedanken machen über 
Masseführung und Sieben der Versorgungen dieses Modulators.

W.S.

von Tobias P. (hubertus)


Angehängte Dateien:

Lesenswert?

W.S. schrieb:
> Ja: mangelndes Nachdenken bei der Planung. 18 Bit ist eine Menge! - da
> würde ich nie und nimmer über PWM nachdenken und schon gar nicht sowas
> direkt aus dem störverseuchten µC heraus. Wenn überhaupt, dann würde ich
> über einen SigmaDelta-Modulator nachdenken und mir Gedanken machen über
> Masseführung und Sieben der Versorgungen dieses Modulators.

Danke. Nein. Das ist es nicht. Es geht definitiv. Die Rechnung ist nicht 
schwierig, gerade von dir hätte ich eigentlich erwartet, dass du diese 
nachvollziehen kannst.
Angenommen du hast 18 Bits Auflösung, dann gibt dir dies eine Dynamik 
von 108 dB. Nehmen wir weiter an, der uC sei mit 100 MHz getaktet, dann 
ist deine PWM-Frequenz etwa 380 Hz. Das heisst, die Grundwelle kommt bei 
380 Hz, und damit muss bei dieser Frequenz das Tiefpassfilter eine 
Dämpfung von mindestens 108 dB haben, damit deine Dynamik nicht versaut 
wird durch die Reste der Grundwelle, die durchs Filter kommen.
Mit einem Sallenkey 4. Ordnung ist es machbar *und wird in kommerziellen 
Produkten auch tatsächlich so gemacht, und teilweise mit noch mehr als 
18 Bits*.
Das Ablesen der Dämpfung meines Sallenkeyfilters, welches aus 2 
kaskadierten Stufen besteht, überlasse ich dir mit Hilfe des angehängten 
Graphen.
(G1 und G2 sind die Frequnzgänge der einzelnen Stufen. Gtot ist der 
Frequenzgang der kaskasierten Stufen.)

Aber wir driften ab. Es ging ja nicht um die Dimensionierung von Filtern 
für eine PWM, sondern ob es irgendwie möglich ist, einen anderen als den 
vorgesehenen Pin eines Timers zu verwenden.

von m.n. (Gast)


Lesenswert?

Tobias P. schrieb:
> Mit einem Sallenkey 4. Ordnung ist es machbar *und wird in kommerziellen
> Produkten auch tatsächlich so gemacht, und teilweise mit noch mehr als
> 18 Bits*.

Aber nur auf dem Papier. Beschreibe mal die Schaltung. Wo kommt die 
Referenzspannung her?
Der µC-Pin liefert kein sauberes Signal, daß 18 Bit Auflösung sinnvoll 
wären. Von Genauigkeit reden wir besser erst garnicht.

von Tobias P. (hubertus)


Lesenswert?

Das PWM-Signal betätigt einen Analogschalter, welcher zwischen Masse und 
einer 1ppm Referenzspannungsquelle umschaltet. Der Analogschalter ist 
ausgewählt nach kleinstmöglicher Charge Injection.
Da die Frequenz niedrig ist, kommt der Analogschalter locker mit mit 
Umschalten, und solange die Temperatur mehr oder weniger konstant ist, 
werden auch die Schaltzeiten konstant bleiben.

von Ingo Less (Gast)


Lesenswert?

Rein aus Interesse: Wofür nutzt du denn das Signal? Du scheinst ja 
erheblichen Aufwand zu treiben, z.B. 1ppm Referenz ;)

von m.n. (Gast)


Lesenswert?

Na gut ;-)

von Tobias P. (hubertus)


Lesenswert?

m.n. schrieb:
> Na gut ;-)

ironisch?

Ingo Less schrieb:
> Rein aus Interesse: Wofür nutzt du denn das Signal? Du scheinst ja
> erheblichen Aufwand zu treiben, z.B. 1ppm Referenz ;)

um einen OCXO damit anzusteuern. Deshalb ist die absolute Genauigkeit 
relativ egal, aber der DAC muss monoton sein und (einigermassen) 
temperaturstabil.

Ich frag mich noch, wie gross der Jitter durch die Interruptlatenz 
maximal sein könnte, dann könnte man evtl. eine Abschätzung machen, wie 
viel Fehler man sich durch die paar ns einfängt.

von m.n. (Gast)


Lesenswert?

Tobias P. schrieb:
> m.n. schrieb:
>> Na gut ;-)
>
> ironisch?

Nein, sondern "noch mal Glück gehabt", bevor es Schimpfe gibt.
Ein gesonderter Analogschalter mit guter Vref und ordentlicher 
AGND-Leitung ist in Ordnung.

Bei einem VCOCXO hast Du lange Einschwingzeiten. Da ist der Jitter egal. 
Alternativ kannst Du auch 16 Bit PWM verwenden, wobei der Compare-Wert 
bei Zwischenwerten umgetastet wird. 3 x Sollwert und 1 x Sollwert - 1 
ergibt dann 1/4 Bit (von 16 Bit) weniger Ausgangsspannung.

von m.n. (Gast)


Lesenswert?

Tobias P. schrieb:
> STM32F407VE

Noch etwas: ein pinkompatibler STM32F427 kann alle Timer mit 180 MHz 
laufen lassen.

von hauspapa (Gast)


Lesenswert?

Mit max 84 MHz auf Timer 3 währen für 18 Bit etwa 300Hz erreichbar.

Lösungsansätze:
Du weist ja vorher  in welchem Timerdurchlauf der Flankenwechsel 
stattfindet. Du lädst den PWM Ausgang in den anderen Fällen mit 0 oder 
max, so das er an oder Aus bleibt. Aufpassen, es kann da Eigenheiten 
geben wann die Register wie geschrieben werden müssen.

Oder du machst 1,2kHz bei 16 Bit? Und erhöhst die Auflösung durch 
Filtern über mehrere Perioden. Charge Injection sollte sich dabei nicht 
schlimmer bemerkbar machen.

viel Erfolg
hauspapa

von Tobias P. (hubertus)


Lesenswert?

m.n. schrieb:
> Bei einem VCOCXO hast Du lange Einschwingzeiten. Da ist der Jitter egal.
> Alternativ kannst Du auch 16 Bit PWM verwenden, wobei der Compare-Wert
> bei Zwischenwerten umgetastet wird. 3 x Sollwert und 1 x Sollwert - 1
> ergibt dann 1/4 Bit (von 16 Bit) weniger Ausgangsspannung.

ja, so ein "Dithering" habe ich mir auch überlegt!
Allerdings bin ich mir nicht sicher, ob das Filter das dann noch gut 
genug filtern kann, denn dieses "überlagerte" Dithering hat dann ja auch 
nur 1/4 der Frequenz und liegt dann somit praktisch im Passband des 
Filters, nicht?

m.n. schrieb:
> "noch mal Glück gehabt"

naja, das war eigentlich schon so geplant, aber was definitiv nicht 
geplant war ist, dass der Timer nur 16 Bits hat. Da habe ich mich 
schlicht im Datenblatt vertan. Der Satz war aber auch irgendwie 
missverständlich geschrieben. Und ich verstehe nicht, wieso man nicht 
die 16 zusätzlichen Flipflops noch investiert hat und den Timer einfach 
konsequent 32 Bits breit macht. :-(

von Squierrel (Gast)


Lesenswert?

Tobias P. schrieb:
> Squierrel schrieb:
>> Man kann auch mit dem Timer einen DMA Triggern, der passende Daten
>> ablegt. Ist allerdings auch nicht Jitter frei ;) und die Frage ob das in
>> einer Bit Band Area liegt wahrscheinlich bei weiteren Pins die auf dem
>> Port verwendet werden essenziell.
>
> das mit dem DMA habe ich mir auch überlegt. Weshalb ist der DMA nicht
> jitterfrei? Bitband wäre möglich.

Stecke gerade nicht so ganz in der Cortex-M Architektur drin (zuletzt 
vor 3 1/2 Jahren, aktuell Aurix davor Cortex-A).

Erwarte, aber Übertragungen auf dem Bus die mehr als einen Zyklus den 
Bus blockieren. Kann aber auch sein das es für die Cortex-M passt bzw. 
zumindest M3/M4. Würde mal mit einem Jitter von einem IO-Bus Takt 
rechnen falls dir das in der Genauigkeit reicht ...

von Bauform B. (bauformb)


Lesenswert?

Squierrel schrieb:
> Man kann auch mit dem Timer einen DMA Triggern, der passende Daten
> ablegt. Ist allerdings auch nicht Jitter frei ;) und die Frage ob das in
> einer Bit Band Area liegt wahrscheinlich bei weiteren Pins die auf dem
> Port verwendet werden essenziell.

DMA mit einem Ziel in der Bit Band Area funktioniert nicht, Bit Banding 
wird in der CPU gemacht. Es ist aber auch nicht nötig, es gibt ja die 
Register GPIOx->BSRR.

von Squierrel (Gast)


Lesenswert?

Bauform B. schrieb:
> Squierrel schrieb:
>> Man kann auch mit dem Timer einen DMA Triggern, der passende Daten
>> ablegt. Ist allerdings auch nicht Jitter frei ;) und die Frage ob das in
>> einer Bit Band Area liegt wahrscheinlich bei weiteren Pins die auf dem
>> Port verwendet werden essenziell.
>
> DMA mit einem Ziel in der Bit Band Area funktioniert nicht, Bit Banding
> wird in der CPU gemacht. Es ist aber auch nicht nötig, es gibt ja die
> Register GPIOx->BSRR.

Kopfklatsch
Da scheint mein Kopf nicht richtig funktioniert zu haben ;). Stimmt es 
ist ganz einfach.

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.