Warum sollte ich PWM nicht brute-forcen?

Also habe ich mit einem ATtiny45 gespielt, und es fällt mir ein, dass ich PWM wahrscheinlich brutal erzwingen könnte, indem ich einen Timer auf sysclock / 64 vorskaliere und dann ISR-Code ausführe, der die Ausgänge abhängig von den an anderer Stelle festgelegten globalen Variablen manuell ein- oder ausschaltet Code oder über IO. Bei einer maximalen Sysclock-Geschwindigkeit von 20 MHz sollte ich eine anständige Auflösung erhalten, und ich werde alle meine IO-Pins als PWMs verwenden können, anstatt der beiden, die der Chip bereitstellt, also ist die große Frage ... warum nicht? Abgesehen davon, dass viele Sysclock-Zyklen verbraucht werden, sehe ich keine wirklichen Nachteile ... könnte mir jemand welche geben?

Ich habe das einmal versucht (aber mit einem anderen Controller). In der Praxis bekommt man keinen sauberen Puls. Stattdessen variiert es abhängig von Ihrer Taktzykluszeit und verlangsamt sich, wenn Ihr Controller mit etwas anderem beschäftigt ist.
es fühlt sich auch hässlich an - es braucht sehr wenig Hardware für einen einzelnen PWM-Kanal - es kann buchstäblich ein rücksetzbarer Binärzähler sein, der xored und in ein Register genored wird, plus eine Taktteilungslogik und möglicherweise auch ein ähnliches Setup für den Aus-Impuls. Bit-Banging leidet unter inkonsistentem und schwer genau vorhersagbarem Timing sowie (relativ) intensiver Ressourcennutzung - Codeausführung, Interrupt-Kanäle, Systemuhren (die möglicherweise mehr Funktionen als PWM-Uhren haben) - alles für eine so einfache Funktion. Warum brauchst du mehr Kanäle? es gibt vielleicht einen billigeren Weg.
Bietet der ATtinyX5 nicht 3 Ausgangskomparatoren, OC0A, OC0B/OC1A (gemeinsam auf PB1), OC1B?

Antworten (6)

Die drei Nachteile sind der Stromverbrauch, das Binden eines Timers und das Unterbrechen anderer Codes. Wenn Sie sich nicht um Energiesparmodi kümmern und keinen Timer benötigen und keinen kritischen Code haben, der einige Taktzyklen nicht aushält, um den Interrupt zu bedienen, gibt es keinen Nachteil. Einige Projekte sind ziemlich einfach und nehmen nicht ein Zehntel der Leistung des Mikrocontrollers in Anspruch. Lassen Sie sich also von niemandem sagen, dass Sie es falsch machen, indem Sie die Timer so ausnutzen. Software-PWM ist in Ordnung, wenn es Ihren Anforderungen entspricht.

Mit Stromverbrauch meinen Sie, dass eine Zeitschaltuhr mit ISR mehr Energie verbraucht als eine reine Softwarelösung, oder? Ein Timer mit ISR sollte ungefähr den gleichen Stromverbrauch haben wie die Verwendung der dedizierten PWM-Hardware.
@MathEE Wenn die CPU keine Anweisungen ausführt, können Sie sie anweisen, in einen Energiesparmodus zu wechseln. Dies bedeutet, dass das Gerät für eine bestimmte Zeit viel weniger Strom verbraucht. Für einige Schlafmodi läuft die zeitgesteuerte PWM weiter, aber natürlich nicht die Bit-Bang-PWM. Unterbrechungen sind eine gängige Methode, um den Schlafmodus zu verlassen.
@jippie Ja, ich verstehe, dass man Interrupts verwenden kann, um aus dem Schlafmodus herauszukommen, um Strom zu sparen - ein Vorteil. Ich habe versucht, den Kommentar des Passanten zu verstehen, dass der Stromverbrauch ein Nachteil ist. Ich bin mir sicher, dass Passerby etwas im Sinn hatte, aber mir ist nicht klar, dass PWM-Hardware weniger Strom verbrauchen würde als ein Zähler in Kombination mit ISR. Schließlich ist das PWM-Modul nur ein Zähler mit zusätzlicher Hardware.
@MathEE Wenn Sie Hardware-/Timer-PWM verwenden, benötigen Sie die CPU nicht und können sie in den Ruhezustand versetzen. Das würde ordentlich Strom sparen. Er geht davon aus, dass die CPU bei Verwendung von zeitgesteuerter PWM im Leerlauf ist (und daher in den Ruhezustand versetzt werden kann), anstatt die Befehlszyklen zu zählen, wenn Bit-Bang-PWM ausgeführt wird.
Ein Interrupt bringt den Mikrocontroller aus einem Low-Power-Modus, um den Code zu bedienen. Ein Hardware-PWM-Modul kann alles viel effizienter handhaben, ohne den Chip aus LPM herauszuholen. Wenn der MCU hauptsächlich für PWM mit gelegentlicher Benutzerinteraktion verwendet wird, ist dies ein großer Einfluss auf den Stromverbrauch.
PWM bindet auf vielen Plattformen einen Timer
Die Verwendung einer Software-PWM kann auch den Stromverbrauch erhöhen, da die CPU mit einer schnelleren Taktgeschwindigkeit betrieben werden muss, als dies sonst erforderlich wäre.
Denken Sie daran, dass all dieses Gerede über "Energiesparen" irrelevant ist, wenn Sie nur eine einzelne LED schwach beleuchten.
@nickt Im Gegenteil, diese Niedrigstromanwendungen wie das Dimmen einer einzelnen LED profitieren am meisten von der Energieeinsparung. Wenn Ihr Ziel 3 mAh ist, sind 2 mAh Durchschnitt durch ständiges Aufwecken der MCU ein großer Erfolg. Andererseits ist ein 2-mAh-Hit bei einer 500-mA-Motor-PWM-Anwendung winzig.
@Passerby, du klingst widersprüchlich. In diesem Sinne kann die MCU also nicht schlafen, wenn die Timer noch laufen. Das Beste, was es tun kann, ist, in den Leerlaufmodus zu wechseln, was beim ATtiny etwa 3,8 mA spart (aber wenn Sie sich wirklich um Strom kümmern würden, würden Sie mit 1,8 V laufen, in diesem Fall spart es nur 0,2 mA), also wenn Sie ' Wenn Sie eine einzelne diskrete LED unbekümmert mit "schwachen" 2 mA betreiben, würde ich argumentieren, dass Ihre Einsparungen zwar "statistisch signifikant" sind, aber aus technischer Sicht irrelevant sind.
@nickt, deiner falschen Annahme nicht zuzustimmen, ist kein Widerspruch.

