Frage:
Arduino MEGA: 64 digitale Eingänge verursachen zufällige digitalRead-Werte
Edo Paulus
2016-01-22 19:21:27 UTC
view on stackexchange narkive permalink

Ich habe 64 Hall-Effekt-Sensoren (Magnetfeldsensoren) ( DRV5023AJQLPG), die an einen Arduino MEGA 2560 angeschlossen sind. Dafür verwende ich 48 digitale Pins und 16 analoge Pins als digitale Eingangs-Pins. Das Programm im Arduino liest kontinuierlich diese 64 digitalen Eingangspins (in einer for-Schleife) aus und sendet ein serielles Byte über ein USB-Kabel an einen Laptop, wenn einer dieser Eingangspins zwischen LOW und HIGH wechselt. Ich verwende auch die internen Pullup-Widerstände des ATmega2560, um unregelmäßige Auslesungen der Eingangsstifte zu verhindern, wenn der Sensor keinen 0-V-Ausgang liefert (dh wenn er kein ausreichend starkes Magnetfeld misst).

Alles funktioniert Gut, wenn ich nur bis zu 16 Sensoren physisch anschließe. Der Laptop empfängt dann nur Bytes, die korrekt anzeigen, wann ein Sensor eine Zustandsänderung misst.

Wenn ich jedoch anfange, mehr dieser 64 Sensoren anzuschließen, empfängt der Laptop unregelmäßige Byteströme, was fälschlicherweise darauf hindeutet Alle angeschlossenen Sensoren messen sich ändernde Magnetfelder (HIGH- und LOW-Anzeigen).

Ich kann mir zwei Gründe vorstellen, warum diese unregelmäßigen Anzeigen auftreten: 1. Entweder funktionieren die internen Pullup-Widerstände des ATmeag2560 nicht so, wie ich es mir vorstelle.2. Oder die Arduino-Platine und> 16 Hall-Effekt-Sensoren zusammen ziehen zu viel Strom.

  1. Pullup-Widerstände funktionieren nicht? Beim Testen mit nur 16 angeschlossenen Sensoren Es ist ein stabiles, ordnungsgemäß funktionierendes Setup. Wenn ich die Pullup-Widerstände im Programm ausdrücklich nicht verwende, verhält sich das Setup unregelmäßig, auch mit nur 16 Sensoren. Die internen Pullup-Widerstände scheinen also vom Programm ordnungsgemäß aktiviert zu werden.

  2. Arduino + 64-Sensoren ziehen zu viel Strom? Neben der Stromversorgung der Arduino-Platine und der Sensoren über das USB-Kabel (mit 500 mA) habe ich auch externe Stromquellen mit 1 oder 2 A ausprobiert. Ich habe das Arduino-Board auch über einen externen 5-V- + 1-A-Spannungsregler mit Strom versorgt und den integrierten Spannungsregler des Arduino umgangen. Dies alles scheint keinen Unterschied im unregelmäßigen Verhalten des Systems zu machen. Bei der Messung des aktuellen Verbrauchs dieses Setups (mit Stromstärkemessgerät) wurde der Wert 250 mA nicht überschritten.

  3. ol>

    Berechnung des kombinierten aktuellen Verbrauchs (mithilfe von Datenblattinformationen) ), Ich bin zu folgendem Ergebnis gekommen:

      - Sensorbetriebsstrom: 2,7 mA - Sensorausgangsstrom im aktiven Zustand: 0,25 mA - GESAMTstrom von 64 Sensoren (3 mA *) 64 =) 192 mA - Arduino MEGA-Strom (ungefähr) 150 mA - GESAMTstrom von 64 Sensoren + Arduino MEGA: ** 342 mA **  

    Also sowohl der berechnete als auch der gemessene Stromverbrauch scheinen im Bereich dessen zu liegen, was von den genannten Stromquellen gehandhabt werden kann.

    Ich stecke jetzt irgendwie fest. Kann jemand etwas vorschlagen, das dieses Problem verursachen könnte? Oder auf falsches Denken an mich hinweisen? Vielen Dank für alle Antworten.


    'Schema' (zeigt nur die ersten 8 angeschlossenen Sensoren. Das ArduinoMEGA ist über ein USB-Kabel mit deaktivierter Stromleitung mit einem Computer verbunden):

    'schematic' (only showing first 8 sensors connected. The ArduinoMEGA is connected to a computer via a usb cable with disabled power line)

    Oberseite: die Hall-Effekt-Sensoren und Vcc- und GND-Schienen: Top: the hall effect sensors and Vcc an GND rails

    Unten- Seite: ArduinoMEGA + die 64 roten Sensorausgangsleitungen zu den Eingangspins: Bottom: ArduinoMEGA + the 64 red sensor output lines to the input pins

    Unten ist der Arduino-Code:

      / * Arduino-zu-Pd-Protokoll Beim Platzieren oder Entfernen einer Schachfigur wird nur ein Byte gesendet. Es werden keine anderen seriellen Daten übertragen. Ereignis: Bytewert: Platzieren einer Schachfigur auf einem Quadrat: 0-63 Entfernen einer Schachfigur von einem Quadrat: 64-127 Zuordnung von ArduinoMEGA-Pin zu Bytewert: Byte-Pin 0 6 1 7 2 8 3 9… 46 52 47 53 48 A0 (analog 0) 49 A1 50 A2…
    62 A14 63 A15 * / Byte prevSquares [64]; // Array, das das vorherige Readbybyte enthält i; // Variable, die in for-loopsbyte sensorValue verwendet wird; // variable temporäre Speicherung von digitalreadvoid setup () {Serial.begin (9600); für (i = 0; i < 64; i ++) {pinMode (i + 6, INPUT_PULLUP); // Pullup-Widerstand aktivieren} für (i = 0; i < 64; i ++) {prevSquares [i] = digitalRead (i + 6); }} void loop () {für (i = 0; i < 64; i ++) {sensorValue = digitalRead (i + 6); if (sensorValue! = prevSquares [i]) {// Schachfigur wurde platziert oder aus dem Quadrat entfernt if (sensorValue == 0) {// Schachfigur wurde platziert // Serienbyte senden (0-63): Serial.write ( ich); } else {// Schachfigur wurde entfernt // Serielles Byte senden (64-127): Serial.write (i + 64); } // aktualisiere das Array prevSquares: prevSquares [i] = sensorValue; }}}  
