Forum: Analoge Elektronik und Schaltungstechnik CD4067BE mit arduino Uno


von Fabian H. (fabian_hoh)


Lesenswert?

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

von Hubert G. (hubertg)


Lesenswert?

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?

von Wilhelm F. (Gast)


Lesenswert?

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.

von Fabian H. (fabian_hoh)


Lesenswert?

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

von Wilhelm F. (Gast)


Lesenswert?

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.

von Fabian H. (fabian_hoh)


Lesenswert?

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
von Wilhelm F. (Gast)


Lesenswert?

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.

von Fabian H. (fabian_hoh)


Lesenswert?

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

von Hubert G. (hubertg)


Lesenswert?

Mit dem Code schaltest du den MUX, wie synchronisierst du den ADC dazu?

von Wilhelm F. (Gast)


Lesenswert?

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.

von Fabian H. (fabian_hoh)


Lesenswert?

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?

von Wilhelm F. (Gast)


Lesenswert?

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.

von Fabian H. (fabian_hoh)


Angehängte Dateien:

Lesenswert?

hier der schaltplan, erstmal vereinfacht auf ein muxer, so ist auch mein 
aufbauer gerade

von Jobst M. (jobstens-de)


Lesenswert?

fabian hohmann schrieb:
> so ist auch mein
> aufbauer gerade

Bild machen!


Gruß

Jobst

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.