Verständnisfrage C-Programmierung

Gast #1198757
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.
Gast
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
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
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.