Forum: Mikrocontroller und Digitale Elektronik Wie erzeugt man ein software PWM-Signal am Bessten?


von Sepp -. (sepp_o)


Lesenswert?

Salve

Ich stelle mir gerade die Frage wie ich das Software PWM-Signal zur
Ansteuerung eines Modellbauservos am Besten erzeugen soll.

Ich habe mir mehrere Lösungen überlegt.

Welche davon ist eigentlich die Beste?

Methode 1:
Man aktiviert den Überlaufevent und trimmt durch Startwertvorgabe
darauf dass der Überlaufinterrupt in fixen Zeitintervallen auftritt
welche für die benötigten low bzw highzeiten mitgezählt werden.


Methode 2:
Man verwendet 2 unterschiedliche Vorteiler für das Stoppen der High-
und lowzeiten und schaltet dabei bei jedem Timer-Event den Pegel um.

Methode 3:
Diese Methode ist sicher die Schlechteste:
Man fängt das Hauptprogramm in der Hauptschleife für die jeweiligen
Zeitintervalle in einer Schleife ein und beschränkt sich mit den
Aufgaben in der Hauptschleife auf das Erzeugen des PWM-Signals.

Kann man die Lowzeit dauernd bei 18,5ms lassen und verändert nur die
High-Zeit oder sollte man nicht darauf vertrauen dass bei dem Servo die
Tolaranz groß genug ist und die Lowzeit auch variabel gestalten und sie
an die Highzeit anpassen?

mfg Sepp

von Wolfram (Gast)


Lesenswert?

Methode 4:
man verwendet das Output Compare register und lädt im Interrupt jeweils
den nächsten Wert. z.B. 1,5ms ;18,5 ms jeweils skaliert.

von Jens D. (Gast)


Lesenswert?

Du laesst den Timer bis zum Overflow laufen, dann setzt du deinen pin
beim interrupt auf Low.
Dann setzt du einen Compare wert, wo du in einen intrrupt ausloesen
laesst und setzt den pin auf High

von Umwandler (Gast)


Lesenswert?

- Timer Interrupt initialisieren (entspricht der PWM Frequenz)
- in Hauptscheilfe einen Zähler erhöhen
- Zähler mit pwm_var vergleichen (entspricht Einschaltdauer des PWM)
- Zähler < pwm_var -> Pin Low
- Zähler > pwm_var -> Pin High
- in der ISR  zähler = 0 setzen

von Berni F. (Gast)


Angehängte Dateien:

Lesenswert?

Man aktiviert den Überlaufevent und trimmt durch Startwertvorgabe
darauf dass der Überlaufinterrupt in fixen Zeitintervallen auftritt
welche für die benötigten low bzw highzeiten mitgezählt werden.
Siehe Anhang! ---> Selbsterklärend

von Sepp -. (sepp_o)


Lesenswert?

@Berni F.
Was soll dass mit dem Anhang wieder sein?

Was willst du mit dem Kopieren von Ausschnitten meines Beitrages
sagen?

@Umwandler
Einen Zähler in der Hauptschleife ist nicht wirklich machbar, da die
Hauptschleife durch alle Interrupts unterbrochen wird und somit der
Zählwert nur ein grober Schätzwert ist.

@Wolfram
Danke für den Hinweis.
Daran habe ich garnicht gedacht.
(Manchmal sieht man den Wald vor lauter Bäumen nicht und denkt um 10
Ecken bevor man auf die einfachste Lösung aufmerksam gemacht wird.)

Das ist wirklich gut und erspart mir einige Zeile Code.

Das ist sicherlich die schnellsete und platzsparendste Lösung für diese
Anwendung.

mfg Sepp

von Umwandler (Gast)


Lesenswert?

Sind denn deine ISR so lang, dass das Zählergebnis ungenau wird?
Eigentlich sollte man doch die ISR so kurz wie möglich machen.

von Sepp -O- (Sepp_O) (Gast)


Lesenswert?

Leider geht's nicht anders.

Ich werd's mit Compare machen.

mfg Sepp

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.