Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage C-Programmierung


von Franz Josef (Gast)


Lesenswert?

Guten Tag allerseits,

ich wende mich mit einer wahrscheinlich simplen, aber für mich nicht 
ganz einleuchtenden Frage an Euch:

Und zwar bin ich dran, eine PWM-Anwendung zu programmieren, welche ich 
softwaremäßig im Maximalstrom limitieren kann.

Genauer: Die PWM-Auflösung beträgt 0 bis 255, d.h. 255 entsprechen 100% 
des Stroms. Der Wert kommt seriell über ein DMX-Pult. Um den maximalen 
Strom jedoch anwendungsspezifisch in der Höhe limitieren zu können, 
möchte ich einfach den Wert 0 bis 255 verändern. Meine Vorstellung wäre, 
dass das Pult immer 0 bis 255 sendet, wenn ich den Strom jedoch auf 
maximal 50% limitieren will, nach der Berechnung nur noch 0 bis 127 an 
den PWM-Ausgang gelangt.

Danke im Voraus

F.J.

von Oliver (Gast)


Lesenswert?

1
if (inputPWM > pwmMax)
2
   inputPWM = pwmMax;

macht das, was du beschrieben hast. Das wusstest du aber vermutlich 
selber. Also: Was ist die Frage?

Oliver

von R. W. (quakeman)


Lesenswert?

Franz Josef wrote:
> Genauer: Die PWM-Auflösung beträgt 0 bis 255, d.h. 255 entsprechen 100%
> des Stroms. Der Wert kommt seriell über ein DMX-Pult. Um den maximalen
> Strom jedoch anwendungsspezifisch in der Höhe limitieren zu können,
> möchte ich einfach den Wert 0 bis 255 verändern. Meine Vorstellung wäre,
> dass das Pult immer 0 bis 255 sendet, wenn ich den Strom jedoch auf
> maximal 50% limitieren will, nach der Berechnung nur noch 0 bis 127 an
> den PWM-Ausgang gelangt.

Wenn ich das richtig verstanden habe willst du den ankommenden Wert neu 
skalieren, so daß der Eingangswert z.B. halbiert wird bei 50%?

Dann brauchst du den ankommenden Wert (0-255) einfach nur durch 2 zu 
teilen. Oder wenn du in % arbeiten willst eben teiler=100/prozent und 
neu=alt/teiler. Diese Variante funktioniert mit 8Bit Ganzzahlen 
natürlich immer nur mit Rundungsfehler. Wenn du mit Fließkommazahlen 
arbeiten willst kannst du auch direkt neu=alt*prozent/100 rechnen. Aber 
Fließkommazahlen sind immer sehr rechenaufwendig und brauchen viel Code.

Oder willst du den ankommenden Wert einfach nur bei 50% abschneiden?

Dann kannst du die eben schon erwähnte Variante benutzen.

Ciao,
     Rainer

von Michael U. (amiga)


Lesenswert?

Hallo,

die Version, den Maximalwert zu scalieren, ging auch noch.
nimm den kommenden Wert 0...255 (wert).
Nimm die maximalen Strom 0...255 (strom).

Nimm (strom * wert) / 256.
Ist in ASM ein mul mit 2 Takten und ein mov aus r1, sollte auch in C 
schnell genug sein.

Gruß aus Berlin
Michael

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.