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
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
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.
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.
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.
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 ?
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.
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!
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.
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.
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.
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...
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
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
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.
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).
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.
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