Ich habe erst kürzlich mit vielen PWM-Schaltnetzteilen herumgespielt, und Sie haben Recht, es gibt durchaus berechtigte Gründe, pulsweitenmodulierte Signale zu "bitbangen". Aber einer der Hauptfehler dieser Methode ist, wenn Sie eine sofortige Rückkopplungssteuerung des erzeugten Tastverhältnisses benötigen.

Selbst bei einem 20-MHz-Onboard-Takt beträgt die Zykluszeit 50 Nanosekunden. Rechnerisch müssten Sie das überwachte Signal erfassen, es vom Referenzpegel subtrahieren und dann die Generierung des Arbeitszyklus fortsetzen. Dies erzeugt "Jitter", wenn das Tastverhältnis inkonsistent ist. Die Verwendung eines Onboard-DAC ist nicht ausgeschlossen, aber es frisst Zyklen auf. Um dies zu reduzieren, könnten Sie einen externen DAC hinzufügen, aber dann haben Sie vielleicht 8 oder 12 Pins vom Mikrocontroller zum externen DAC für ein schnelles Lesen zugewiesen (je nachdem, wie viel Auflösung Sie möchten). Dann müssen Sie sich um zusätzliche Signallaufzeiten durch Schaltkomponenten kümmern.

Wenn Sie eine schnelle Rückkopplungssteuerung wünschen, ist ein unabhängiger Arbeitszyklus-IC kaum zu übertreffen. Die Verzögerung des eingebauten Fehlerverstärkers ist so gering, dass Sie sich mehr Sorgen um die Verstärkungsänderung bei hohen Frequenzen machen. Die Signalausbreitung durch Schalten ist natürlich immer noch das gleiche Risiko und muss umgestaltet werden.

Es ist auch erwähnenswert, dass viele PWM-IC-Pakete Abschaltfunktionen und Totzeit-Steuereingänge haben, die wirklich raffinierte Dinge tun können, wenn sie mit einem Mikrocontroller gekoppelt sind, alles auf einem 8- oder 16-Pin-Paket.

Es liegt so ziemlich an Ihnen, zu entscheiden, ob die Bit-Bang-Methode Ihre Bedürfnisse unterstützen kann. Sie können die Frequenz tatsächlich ziemlich hoch bekommen, wenn Sie einen niedrigeren Prescaler verwenden. Der Arbeitszyklus, den Sie erhalten, zeigt Quantisierungsfehler, aber das ist möglicherweise nicht einmal eine große Sache, je nachdem, was Sie tun und wie hoch Sie die Auflösung nehmen. Andererseits geht eine höhere Auflösung auf Kosten einer niedrigeren Frequenz. Wenn Sie keine sofortige Rückkopplungssteuerung benötigen und Ihre Anwendung mit Jitter umgehen kann, ist Bit-Banging möglicherweise der richtige Weg.

Der Zweck von Hardwaregeräten auf dem Chip besteht darin, den Prozessor für andere Aufgaben freizugeben. Wenn Sie PWM-Hardware verwenden, können Sie gleichzeitig andere Mikrocontroller-Aufgaben ausführen.

