Wie erzeugt man ein software PWM-Signal am Bessten?

OP #310941
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
Gast #310943
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
Gast #310944
- 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
Gast #310945
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
Angehängte Dateien:
OP #310946
@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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.