Forum: Mikrocontroller und Digitale Elektronik LED Strip mit Poti steuern


von XxbOoNx98 (Gast)


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

von Nicht so miesmutiger helfer (Gast)


Lesenswert?

Zeig mal einen Schaltplan und die Software dann kann man die wesentlich 
besserer helfen.

von XxbOoNx98 (Gast)


Angehängte Dateien:

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

XxbOoNx98 schrieb:
> Wie kann das sein und was kann ich machen? Wie gesagt ich habe die Potis
> parallel geschaltet.

 Eingänge tauschen, also GRN mit RED, dann GRN mit BLU und sehen was
 passiert.
 Wenn die Verschiebung gleich bleibt, sind die Potis schuld, wenn
 nicht, sind es die ADC-Eingänge.

von Planlos (Gast)


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.

von Peter (Gast)


Lesenswert?

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.

von Michael K. (Gast)


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 ?

von Einer K. (Gast)


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.

von Bernd K. (prof7bit)


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!

von Michael K. (Gast)


Lesenswert?

Bernd K. schrieb:
> Low-Side Schalter baut man mit NPN!
Wenn es ein Vorteil ist das UCE nie unter UBE fallen kann und die 
geschaltete Spannung klein genug ist kann man das machen.
In diesem Fall sind NPN oder gleich LL-N-Fets die bessere Wahl.

von B. B. (Firma: 3B LED) (waflija)


Lesenswert?

XxbOoNx98 schrieb:
> red = 255 * ((float)(analogRead(analogPinRed))/1023);

Was ist den gegen
red = analogRead(analogPinRed)/4);

einzuwenden? Du sparst dir Speicher und Rechenzeit. Genauer wird es 
nebenbei auch noch und ein Fehlerquelle fällt weg.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

von XxbOoNx98 (Gast)


Lesenswert?

Danke erstmal an alle für die Hilfe.

Allgemein an alle: Die Transistoren sind bei mir NPN Transistoren jedoch 
habe ich versehentlich PNP im Schaltplan gezeichnet... Entschuldigung 
dafür...

von XxbOoNx98 (Gast)


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

von XxbOoNx98 (Gast)


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

von XxbOoNx98 (Gast)


Lesenswert?

Okay habe es jetzt versucht die Taktfrequenz vom Multiplexer zu 
minimieren jedoch ohne erfolg!

von XxbOoNx98 (Gast)


Lesenswert?

Hab jetzt auch versucht an den ADC Inputs 22nF Kondensatoren gegen Masse 
zu schalten jedoch auch ohne ohne Erfolg!

Vielleicht jemand eine Idee?

von Bernd K. (prof7bit)


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.

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Sag' uns doch mal, welchen Wert deine Potis haben und wie sie am oberen 
Ende verschaltet sind. (Ich nehme mal an, das das untere Ende an Masse 
geht und der Schleifer an den ADC).

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

XxbOoNx98 schrieb:
> Vielleicht jemand eine Idee?

 Ja.

Marc V. schrieb:
> Eingänge tauschen, also GRN mit RED, dann GRN mit BLU und sehen was
>  passiert.
>  Wenn die Verschiebung gleich bleibt, sind die Potis schuld, wenn
>  nicht, sind es die ADC-Eingänge.

  Hättest du schon gestern ausprobieren können.

von Kolja L. (kolja82)


Lesenswert?

XxbOoNx98 schrieb:
> Obwohl 256/1023 nicht ganz 1/4 sind!

es sind auch 1024 Teiler.
0 - 1023 ;-)

von XxbOoNx98 (Gast)


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

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.