Ich denke, Sie haben dieses Bit aufgegriffen, weil Sie nach der Verwendung eines ISR fragen, anstatt einen Brute-Force-Zähler für die for/while-Schleife auszuführen, aber auch hier ist es die gleiche Antwort. Wenn wir die Breite des Pulses nicht ändern, warum sollten wir dann unsere anderen Aufgaben unnötig unterbrechen?

Weil wir mehr als 3 PWM-Kanäle wollen, ohne die Stückliste zu ergänzen.
@Ignacio Vielleicht verstehe ich die Frage falsch, aber ich habe sie gelesen, als das OP PWM brutal erzwingen wollte und dann als Bonus mehr PWM-Kanäle erhält. Sie haben Recht, wenn das OP dies tun möchte, weil es mehr Kanäle benötigt.

Sie können leicht tun, was Sie sagen – ich habe es ein paar Mal getan. Es ist nützlicher, wenn Sie Ihre PWM zu vorhersehbaren Zeiten ändern möchten. Sie können dies tun, indem Sie die Anzahl der PWM-Zyklen zählen, und dazu benötigen Sie sowieso einen Timer.

Es gibt jedoch einen Kompromiss zwischen der Auflösung der PWM / Anzahl der Ausgänge und der Menge an freier Prozessorzeit. Sie werden einen Punkt erreichen, an dem Sie nicht mehr genügend freie CPU haben, damit es funktioniert.

Ich empfehle, ein Zielfernrohr an einen freien Stift anzuschließen und diesen Stift dann am Anfang der ISR hoch und am Ende niedrig einzustellen. Dadurch können Sie den Anteil der Zeit sehen, den Ihre Routine verwendet.

Software-PWM muss nicht sehr CPU-intensiv sein, wenn es richtig gemacht wird, wie bei der Verwendung von Binärcode-Modulation . Mit dieser netten und einfachen Technik können Sie viele SoftPWM-Kanäle ohne großen CPU-Overhead haben.

Minor nit: PWM bezieht sich auf einige bestimmte Modulationsschemata, bei denen ein konstanter Ausgangspegel durch eine Impulswelle mit einem bestimmten Arbeitszyklus dargestellt wird und die Frequenz der Welle unabhängig von dem dargestellten Pegel ist; die Schemata unterscheiden sich nur darin, wie Änderungen des Ausgangspegels dargestellt werden. Die Binärcodemodulation ist ein Mitglied einer allgemeineren Klasse von Arbeitszyklusmodulationsschemata .
Die verknüpfte Implementierung der Binärcodemodulation hat den Nachteil, dass ein Ausgang, dessen Wert sich von 127 auf 128 ändert, für 255 aufeinanderfolgende Impulse niedrig ist, und einer, dessen Wert sich von 128 auf 127 ändert, für 255 aufeinanderfolgende Zyklen hoch ist. Wenn das gesteuerte Gerät ein ungleichmäßiges Ein-/Ausschaltverhalten aufweist, verhält sich PWM über den größten Teil seines Bereichs linear, während BCM dies nicht tut. Einige Variationen von BCM können nützlich sein, aber ihre Grenzen müssen oft erkannt und behandelt werden.
Obwohl Sie gut bemerkt haben, dass BCM keine Lösung für alles ist, wird es mit den meisten Geräten recht gut und mit sehr geringer CPU-Auslastung fertig. Am gebräuchlichsten wird wahrscheinlich das Dimmen von LEDs sein. Wenn in diesem Fall Helligkeitslinearität benötigt wird, benötigen sowohl PWM als auch BCM eine Korrekturtabelle.
Ich habe Variationen von BCM für LEDs verwendet, und sie sind für feste Pegel in Ordnung, aber der angegebene Ansatz flackert stark, wenn die Helligkeitsstufe zwischen 127 und 128 wechselt. Ein alternativer Ansatz für 256-Pegel-PWM ist ein Interrupt-Lauf B. einmal alle 256 Zyklen, und lassen Sie bei jedem Interrupt die LEDs zweimal im Abstand von 16 Zyklen schreiben. Schreiben Sie bei der Hälfte der Zyklen (abwechselnd) Bit 3 und dann Bit 7. Schreiben Sie bei der Hälfte des Rests Bit 2 und dann 6 usw. Schreiben Sie bei 1/16 einfach Null und führen Sie die andere Verarbeitung durch.

Persönlich habe ich festgestellt, dass die Timer-PWMs schneller und konsistenter sind (im vollen 256-Bereich, wenn Sie eine solche Auflösung nicht benötigen, kann Software ["Brute-Force"] schneller sein) und wenn ich mehr als 2 I benötigt habe Ich habe Soft-PWMing neben den harten PWMs ausprobiert und es war nicht sehr flüssig, also habe ich mich dafür entschieden, das gesamte PWM in Software zu machen, und es hat sich als großartig herausgestellt.
Das einzige, was etwas Zeit in Anspruch nimmt, wenn Berechnungen/Verarbeitungen/Unterbrechungen durchgeführt und zwischengeschaltet werden, bleibt die weiche PWM stehen und kann sehr auffällig sein.