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
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...
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 ...
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.
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!
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
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....
Entweder kannst du mit ner Timerkaskade was softwareseitig retten oder du musst mit Fädeldraht einen Workaround kontruieren
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?
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...
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.
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.
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...
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! ;-)
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.
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.
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.
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.
Rein aus Interesse: Wofür nutzt du denn das Signal? Du scheinst ja erheblichen Aufwand zu treiben, z.B. 1ppm Referenz ;)
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.
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.
Tobias P. schrieb: > STM32F407VE Noch etwas: ein pinkompatibler STM32F427 kann alle Timer mit 180 MHz laufen lassen.
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
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. :-(
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 ...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.