Hallo,
da ich es satt habe die ganze Zeit nur auszuprobieren, um Misserfolge zu
verkraften. Frage ich mal nach.
Ich steuere einen 16:1 analog-Multiplexer mit meinem Aduino-Uno an. Dies
ist der Schaltungs aufbau:
http://bildr.org/blog/wp-content/uploads/2011/01/CD74HC4067_Empty.png
Der Sketch:
int speicherPin = 10;
int taktPin = 11;
int datenPin = 9;
int analogPin = 2;
int messErgebnis = 0;
long motherCode = 0;
void setup() {
pinMode(speicherPin, OUTPUT);
pinMode(taktPin, OUTPUT);
pinMode(datenPin, OUTPUT);
pinMode(analogPin, INPUT);
Serial.begin(9600);
}
void loop() {
/*
Serial.println("=====================================");
Serial.print("MotherCode: ");
Serial.println(motherCode, BIN);
Serial.println("=====================================");
*/for(int regalCodeCounter = 0; regalCodeCounter < 16;
regalCodeCounter++) {
long fullCode = (0B1001 << 4) + motherCode;
fullCode = fullCode << 8;
fullCode += getRegalCode(regalCodeCounter);
sendBytes(0B1001000100001101);
messErgebnis = analogRead(analogPin);
Serial.println(0B1001000100000001, BIN);
delay(250);
Serial.println(messErgebnis);
delay(250);
}
delay(1000);
motherCode++;
if(motherCode == 16) motherCode = 0;
}
int getRegalCode(long regalCodeCounter) {
long sendRegalCode = 0B00000000;
sendRegalCode = regalCodeCounter << 4;
sendRegalCode += regalCodeCounter;
return sendRegalCode;
}
void sendBytes(long data) {
digitalWrite(speicherPin, LOW);
shiftOut(datenPin, taktPin, MSBFIRST, data >> 8);
shiftOut(datenPin, taktPin, MSBFIRST, data & 255);
digitalWrite(speicherPin, HIGH);
}
Ich lasse die Bit-Komibi, die der MUX erhält, durch zwei Schieberegister
74HC595 generieren, die ihre Signale direkt an die Eingänge des
MUX(S0-S3)schicken
Wenn ich den Sketch hochlade funktioniert ales perfekt, doch wenn ich
eine Spannung auslesen möchte, dann klappt dies auch, sofern bei den 15
anderen Input Pins des MUX keine Spannung anlieegt. Liegt dort jedoch
eine Spannung an, so wird mit dieser Spannung ein Mittelwert gebildet.
Und dieser wird dann im Seriellen Monitor angezeigt.
Falls jemand eine hätte, woran das liegt, wäre ich sehr dankbar.
Dann teile uns doch mal mit, welchen Mux du benutzt.
Und EN auf Masse ziehen, wo das Signal nicht invertiert scheint, scheint
auch erstmal falsch zu sein.
t800w schrieb:> Ich steuere einen 16:1 analog-Multiplexer mit meinem Aduino-Uno an. Dies> ist der Schaltungs aufbau:>> http://bildr.org/blog/wp-content/uploads/2011/01/CD74HC4067_Empty.pngt800w schrieb:> Ich lasse die Bit-Komibi, die der MUX erhält, durch zwei Schieberegister> 74HC595 generieren, die ihre Signale direkt an die Eingänge des> *MUX(S0-S3)* schicken
Dann stimmt doch aber Dein verlinkter Schaltungsaufbau gar nicht, oder
verstehe ich Dich falsch? Mach doch bitte mal eine richtigen Schaltplan,
gern per Hand gezeichnet.
Weil ich den MUX im ersten Post nicht kannte ;).
Aber laut Datenblatt ist das so korrekt.
Bitte weitere Infos:
1) welche Spannungsquellen liegen an den Eingängen? Spannungsteiler?
DACs? ...?
2) wie sieht die Eingangsbeschaltung des ADC aus? direkt an den ADC?
Ich vermute, dass die Leckströme eines jeden Kanals zu deinem Nutzsignal
hinzu kommen. Ein Pulldown am ADC-Eingang könnte (je nach Quelle an den
Mux-Eingängen) helfen. Größe hängt von diesen Quellen ab.
Bitte 1) für genauere Angaben beantworten.
@ STM8-C-Anfänger
STM8-C-Anfänger schrieb:> Dann stimmt doch aber Dein verlinkter Schaltungsaufbau gar nicht, oder> verstehe ich Dich falsch? Mach doch bitte mal eine richtigen Schaltplan,> gern per Hand gezeichnet.
Der Link war nur für die Veranschaulichung für die Anschlüsse des Mux
gedacht.
Das mag ja sein, aber sowas führt immer in die Irre und sorgt für
Diskussionen zu Bereichen, die vielleicht doch korrekt sind. oder auch
nicht.
So wie das EN. Es müsste /EN oder nEN heißen, damit klar ist, dass es
low-aktiv ist.
Felix Adam schrieb:> Das mag ja sein, aber sowas führt immer in die Irre und sorgt für> Diskussionen zu Bereichen, die vielleicht doch korrekt sind. oder auch> nicht.>> So wie das EN. Es müsste /EN oder nEN heißen, damit klar ist, dass es> low-aktiv ist.
Wo und wie müsste ich das Anschließen, da ich gerade sehr verwirrt bin.
Bei einem nicht-invertierten EN muss das EN auflogisch high. Bei einem
/EN wie bei dem 74HC4067 auf low (GND).
Wie geschrieben: deine Zeichnung ist für andere verwirrend.
Und welche Werte haben die Spannungsteiler? Gib uns doch bitte mal die
Widerstandswerte.
Und was ist mit dem ADC-Eingang? Gibt es einen Pulldown? und/oder einen
Stützkondensator?
t800w schrieb:> wenn ich eine Spannung auslesen möchte, dann klappt dies auch,> sofern bei den 15 anderen Input Pins des MUX keine Spannung anlieegt.
Liegen denn die gemultiplexten Spannungen innerhalb des
Arbeitsbereichs des Multiplexers? So ein IC-Multiplexer
bietet keine galvanische Trennung.
@Felix Adam
Als Spannungsteiler benutze ich einen LDR (Bereich 0-10 KOhm), der mit
High verbunden ist. Auf der anderen Seite ist ein 10KOhm Wiederstand,
der mit Low verbunden ist.
Felix Adam schrieb:> Und was ist mit dem ADC-Eingang? Gibt es einen Pulldown? und/oder einen> Stützkondensator?
Nein
Harald W. schrieb:> Liegen denn die gemultiplexten Spannungen innerhalb des> Arbeitsbereichs des Multiplexers?
Ja, sie liegen im Bereich von 0 - maximal 5V.
> So ein IC-Multiplexer> bietet keine galvanische Trennung.
Wie sollte ich das Problem dann Elektronisch lösen?
t800w schrieb:> Serial.println("=====================================");>> */for(int regalCodeCounter = 0; regalCodeCounter < 16;> regalCodeCounter++) {
Formatiere deinen Code mal anständig. Wer soll das denn lesen?
C-Code bitte als C-Code taggen!
STM8-C-Anfänger schrieb:> Also hast Du das in etwa so verschaltet?
Ein 74LS595 ist da arg fehl am Platze. Damit erreichst du nicht sicher
den H-Pegel vom 74HC...
Und Steuereingänge in der Luft hängen zu lassen, ist - unabhängig von
der IC-Familie - zumindest kein guter Stil, bei CMOS sogar verboten.
Wolfgang schrieb:> Ein 74LS595 ist da arg fehl am Platze. Damit erreichst du nicht sicher> den H-Pegel vom 74HC...>> Und Steuereingänge in der Luft hängen zu lassen, ist - unabhängig von> der IC-Familie - zumindest kein guter Stil, bei CMOS sogar verboten.
Danke, es ging um das Prinzip. Aber für Dich suche ich gern noch einen
74HC595 raus ... /Sarkasmus off
Ich denke, du hast ein Problem mit den leckströmen durch die 15 nicht
aktivierten Kanäle. Im Datenblatt findest du diese unter "OFF-state
leakage current". Je kanal können (so ich das richtig interpretiere) bis
zu ca. 1µA zusammen kommen.
Dieser Strom fließt duch den 10kOhm-Widerstand an deinem aktivierten
Kanal gen Masse und verursacht so einen Messfehler.
Du könntest das prüfen und nachmessen, indem du an einen Kanal mal
100kOhm nach Masse ohne einen LDR nach 5V anschließt und diesen Kanal
mal aktivierst. Die anderen belasse so wie sie sind mit ihren LDRs und
10kOhm-Widerständen. Mit einem Multimeter sollte sich jetzt eine
Spannung messen lassen, die diesem Wert ungefähr entspricht.
Hast du kein Multimeter, dann schalte dem 100kOhm-Widerstand noch einen
Kondensator mit mindestens 100nF parallel. So beeinflusst die Messung
des ADC den Messwert nahezu nicht und du bekommst dir den Wert von
deiner Schaltung geliefert.
Ferner solltest du nach dem Umschalten deines Mux ein paar Millisekunden
warten, bevor dein ADC zu messen beginnt. So sollten die Spannungen alle
auf ihrem Endwert sein.
Hallo, ich will mehrere 16-Cahnnel-Analog-Multiplexer (Typ: CD74HC4067)
mit einem Arduino auslesen. Die Multiplexer steuere ich ebenfalls mit
dem Arduino via 74HC595 an. Die 74HC595 funktionieren perfekt, jedoch
zun die Multiplexer nicht das, was sie tun sollen, d.h jeder MUX bildet
ein Mittelwert aus allen 16 Eingangssignalen, und gibt diesen dann an
den Arduino weiter.
So lautet das Programm:
delay(10);// Eine Sekunde Verzögerung für jeden neuen MotherCode
31
32
motherCode++;// MotherCode hochzählen
33
34
if(motherCode==16)// MotherCode zurücksetzen
35
motherCode=0;
36
37
}
38
39
// Generiere den RegalCode, welcher aus zwei identischen Zahlen besteht
40
intgetRegalCode(longregalCodeCounter){
41
42
longsendRegalCode=0B00000000;
43
44
sendRegalCode=regalCodeCounter<<4;
45
sendRegalCode+=regalCodeCounter;
46
47
returnsendRegalCode;
48
49
}
50
51
voidsendBytes(longdata){
52
53
digitalWrite(speicherPin,LOW);
54
shiftOut(datenPin,taktPin,MSBFIRST,data>>8);
55
shiftOut(datenPin,taktPin,MSBFIRST,data&255);
56
digitalWrite(speicherPin,HIGH);
57
58
}
Dieses Programm ist so generiert, sodass es einen Binär-Code
"hochzählt", ist das Maximum des möglichen 16 stelligen erreicht, so
wird wieder bei 0 begonnen.
t800w schrieb:> Hallo, ich will mehrere 16-Cahnnel-Analog-Multiplexer (Typ: CD74HC4067)> mit einem Arduino auslesen.
Was meinst du mit "auslesen"?
> Die Multiplexer steuere ich ebenfalls mit> dem Arduino via 74HC595 an. Die 74HC595 funktionieren perfekt, jedoch> zun die Multiplexer nicht das, was sie tun sollen, d.h jeder MUX bildet> ein Mittelwert aus allen 16 Eingangssignalen, und gibt diesen dann an> den Arduino weiter.
Wie kommst du auf diese Schlußfolgerung?
> So lautet das Programm:
Ich sehe da an keiner Stelle, daß du den analogen(?) Wert, den der
Multiplexer ausgibt, irgendwie erfassen würdest.
> Was meinst du mit "auslesen"?
Das Signal vom MUX über einen analogen Pin am Arduino-Bord i Seriellen
Monitor anzeigen lassen
> Wie kommst du auf diese Schlußfolgerung?
Ich habe an die 74HC595LEDs angeschlossen, die sind dann mit dem Code
an und aus gegenagen. Somt ziehe ich die Schlussvolgerung, dass es nicht
an den 74HC595 liegen kann. Der Mittelwert ist ebenfalls bestätigt. Ich
zeige dies an einem Beispiel:
Ich lese Pin C5 am MUX aus. Lege ich bei C9 eine andere Spannung an, so
wird ebenfalls der Wert des Pins C5 beeinflusst. Warum der MUX dies tut
ist mir ein Rätsel, deswegen frag ich ja.
> Ich sehe da an keiner Stelle, daß du den analogen(?) Wert, den der> Multiplexer ausgibt, irgendwie erfassen würdest.
Ich hab ausversehn das falsche Programm hochgeladen, hier ist das
Richtige:
Dein Problem sind wahrscheinlich seit deinem ersten Beitrag die
Leckströme.
Dafür sehe ich derzeit nur zwei Lösungen:
1) deine Spannungsquellen (LDR + Widerstand als Spannungsteiler,
richtig?) sind zu hochohmig. Hinter jeden davon einen Impedanzwandler
mit OP und erst dann auf den MUX.
2) anderen MUX mit deutlich kleineren Leckströmen einsetzen.
t800w schrieb:> Habe die Lösungen aus dem ersten Thread ausprobiert, doch es hat immer> noch keinen Erfolg gebracht. Außerdem kostet fragen ja nix
Normalerweise lassen sich solche Fehler durch systematisches Messen
leicht einkreisen. Solche Messungen können wir aus der Entfernung
nicht durchführen.
t800w schrieb:> Außerdem kostet fragen ja nix
Nicht den Frager, aber die Zeit der kostenlosen Helfer.
Hat man dir schon gesagt, dass du etwas egomanisch drauf bist?
Wenn nicht, dann jetzt!
Aber ich glaube nicht, dass ich da der Erste bin.....
t800w schrieb:> So lautet das Programm:
Du darfst gerne um deinen C-Code die [c] Tags herum machen. So wie es in
der kurzen Anleitung über jeder Eingabebox bei "Antwort schreiben -
Wichtige Regeln - erst lesen, dann posten!" steht. Und es nicht nur beim
Lesen belassen, sondern es auch tun...
t800w schrieb:> Habe die Lösungen aus dem ersten Thread ausprobiert, doch es hat immer> noch keinen Erfolg gebracht. Außerdem kostet fragen ja nix
Du hättest aber wenigstens erwähnen können, dass an der selben Baustelle
schon mal was los war.
Vor allem würde ich mal den Multiplexer mit minimaler Beschaltung (ohne
den Arduino) auf einem Breadboard aufbauen und mal messen.
Ich habe den Eindruck, bei Dir steht der Sketch im Vordergrund...