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?
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.
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?
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.
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.
Ignacio Vazquez-Abrams
scordova88
Benutzer3125280
Nick T