Hallo liebes Forum, ich hab ein Problem und zwar benutze ich zwei CD4067BE (16kanal Multiplexer) um 20 5-Voltpegel abzufragen (brauche nur 20, dafür reicht aber einer nicht aus). Angesteuert werden dieses Multiplexer mit einem Arduino uno der über ein USB an den pc geht. Als programmsoftware dient Matlab. Ziel soll sein, dass jeder Multiplexer 10 Zustände abfragt und in einen Vektor schreibt. Normalerweise liegt das Problem ja immer bei der Software aber ich finde kein Problem an meiner Schleife. Zudem funktioniert die Zählung auch manchmal. Nach Messung mit dem Multimeter bricht die 5 Voltspannung des Arduinos manchmal zusammen mal 4 Volt mal 3 Volt, auch mal unter 3. Die minimale Betriebsspannung ist 3 Volt. Wenn das also kurzfristig darunter fällt, ist der Betrieb gestört. Die Spannung bricht aber auch nicht immer zusammen (vllt hängt es damit zusammen, dass der Aufbau auf einem Steckbrett ist?) aber auch wenn die spannung bei 4,6 Volt bleibt, bekomm ich das falsche Ergebnis. Hat Jemand von Euch schonmal mit diesem Multiplexer gearbeitet? anbei noch mein For schleife [c] mux1=0; mux2=0; comparevektor=zeros(1,20); for laufmux=1:10 mux1=dec2bin(mux1,4); mux2=dec2bin(mux2,4); u.digitalWrite(5,str2double(mux1(1))); u.digitalWrite(6,str2double(mux1(2))); u.digitalWrite(7,str2double(mux1(3))); u.digitalWrite(8,str2double(mux1(4))); comparevektor(laufmux)=u.digitalRead(9); mux1=bin2dec((mux1))+1; u.digitalWrite(10,str2double(mux2(1))); u.digitalWrite(11,str2double(mux2(2))); u.digitalWrite(12,str2double(mux2(3))); u.digitalWrite(13,str2double(mux2(4))); comparevektor(laufmux+10)=u.digitalRead(2); mux2=bin2dec(mux2)+1; end comparevektor end [c/] Mit besten Grüßen und schonmal vielen Dank
Solange die Spannung nicht konstant bleibt, wirst du ohnehin nichts ordentliches messen können. Die Spannungen misst der Arduino? Berücksichtigst du auch die notwendigen Zeiten?
Gibt es einen konkreten Schaltplan, der mal gezeigt werden kann? Und die Software ist auch nicht komplett, vielleicht fehlt das wichtigste, genau das was stört? Sonst beginnt sicherlich ein großes Ratespiel.
Das Problem ist dass die Spannung manchmal konstant bleibt und manchmal nicht. Die wechselnde Spannung ist eventuell ein Problem mit dem USB, da halt immer das windows signal kommt vom herausziehen eines usb gerätes wenn man "clear all" bei matlab eingibt. ich ziehe dann jetzt auch immer den usb port raus. Die Spannung messe ich mit einem Voltmeter. Die Notwendigen Zeiten habe ich noch nicht ausführlich getestet. nur mal eine 1 sekündige pause (mit % in Code) mal eingebaut. Einen Schaltplan gibt es nicht. Die Multiplexer werden auf einem Steckbrett verbunden und die eingänge dann auf den länglichen Masse und Supply schienen gegen Grund oder Supply geschaltet und dann ausgewertet. Inhibit liegt auf masse. hier der komplette Code. global u; u=arduino('COM7'); u.pinMode(5,'output');%a1 u.pinMode(6,'output');%b1 u.pinMode(7,'output');%c1 u.pinMode(8,'output');%d1 u.pinMode(9,'input');%data1 u.pinMode(10,'output');%a2 u.pinMode(11,'output');%b2 u.pinMode(12,'output');%c2 u.pinMode(13,'output');%d2 u.pinMode(2,'input');%data2 %initialisieren u.digitalWrite(5,0); u.digitalWrite(6,0); u.digitalWrite(7,0); u.digitalWrite(8,0); u.digitalWrite(10,0); u.digitalWrite(11,0); u.digitalWrite(12,0); u.digitalWrite(13,0); mux1=0; mux2=0; comparevektor=zeros(1,20); for laufmux=1:10 mux1=dec2bin(mux1,4); mux2=dec2bin(mux2,4); u.digitalWrite(5,str2double(mux1(1))); u.digitalWrite(6,str2double(mux1(2))); u.digitalWrite(7,str2double(mux1(3))); u.digitalWrite(8,str2double(mux1(4))); % pause(1) comparevektor(laufmux)=u.digitalRead(9); mux1=bin2dec((mux1))+1; u.digitalWrite(10,str2double(mux2(1))); u.digitalWrite(11,str2double(mux2(2))); u.digitalWrite(12,str2double(mux2(3))); u.digitalWrite(13,str2double(mux2(4))); % pause(1) comparevektor(laufmux+10)=u.digitalRead(2); mux2=bin2dec(mux2)+1; end comparevektor end
Was mir zum 4067 konkret noch einfällt: Es kann ein Break-before-Make-Problem geben, daß sich beim Umschalten Kanäle für ein paar ns überlappen. Dann müßte man den Enable-Pin nicht fest auf Masse legen, sondern bei jeder Kanalumschaltung mal kurz disablen und wieder enablen. Aber ich glaube es angesichts der Schalterwiderstände eher weniger, daß es sowas ist, was große Probleme macht.
mh davon hatte ich auch schonmal gelesen, dann aber nicht mehr gefunden.... gibt es 16 bit multiplexer ohne dieses problem? komischerweise gibt es kanäle die auf das umschalten reagieren und welche, die das nicht tun... lg
:
Bearbeitet durch User
fabian hohmann schrieb: > mh davon hatte ich auch schonmal gelesen, dann aber nicht mehr > gefunden.... gibt es 16 bit multiplexer ohne dieses problem? > komischerweise gibt es kanäle die auf das umschalten reagieren und > welche, die das nicht tun... > > lg Normalerweise gibt es kein Problem, wenn man weiß, wie man mit den Steinen um geht. Z.B. bei Kanalumschaltungen kurz disablen, danach enablen, und nicht gleich nach einer Umschaltung in der nächsten Nanosekunde den Pegel einlesen. Im Datenblatt steht nur was von einigen ns Kanalüberlappung, und kann, muß nicht. Laß den Baustein mal schön drin, der ist an sich gut und brauchbar. Im Umschaltemoment gibt es dann wenige ns lang einen Peak von vielleicht bis zu 10mA Größe, wenn die Kanäle hart auf Betriebsspannung bzw. Masse liegen. Aus diesem Grunde sollte der 4067 auch einen Blockkondensator haben. Bau doch in die Kanalumschaltungen mal eine Warteschleife ein, meinetwegen sogar eine Sekunde, oder sogar Weiterschaltung der Kanäle manuell per Tastendruck, damit man mit dem Multimeter auch in Ruhe messen kann.
also ich schalte jetzt den inhibit mit und warte eine halbe sekunde, aber iwi passen die ergebnisse trotzdem nicht, kann es noch an was anderem liegen. ein kondensator habe ich leider nicht zur hand. hier mein code jetzt global u; mux1=0; mux2=0; comparevektor=zeros(1,20); for laufmux=1:10 mux1=dec2bin(mux1,4); mux2=dec2bin(mux2,4); u.digitalWrite(3,1); %inhibit1 einschalten u.digitalWrite(4,1); %inhibit2 einschalten u.digitalWrite(5,str2double(mux1(1))); u.digitalWrite(6,str2double(mux1(2))); u.digitalWrite(7,str2double(mux1(3))); u.digitalWrite(8,str2double(mux1(4))); u.digitalWrite(3,0); %inhibit1 ausschalten u.digitalWrite(4,0); %inhibit2 ausschalten pause(0.5) comparevektor(laufmux)=u.digitalRead(9); mux1=bin2dec((mux1))+1; u.digitalWrite(3,1); %inhibit1 einschalten u.digitalWrite(4,1); %inhibit2 einschalten u.digitalWrite(10,str2double(mux2(1))); u.digitalWrite(11,str2double(mux2(2))); u.digitalWrite(12,str2double(mux2(3))); u.digitalWrite(13,str2double(mux2(4))); u.digitalWrite(3,0); %inhibit1 ausschalten u.digitalWrite(4,0); %inhibit2 ausschalten pause(0.5) comparevektor(laufmux+10)=u.digitalRead(2); mux2=bin2dec(mux2)+1; end comparevektor
Mit dem Code schaltest du den MUX, wie synchronisierst du den ADC dazu?
Hubert G. schrieb: > Mit dem Code schaltest du den MUX, wie synchronisierst du den ADC > dazu? Da er nur zwei Pegel hat, Masse und VCC, brauchte er den ADC eigentlich gar nicht, sondern nur Pinzustände abfragen. Aber einen ADC initialisieren ist ja auch nicht die Welt.
ja pinzustände reichen aus. ich frag ja von den 18 möglichen nur 10 ab, kann es probleme machen wenn ich dann die anderen 8 iwi schalte oder gar nicht gegen masse oder supply schalte?
fabian hohmann schrieb: > ja pinzustände reichen aus. > > ich frag ja von den 18 möglichen nur 10 ab, kann es probleme machen wenn > ich dann die anderen 8 iwi schalte oder gar nicht gegen masse oder > supply schalte? Ich habs ja oben schon geschrieben, das wird hier ohne Pläne ein reines Ratespiel.
hier der schaltplan, erstmal vereinfacht auf ein muxer, so ist auch mein aufbauer gerade
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.