Hallo Leute, ich hab mal wieder das Thema PWM aufgegriffen und habe eine Idee, wie man 18 oder mehr Servo PWMs mit nur einem 16-Bit-Timer mit einer Auflösung von 15 Bit erreichen kann.
Angenommen der µC arbeitet bei 16MHz, dann kann der 16Bit Timer taksynchron maximal 4.096ms darstellen. Also kann man auch einen ganzen Puls (max. 2.5ms) vorladen, starten und beim Überlauf beenden.
wenn man jedoch 18 signale gleichzeitig erzeugen will, so startet man alle PWM gleichzeitig, lädt den timer mit der gerigsten PWM dauer vor und wenn der überläuft,dann wird der kürzeste PWMbeendet, der Timer mit einer differenzzeit bis zum nächsten zu beendenden Impuls vorgeladen und so weiter.
also wenn in einem Array x[18] die pulsdauern liegen, so muss man diese zunächst sortieren in s[18] und die reihenfolge der indizes liegt in i[18]. also der kleinste wert von x[] steht in s[0] und in i[] steht der index des kleinsten Wertes aus x[]. nun werden in t[18] die benötigten Zeitdifferenzen berechnet. also t[0]=s[0], t[1]=s[1]-s[0], t[2]=s[2]-s[3]...
jetzt werden alle ausgänge auf high gesetzt,k=0, der 16Bit-Timer mit 2^16-t[k] vorgeladen, und beim überlauf wird k erhöht, der timer neu vorgeladen und stop(i[k]) wird aufgerufen. stop[n] beendet mittels einer case(n) struktur den entsprechenden Ausgang.
Was haltet ihr von der Idee? man könnte natürlich für sehr kleine zeitdifferenzen gleich den nächsten impuls beenden, da die berechnungen wahrscheinlich länger brauchen als die differenzzeit andauert. Außerdem muss natürlich noch eine minimale korrekturzeit für die unterbrechung des ISR von den Zeitdifferenzen abgezogen werden.
Aber sonst sollte es so möglich sein die relevanten 1,5ms mit mehr als 14 Bit aufzulösen, was für mich eine erhebliche steigerung wäre. momentan habe ich eine auflösung von ungefähr 200 schritten
Bin offen für Kritik und anregungen...
mfg WarChild[/flash]
Lesezeichen