Persönlich denke ich, dass 64 Sensoren nur Platzverschwendung sind ... Sie können sie in 8 Reihen mit 8 Sensoren verkabeln, eine einzelne Reihe aktivieren und dann lesen und dann zur nächsten übergehen. Was ist der Fehlerstrom? alles hoch, alles niedrig, ständig ändern? Und macht es das an allen Stiften oder nur an einigen von ihnen?
Der Strom besteht aus Höhen und Tiefen, ständiger Veränderung. Es tritt jeden Moment beispielsweise bei der Hälfte aller Pins oder mehr auf, aber * welche Pins * ändern sich im Laufe der Zeit. Der Stream * sieht * so aus, als ob die Pullup-Widerstände nicht verwendet werden. (Übrigens: Die Sensoren werden mit Strom versorgt (Anschlüsse: Masse, Vcc, Ausgang) und haben einen internen Zustand. Die Verwendung einer Matrix von 8x8 würde sie ein- und ausschalten die ganze Zeit und sie würden ihren inneren Zustand verlieren.)
Dann würde ich ein paar Multiplexer verwenden ... oder 16-Bit-Port-Expander. Weil ich persönlich die Pins einer Platine nicht gerne mit Sensoren fülle, sonst können Sie keine anderen Dinge hinzufügen. Wie auch immer. Sie haben das alles getan Versuche mit der gleichen Firmware (also Kompilierung für 64 Sensoren auch bei Verwendung von 16)? Haben Sie die neuen Sensoren bei heruntergefahrenem Board angeschlossen oder nicht? Aus dem Datenblatt sollte der atmega in der Lage sein, Ströme bis zu 200 mA zu verarbeiten, und Ihre Schaltung sollte ca. 50 mA für uC und 16 mA für die Klimmzüge ziehen, also sollte es in Ordnung sein
Ja, ich habe alle Tests mit der Software durchgeführt, die alle 64 Eingangsstifte gelesen hat, auch wenn weniger Sensoren angeschlossen waren. Ich (in) aktivierte Sensoren, indem ich die Masse mit diesen Sensoren (dis) verband, während das Arduino-Board mit Strom versorgt blieb. Um es klar auszudrücken: Die Sensoren werden * nicht * über die Atmega-Pins mit Strom versorgt, sondern beziehen ihre Energie aus der Masse der ArduinoMEGA-Platine und den 5-V-Pins (also vom integrierten Spannungsregler), und ich habe sie auch mit einem externen + getestet 1A Spannungsregler).
Haben Sie versucht, alle 64 Sensoren mit Strom zu versorgen und alle (in) zu aktivieren, indem Sie das Signalkabel anstelle des Erdungskabels (nicht) angeschlossen haben?
Ich habe das * nur * getan. Es ergibt ein ähnliches Ergebnis, außer dass es bereits instabil wird, wenn> 8 Sensoren angeschlossen sind.
Haben Sie versucht, den aktuellen Verbrauch tatsächlich zu messen, anstatt nur zu berechnen? Versuchen Sie, der Spannungsversorgung in der Nähe der Sensoren einige Kondensatoren hinzuzufügen, da hier möglicherweise Rauschen auftritt. PS Sie können nur die Ausgangspins multiplexen, damit die Sensoren eingeschaltet bleiben. Aktivieren Sie externe Pullups in einer einzelnen Zeile und lesen Sie dann alle Spalten. Ähnlich wie beim Multiplexen einer Tastatur.
Wie die meisten 8-Bit-AVR-Prozessoren hat der ATmega2560 eine Strombegrenzung von 200 mA. Solange die Sensoren direkt an den * Mikrocontroller * angeschlossen sind, hilft es Ihnen nicht, die * Karte * mit mehr Strom zu versorgen.
Wie sind all diese Sensoren physikalisch angeordnet? Wie sind sie verbunden? Handelt es sich um ein Steckbrett? (Denken Sie nur an Rauschen und Übersprechen.) Wenn Sie sich das Datenblatt für den Sensor ansehen und ein 10K-Pullup angeben, liegen die internen AVR-Pullups im Allgemeinen im Bereich von 30 bis 60K, was möglicherweise zu gering ist und zu langsam führt Anstiegszeiten.
Es ist tatsächlich etwas nuancierter als ein 10k-Widerstand, es gibt einen zulässigen Bereich basierend auf der Versorgungsspannung, siehe Gleichung 3 auf Seite 16 http://www.farnell.com/datasheets/1888830.pdf und dann basierend auf dem Wert Wenn Sie den Widerstand auswählen, berechnen Sie einen Wert für den Kondensator. In beiden Fällen wäre es hilfreich, wenn Sie Ihren Schaltplan und die Kondensatorwerte gemeinsam nutzen könnten, um zu überprüfen, ob er ordnungsgemäß eingerichtet ist.
Es ist möglicherweise am besten, die Verwendung interner Pullups ohnehin einzustellen, da der Widerstand als Teil eines Tiefpassfilters verwendet wird. Wenn Sie interne Klimmzüge verwenden, setzen Sie die gesamte Leistung des Filters auf die Genauigkeit dieses Widerstandswerts, der nicht besonders genau oder stabil ist.
Ich habe kürzlich etwas anderes getestet (ein altes Telefon) und festgestellt, dass die internen Klimmzüge für einen zuverlässigen Betrieb nicht ausreichen. Die Verkabelung von 64 von ihnen könnte schmerzhaft sein (obwohl Sie einige Widerstands-Arrays bekommen könnten). Wie wäre es mit einigen [analogen Multiplexern] (http://www.gammon.com.au/forum/?id=11976)?
Haben Sie versucht, Ihr Netzteil mit einer 0,1 uF Keramik und einem 100 + uF Elektrolyt zu entkoppeln?
@EdoPaulus es ist wirklich seltsam. Ein weiterer Test, den Sie durchführen können, besteht darin, tatsächlich zu messen, was sich auf dem Pin befindet: Auf diese Weise können Sie verstehen, ob es sich um den Sensorfehler oder den uC-Fehler handelt. Darüber hinaus können Sie zumindest als Test versuchen, die uC-Stromversorgung von den Sensoren zu trennen. Oder platzieren Sie die Sensoren beispielsweise in 8er-Gruppen und trennen Sie die Leistung (z. B. eine Diode (Anode + 5 V oder besser eine höhere, Kathode Vcc der Sensorgruppe) und einen Kondensator (zwischen Vcc der Sensorgruppe und) Boden) im Bereich von 10-100 uF.
Vielen Dank für alle Vorschläge. Ich habe einige Fotos und ein Schema des Setups hinzugefügt. Mein nächster Plan ist es, allen Eingängen externe Pull-up-Widerstände hinzuzufügen und nicht die internen Pull-ups zu verwenden. Für den Wert der Widerstände verwende ich die von @jake-c erwähnte Gleichung (Gleichung 3 von Seite 16 [Link] (farnell.com/datasheets/1888830.pdf)).
@Gerben Ich bin allerdings neugierig: Wie werden die Ausgangspins gemultiplext, während die Sensoren mit Strom versorgt werden? Ich habe etwas mehr über Multiplexing gelesen, aber das Multiplexing von Tastaturen scheint nur kurzzeitige Tasten und Dioden zu beinhalten, keine kontinuierliche Stromversorgung der ICs für jeden Sensor. Gibt es vielleicht einen Link, der mehr Informationen dazu gibt? ty.
@EdoPaulus Schauen Sie sich [dieses Schema, das ich zusammengeschustert habe] an (http://i.stack.imgur.com/7jM2q.png). Sie aktivieren das Pull-up jeweils nur für eine einzelne Zeile. Sie fügen Dioden hinzu, um zu verhindern, dass eine Verbindung zu Zeilen hergestellt wird. Aufgrund der Dioden benötigen Sie einen Pulldown-Widerstand an den Säulen, um ein starkes LOW-Signal zu erhalten. Stellen Sie sicher, dass R7-9 Widerstände mit höherem Wert als die Klimmzüge sind.
Vielleicht müssen Sie einen 10k-Widerstand zwischen das Signal und die Masse des Hall-Effekt-Sensors legen, um elektrische Störungen zu vermeiden. Grüße, Guillaume
Einer antworten:
Jake C
2016-01-27 11:01:03 UTC
view on stackexchange narkive permalink

Nachdem Sie Ihren Schaltplan gesehen haben, besteht das allgemeine Problem hier darin, dass Sie das Datenblatt für diesen Teil genauer lesen und befolgen müssen. Oft, wenn Sie ein Projekt in kleinem Maßstab zusammen humpeln, gibt es viele Dinge, die Sie ignorieren und damit durchkommen können, aber wenn Sie skalieren, summieren sich alle abgerundeten Ecken. In diesem Fall können Sie mit 16 davonkommen, aber sobald Sie anfangen, zu viel hinzuzufügen, wird es zu viel. Lassen Sie uns ein paar davon durchgehen:

Pull-up-Widerstände

Wie ich in den Kommentaren erwähnt habe, ist es wahrscheinlich keine gute Idee, sich auf die internen Pull-ups zu verlassen. Nach meiner persönlichen Erfahrung eignen sie sich nur zum Hinzufügen einer schnellen Tasteneingabe für Debugging-Zwecke. Ich bin mir nicht sicher, was genau nach 16 Sensoren Probleme verursachen würde. Es könnte sein, dass kollektiv interne Pullups einer anderen und niedrigeren Strombegrenzung unterliegen, aber ich bin mit der internen Architektur des ATMega2560 nicht vertraut genug, um mehr als nur zu spekulieren.

Wie auch immer, die Hier empfiehlt es sich, separate externe Pull-up-Widerstände innerhalb der Spezifikationen des Datenblattes zu verwenden. (Siehe Gleichung 1 auf Seite 13 des Datenblattes.)

Entkopplungskondensator

Gemäß Datenblatt, Seite 17:

Ein für VCC ausgelegter Keramikkondensator mit einem Nennwert von mindestens 0,01 µF muss so nahe wie möglich am DRV5023-Gerät platziert werden.

Dieser Kondensator wird in den Abbildungen des Datenblattes als C1 bezeichnet und ist erforderlich. Diese Art von Kondensator wird als Entkopplungskondensator bezeichnet und bietet unter anderem einen lokalen Energiespeicher, sodass der Sensor, wenn er anfängt, etwas zusätzlichen Strom zu ziehen, nicht warten muss, bis der Regler reagiert hat bereits etwas lokale Energie.

Ihr Schaltplan zeigt einen einzelnen 1uF-Kondensator am Ausgang des Spannungsreglers an. Es sind jedoch keine Kondensatoren für die Sensoren vorhanden. Der eine Kondensator dient nur zur Ausgangsfilterung für den Regler und erfüllt keine Entkopplungsanforderungen des Sensors.

Filterkondensator

Wird als C2 bezeichnet Im Datenblatt ist dies ein optionaler Kondensator zum Herausfiltern von Hochfrequenzrauschen. Dies ist in den meisten Fällen laut Datenblatt auf Seite 13 nicht erforderlich:

Die meisten Anwendungen benötigen diesen C2-Filterkondensator nicht.

Ihr Projekt fällt jedoch möglicherweise nicht in die "meisten Anwendungen", und es gibt einige Dinge, die mich besonders beunruhigen.

  1. Sie haben lange Kabel, die im Grunde genommen als Antennen fungieren, die Geräusche in der Nähe erfassen.
  2. Sie haben lange Stromleitungen, die parallel zu Ihren Signalleitungen verlaufen und eine Streuinduktivität verursachen können, die zu anderen interessanten Dingen führt. (Angesichts der Dicke des Sperrholzes, das sie trennt, ist dies möglicherweise kein Problem, aber es ist etwas, das Sie beachten sollten.)
  3. ol>

    Ich würde auf jeden Fall zunächst die ersten beiden oben genannten Ideen ausprobieren und verfolgen dies nur als letzten Ausweg. Der einzige Weg, um sicher zu wissen, ob dies etwas ist, das Sie benötigen, besteht darin, ein Oszilloskop an die Leitung zu kleben und zu sehen, wie laut es ist, aber das haben Sie wahrscheinlich nicht zur Hand.

    Andere Bedenken

    Ich mache mir nur ein bisschen Sorgen um den Spannungsabfall. Abhängig von der verwendeten Drahtstärke kann es bei allen angeschlossenen Sensoren am Ende eines Strangs zu einem nicht zu vernachlässigenden Spannungsabfall kommen.

    Wenn so viele Drähte zusammen in den Mega verlaufen, kann dies der Fall sein Übersprechprobleme.

    Ein weiteres häufiges Problem beim Skalieren besteht darin, dass die Wahrscheinlichkeit fehlerhafter Komponenten höher ist. Dies gilt insbesondere für diesen Teil, der laut Datenblatt angibt, dass er besonders empfindlich auf ESD reagiert. Es kann sein, dass ein toter Sensor so ausgefallen ist, dass die anderen Sensoren Probleme bekommen. Testen Sie möglicherweise alle 64 Sensoren (8 bis 16 gleichzeitig), um sicherzustellen, dass sie alle separat funktionieren und dass das Problem nur auftritt, wenn alle miteinander verbunden sind.

    Andere Ideen

    Viele andere Kommentare zu dieser Frage haben einen Multiplexer und / oder ein Multiplexing vorgeschlagen, und ich werde dies hier nur kurz wiederholen. Multiplexer werden normalerweise in Situationen verwendet, in denen Sie nicht genügend Pins haben und einen einzelnen Pin auf mehrere andere Pins aufteilen möchten. Während dies hier beim Mega kein Problem ist (anscheinend haben Sie genügend Pins, um das zu tun, was Sie tun möchten), gibt es andere Vorteile, die sich aus dem Multiplexen ergeben können.

    Zum Beispiel Eine Sache, die Sie tun können, ist, die Platine in 8 - 2 x 4 Blöcke aufzuteilen und dann einen Multiplexer (wie einen 4051 oder einen 74151) lokal für jeden Block zu haben. Dann würden nur 8 kurze Drähte in den Multiplexer führen, im Gegensatz zu langen, antennenähnlichen Drähten, die zum Mega führen. Dies könnte die Gesamtsignalintegrität verbessern.

Vielen Dank für all diese ausführlichen Antworten! Ich habe gerade versucht, externe Pull-up-Widerstände (22k) hinzuzufügen, aber das hat das System nicht stabil gemacht. Ich werde jetzt versuchen, diese Entkopplungskondensatoren hinzuzufügen. Ich denke darüber nach, 0,01µF (mit ± 20% Toleranz) zu verwenden, oder wäre es besser, 0,1µF zu wählen? Wenn das immer noch nicht funktioniert, werde ich eine Art Multiplexing verwenden. Ich habe ein paar [IO-Expander] (http://nl.farnell.com/microchip/mcp23017-e-sp/ic-io-expander-16bit-i2c-28dip/dp/1332088) mit I2C-Kommunikation zur Hand. Oder wären 4015er besser? (Dann kann ich wahrscheinlich auch die MEGA durch eine gemeinsame Arduino UNO ersetzen)
Und ja, ich habe alle Sensoren separat getestet und sie funktionieren einwandfrei. Außerdem habe ich in der Tat kein Oszilloskop zur Hand.
Das Hinzufügen von Entkopplungskappen hat es stabil gemacht! Im Moment habe ich nur eine 0,1µF Keramikkappe pro Reihe von 8 Sensoren hinzugefügt, um sie zu testen. Das scheint zu funktionieren. Später werde ich wahrscheinlich für jeden Sensor eine Kappe mit 0,01 µF kaufen und hinzufügen. Außerdem werde ich immer noch mit internen und externen Klimmzügen nachsehen. Danke Jake und danke auch @gerben.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...