CD4067BE mit arduino Uno

OP #3493499
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
Gast #3493537
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.
OP #3493547
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
Gast #3493560
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.
Gast #3493696
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.
OP #3493768
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.