Go Down

Topic: Umsetzung Potistellung zu PWM Werten, erbitte Hilfe (Read 1 time) previous topic - next topic

JuergenR

Hallo,

oder einfach 2mal nach rechts schieben (einmal schieben teilt durch 2).

Grüße,
Jürgen

stringwalker

Hallo,
erst einmal herzlichen Dank an alle, die sich hier um mein Anfängerproblem kümmern! Für die Umsetzung eurer Hilfen brauche ich aber noch ein  bisschen mehr Zeit und Durchblick.

Helmuth, zu deinem Nachtrag:

Nein, ich will  k e i n  lineares Potiwinkel-PWM Wert-Verhältnis erhalten.
Ich will eine individuelle PWM Ausgabe erreichen, die jedem Potiwinkel (bzw. mehreren Winkelbereichen) einen von mir vorgegebenen PWM Wert zuordnet. Als Analogelektroniker würde ich sagen: Ein Poti mit einer verbogenen und alles anderen als linearen Kennlinie.

Zum Beispiel:
Eingangswerte 550-700 bekommen PWM Wert 50, 701-720 bekommen Wert 250, 850 bekommt 600 etc.(das sind jetzt nur fiktive Werte zur Veranschaulichung).

Mit dem map Befehl habe ich mich inzwischen befasst, mir scheint aber, er regelt eher die lineare Verteilung der 1024 Eingangswerte des ADC auf die unterschiedlichen Gegebenheiten von Ausgabeobjekten wie LEDs, Servos u.a.

Könnte ich ihn denn auch für meine Anforderungen einsetzen?

Grüße stringwalker

JuergenR

Hallo,

das könntest mit:

if (poti < 250)
{

}
else if (....

usw.

lösen

mkl0815


Nein, ich will  k e i n  lineares Potiwinkel-PWM Wert-Verhältnis erhalten.
Ich will eine individuelle PWM Ausgabe erreichen, die jedem Potiwinkel (bzw. mehreren Winkelbereichen) einen von mir vorgegebenen PWM Wert zuordnet. Als Analogelektroniker würde ich sagen: Ein Poti mit einer verbogenen und alles anderen als linearen Kennlinie.

Zum Beispiel:
Eingangswerte 550-700 bekommen PWM Wert 50, 701-720 bekommen Wert 250, 850 bekommt 600 etc.(das sind jetzt nur fiktive Werte zur Veranschaulichung).

Sind denn die Winkelbereiche alle gleich gross und ist das Poti ein lineares?
Falls ja, kannst DU vermutlich die map() Funktion verwenden.
Sagen wir mal Du willst 8 "Schaltzustände" abbilden, dann mappe einfach die Werte 0 bis 1023 auf 0 bis 7 ( int state = map(analogRead(A0),0,1023,0,7); )
Die dabei rauskommenden Werte von 0 bis 7 kannst Du dann z.B. als Index für ein Array verwenden, indem die PWM-Werte stehen.
Oder falls Du mehrere Dinge anhand des Schaltzustandes machen willst:
Code: [Select]

#define POTI A0
int state = map(analogRead(POTI),0,1023,0,7);

switch(state) {
  case 0:
               //hier alle Befehle für Zustand 0
               break;
  case 1:
               //hier alle Befehle für Zustand 1
               break;
  case 2:
               //hier alle Befehle für Zustand 2
               break;
...
  case 7:
               //hier alle Befehle für Zustand 0
               break;
}

Aufpassen musst Du allerdings an den Übergangsstellen von einem Wert zum anderen. Bei ungünstiger Position des Potis springt der Wert zwischen zwei Zuständen hin und her. Das Problem hatte ich bei meiner Lavalampe auch.

stringwalker

Danke, mkl0815, ich denke, du hast genau erkannt, worum es mir geht.

Die Switch/Case Lösung ist erst einmal durch ihre klare Struktur für mich leichter zu verstehen, und da ich zwei LEDs unterschiedlich mit dem Poti ansteuern will, vielleicht auch die richtige.

Die Lösung mit den Arrays hört sich natürlich schon sehr elegant an, ich fürchte aber, ich könnte sie mit meinem derzeitigen Wissen noch nicht umsetzen. damit befasse ich mich aber unbedingt noch.

Zu deiner Frage nach dem Poti und den Winkelbereichen:

Das Poti wird ein lineares sein, wäre aber im Prinzip auch egal, ich biege mir ja softwaremäßig ohnehin eine eigene Kennlinie zurecht. Ich will 64 Winkelbereiche haben, d.h. jeweils 16 Eingangswerte bekämen gleiche PWM Werte.

Ich hoffe, dass aufgrund dieser hohen Auflösung in Verbindung mit einem guten Poti das Springen zwischen zwei Zuständen nicht so störend sein wird.

Hier auch noch danke an JürgenR für die Idee mit if/ else Lösung.

Ein Anfänger sieht Land !  :)


Grüße stringwalker



Go Up