LED Strip mit Poti steuern

Gast #4827839
Lesenswert?

Hallo hallo,
ich habe mir heute für meinen Led Strip (12V - GRB) eine Steuerung 
gebaut.
Ich habe einfach 3 Potis parallel geschaltet und dann die Spannung im 
ADC eingelesen. (Nutze Arduino Mega 2560) Die LEDs steuere ich normal 
über Transistoren an...

Jetzt passiert aber was komisches. Ich habe mir einfach mal die Werte 
des ADCs ausgeben lassen. Wenn ich am 1. Poti drehe passiert alles 
normal. Der Strip wird langsam grün...

Wenn ich jetzt aber am 2. oder 3. Poti drehe, leuchten die anderen 
Farben auch(aber nur sehr schwach, aber die Farbe ist nicht mehr 
rein...). Also ich drehe am 2. Poti und es wird rosa oder so was aber 
halt nicht rein Rot.

Die Seriele Ausgabe zeigt das auch an(also das Spannung an den anderen 
Potis abfällt, aber nur sehr schwach).

Hier ein Beispiel:
3.74 - 218.36 - 3.99 oder
16.70 - 16.70 - 254.25

Der Wert von 0 - 1023 wurde schon auf 0 - 256 skaliert.

Aber wie man sieht sind Grün und Blau auch ganz leicht an, obwohl die 
anderen beiden Potis jeweils komplett "aus" sind.
Wie kann das sein und was kann ich machen? Wie gesagt ich habe die Potis 
parallel geschaltet.

Liebe Grüße
Gast #4827845
Lesenswert?

Jau Bild ist der Schaltplan ich hoffe das ist okay so?!?!?

Code:
----------------------------------------------------------------------

int analogPinRed = 0;     // potentiometer wiper (middle terminal) 
connected to analog pin 3
int analogPinBlue = 1;     // potentiometer wiper (middle terminal) 
connected to analog pin 3
int analogPinGreen = 2;     // potentiometer wiper (middle terminal) 
connected to analog pin 3

                       // outside leads to ground and +5V

int val = 0;           // variable to store the value read

float red = 0.0;
float blue = 0.0;
float green = 0.0;

#define REDPIN 3
#define GREENPIN 4
#define BLUEPIN 5

void setup()

{
Serial.begin(9600);
    pinMode(REDPIN, OUTPUT);
  pinMode(GREENPIN, OUTPUT);
  pinMode(BLUEPIN, OUTPUT);

}



void loop()

{

  red = 255 * ((float)(analogRead(analogPinRed))/1023);
  blue = 255 * ((float)(analogRead(analogPinBlue))/1023);
  green = 255 * ((float)(analogRead(analogPinGreen))/1023);

  analogWrite(REDPIN, (int)red);
  analogWrite(BLUEPIN, (int)blue);
  analogWrite(GREENPIN, (int)green);

  Serial.print(red);
  Serial.print(" - ");

  Serial.print(blue);
  Serial.print(" - ");

  Serial.print(green);


  Serial.println("");


}


----------------------------------------------------------------------

Danke im vorraus
Angehängte Dateien:
Gast #4827913
Lesenswert?

Nebenbei:

0 bis 1023 sind 1024 verschiedene Zustände, deshalb durch 1024 teilen.
Aus selben Grund mit 256 multiplizieren.

Dann ist die Umrechnung mathematisch richtig, und als Nebeneffekt ohne 
float in wenigen Taktzyklen berechenbar.

Zu deinem Problem:

Versuch Mal kleine Kondensatoren an den Analogeingängen gegen GND.
Gast #4827940
Lesenswert?

PNPs sind hier ungünstig.
Fließt kaum Strom durch die LEDs fällt nur sehr wenig Spannung darüber 
ab.
Am Emitter liegen somit über 5,7V was dazu führt das der Arduino mit 5V 
Pegeln den PNP nicht zum sperren bringt.

Das Problem müsste aber bei Rot am größten sein.
Wechsel mal auf NPN und beobachte ob das bereits Dein Problem löst.

Warum überhaupt erst den rechenintensivsten Datentyp float nehmen um den 
dann wieder irgendwie auf INT runterzubrechen ?

Der ADC wirft dir INT raus, der PWM erwartet INT also warum so 
kompliziert ?
Gast #4827947
Lesenswert?

Peter schrieb:
> Hi.
> Guck mal hier:
> https://www.arduino.cc/en/Reference/AnalogWrite
>
> Da steht unter "Notes and Known Issues", dass der Pin 5 bei kleinen duty
> cycles nicht komplett abschaltet. Ob das jetzt für deinen Arduino auch
> zutrifft weiß ich nicht, aber vielleicht ist das auch ein Grund.
Das Problem haben die Arduino Maker erkannt.
analogWrite(xxx,0) schaltet PWM ab und setzt den Pin dauerhaft auf 0.
Zumindest für Timer 1 und 2 funktioniert das perfekt.

XxbOoNx98 schrieb:
> red = 255 * ((float)(analogRead(analogPinRed))/1023);
Arduino kennt die Funktion map(). Die wurde für diesen Zweck entworfen.
#4828172
Lesenswert?

Zerstörungsgefahr!

