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
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.
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
- 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
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
@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
Sind denn deine ISR so lang, dass das Zählergebnis ungenau wird? Eigentlich sollte man doch die ISR so kurz wie möglich machen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.