ich baue gerade eine kleine Regelung. Dazu nutze ich den Micro. Aus Platzgründen kann ich kein größeres Arduino verwenden.
Ich habe in der Main Loop ein Regelkreis dieser soll etwa alle 20ms (mainFreq = 20(Steckt im delay, siehe Code)) wiederholt werden. Ich nutze dafür micros() am Anfang und am Ende. Bestimme anschließend damit die Rechenzeit. Und über delay() warte ich die überschüssige Zeit ab.
Ich berechne mir mit DELAYGENERATOR() jeweils zwei Timings (2 bis 10ms in etwa). Mit PWMControl() setzte ich dann zwei digitale Pins auf high. Ich schalte damit zwei Aktoren an, die quasi parallel arbeiten. Nun möchte ich direkt nach dem start zwei Timer starten und diese Aktoren wieder nach den Timings ausschalten. Damit realisieren ich quasi eine einfache PWM.
Meine Frage ist: Kann das Micro mir zwei Timer generieren die quasi neben den micros() etc laufen und mir die Aktoren nach ein paar ms, nach dem Start wieder deaktivieren? Ginge das auch mit der internen PWM?
Beim Lesen hab ich "Gensrupfn" bekommen.
So kannst Du das gar nicht.
Delay() MUß vollständig verschwinden. Du darfst nicht mit millis()/micros() die gebrauchte Zeit messen und den Rest dann delay-en. Während der delay()-Zeit kann der Arduino nichts machen.
Du mußt mittels millis()/micros() ermitteln wann die nächste Aktion zu machen ist. Das funktioniert dann auch mit mehreren Aktionen paralell.
if(milis()-startzeit1>intervall1) dann mach Aktion1
if(milis()-startzeit2>intervall2) dann mach Aktion2
if(milis()-startzeit2>intervall2) dann mach Aktion3
Ich häng dir grad mal an, wie ich meine PWM realisiert habe. Damit schalte ich den Ausgang für meine Heizgriffe. Meine Frequenz ist 1Hz (weil die Griffe eh träge sind).
_heaterPower ist dabei der Prozentwert zwischen 0 und 100 und regelt damit die EIN-Zeit der PWM.
runPwm() ist die Hauptmethode und wird im Loop immer gerufen.
Vielleicht hilfts dir ja was. Den zweiten Kanal realisierst du dann, indem du das ganze Konstrukt in eine Klasse schiebst und die Klasse mit nem anderen Pin nochmal instanzierst (und natürlich den Leistungswert anders reingibst).
Uwe es steht doch da. runPwm() wird im loop gerufen, _heatActive ist ne interne Klassenvariable und _heaterPower wird intern berechnet.
Das ganze Sketch ist viel zu viel, da hängt noch viel mehr dran bei mir und verteilt sich auf verschiedene Klassen. Das Relevante für eine PWM ist im geposteten Code komplett enthalten.
Aber gerne zur Vollständigkeit noch den relevanten Rest. calculateTemperatureAndHeat() liest von einem Dallas die Temperatur und berechnet die zugehörige Leistung und setzt somit _heatPower
Ich habe schon etwas programmiert und innerlich auch irgendwie gedacht, dass delay() nicht wirklicht das Wahre sein kann. Viele Anfängertutorials zeigen leider immer auf delay() was man sich dann auch gleich irgendwie aneignet.
Habe mir das Beispiel von agmue angeschaut und genau das gefunden was ich brauche. Die unteren Kommentare bestätigen auch das. Nun habe auch keine delays und die PWM schaut auf den ersten Blick ganz solide aus.