Du kannst diese Schaltung so nicht mir PNP aufbauen. So wie Du es gemalt 
hast lassen sich die LEDs im ungünstigsten Fall gar nicht komplett 
abschalten, im abgeschalteten Zustand fließt ein Strom durch die 
Body-Dioden des µC und kann im ungünstigsten Fall auch noch dessen 
Spannungsversorgung anheben (je nach Größe der Widerstände) und 
schlimmstenfalls den µC zerstören.

Low-Side Schalter baut man mit NPN!
(Firma: matzetronics) #4828335
Lesenswert?

Es ist ein bekanntes Problem, das zu hochohmige ADC Quellen an z.B. 
Kanal 1 'mitgezogen' werden von z.B. Kanal 0 oder Kanal 2. Das Problem 
löst man am besten mit niederohmigen Quellen oder langsamerer Abtastrate 
oder mit den o.a. Kondensatoren vom Kanaleingang gegen Masse.
Der Sample&Hold Kondensator nach dem Multiplexer wird beim Umschalten 
auf den nächsten Kanal in diesen entladen und zieht ihn deswegen mit.
Gast #4828368
Lesenswert?

Matthias S. schrieb:
> Es ist ein bekanntes Problem, das zu hochohmige ADC Quellen an
> z.B.
> Kanal 1 'mitgezogen' werden von z.B. Kanal 0 oder Kanal 2. Das Problem
> löst man am besten mit niederohmigen Quellen oder langsamerer Abtastrate
> oder mit den o.a. Kondensatoren vom Kanaleingang gegen Masse.
> Der Sample&Hold Kondensator nach dem Multiplexer wird beim Umschalten
> auf den nächsten Kanal in diesen entladen und zieht ihn deswegen mit.

Das scheint mir bis jetzt als hilfreiche Antwort. Ich werde als erstes 
mal versuchen die Taktfrequenz vom Multiplexer zu minimieren. Da ich 
nehmlich keine Zeitkritische Anwendung habe ist das kein Problem.

Wenn das nicht geht!? Wie viel kapazität sollten die Kondensatoren 
haben?

Liebe Grüße
Gast #4828375
Lesenswert?

B. B. schrieb:
> XxbOoNx98 schrieb:
>> red = 255 * ((float)(analogRead(analogPinRed))/1023);
>
> Was ist den gegen
> red = analogRead(analogPinRed)/4);

Ja das stimmt! Bzw. wie ein anderer User bereits geschrieben hat müsste 
es auch eine 256 sein und der cast in float macht natürlich keinen Sinn, 
da der PWMc sowieso ein int bekommt.

Allerdings habe ich das nur gemacht da ich angst hatte das der 
Controller keine Ganzzahldivision schlau von alleine rechnen kann...

aber ich werde dann im Code das ändern zu:
red = analogRead(analogPinRed)/4);
blue = analogRead(analogPinBlue)/4);
green = analogRead(analogPinGreen)/4);

Obwohl 256/1023 nicht ganz 1/4 sind!

Oder aber ich nutze map() wie auch jemand hier meinte:
red = map(analogRead(analogPinRed), 0, 1023, 0, 255);
blue = map(analogRead(analogPinBlue), 0, 1023, 0, 255);
green = map(analogRead(analogPinGreen), 0, 1023, 0, 255);

Liebe Grüße
#4828634
Lesenswert?

XxbOoNx98 schrieb:
> Hab jetzt auch versucht an den ADC Inputs 22nF Kondensatoren gegen Masse
> zu schalten jedoch auch ohne ohne Erfolg!
>
> Vielleicht jemand eine Idee?

Dann sind die Potis falsch angeschlossen. Kontrolliere das nochmal genau 
(fehlende Masse irgendwo?)

Messe auch mal mit dem Voltmeter an den Schleifern der Potis.

Ändere die Software und werte nur noch ein Poti aus ohne den Muxer 
umzuschalten, stelle sicher daß das geht. Dann das selbe mit nur dem 
zweiten Poti, dann nur das dritte.

Deine Software könnte fehlerhaft sein (Tippfehler, falschen Wert in den 
falschen Kanal geschrieben), überprüfe ob Du (ohne ADC) wirklich alle 
Farben unabhängig von 0 bis 100% dimmen kannst, zum Beispiel generiere 
einfache Rampen für alle 3 Werte in Software. Überprüfe das vielleicht 
gleich mal als erstes bevor Du Dir an der ADC-Geschichte einen Wolf 
suchst und das war gar nicht die Ursache.
Gast #4830199
Lesenswert?

Ja okay das Problem hat sich geklärt!

Nach dem ich mit dem Voltmeter alles nochmal durchgegangen bin, hab ich 
mir überlegt ob es richtig ist GND von den Transitoren und den Potis auf 
eine Leitung zu legen...
War es natürlich nicht :D

Das 5V Potenzial kommt aus dem Arduino. Die 12 V kommen aus dem Netzteil 
in Arduino und Schaltung.

Der Arduino hat aber die 5V zu einem anderen Referenzpotenzial. Somit 
sind über den Potis im betrieb nur 0.2 V abfallen....

Trotzdem danke für die Hilfe!

Liebe Grüße

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren