4-Bit-Busadressauswahl über analogen Eingangspin: Monte-Carlo-Simulation zeigt überlappende Adresswerte

16

Ich habe eine kleine Sensorplatine für meine Masterarbeit mit einem ATtiny44- Mikrocontroller entworfen. Ich benötige ungefähr 200 dieser Karten für meine Anwendung und 16 sind immer lokal mit der Controller-Karte verbunden. Das gesamte Netzwerk sieht folgendermaßen aus:

Geben Sie hier eine Bildbeschreibung ein

Für die Kommunikation zwischen dem Controller und den Sensorplatinen habe ich einen eigenen 1-Pin-Bus geschrieben (zeitbasiert). Das einzige Problem ist, dass die Sensorplatine eine Adresse haben muss, um ihren Standort im Netzwerk zu kennen, wenn ich ihre Daten an die Controllerplatine sende.

Da ich nur noch 1 Pin auf dem ATtiny hatte, kam ich auf eine jumperbasierte DAC-Schaltung, die basierend auf der Einstellung von vier Jumpern eine analoge Spannung erzeugen sollte. Da die Sensorschaltung die Werte (47, 470, 1k, 3k, 4k7, 10k, 100k und 220k) verwendet und ich für die Produktion optimieren wollte, habe ich die folgenden Werte für den DAC verwendet (im Grunde 100k, 50k, 20k und 10k) ). Welches sollte mir einen schönen Wert zwischen 0 V und 760 mV basierend auf der Jumper-Einstellung geben. Genau das, was ich als analoge Spannung mit der internen 1,1-V-Referenz des ATtiny lesen musste. Beim Einschalten liest der ATtiny diese Spannung und sollte ihre Position kennen.

schematisch

simulieren Sie diese Schaltung - Schaltplan erstellt mit CircuitLab

Theoretisch funktioniert das gut. Ich habe sogar eine Monte-Carlo-Analyse in LTspice durchgeführt , um zu bestätigen, dass ich keine überlappenden Bereiche erhalte, wenn ich die Toleranz der Widerstände berücksichtige (alle sind 1% BTW). Nachfolgend finden Sie die Bilder dieser Analyse.

Geben Sie hier eine Bildbeschreibung ein Geben Sie hier eine Bildbeschreibung ein

Jetzt habe ich mehrere (zum Glück nicht 200) dieser Boards hergestellt und dennoch konnten einige nicht die richtigen Werte für ihre Adresse erhalten (insbesondere in den Regionen mit höheren Adressen, in denen alle Toleranzen auf einmal auftreten). Ich habe alle möglichen Lösungen ausgemessen und schließlich mein Problem herausgefunden. Meine ursprüngliche Analyse enthielt nicht die Toleranz der 5-V-Versorgungsspannung, die lokal mit einem MC7805 auf jeder Controller- Karte aus 12 V erzeugt wird . Der MC7805 hat laut Datenblatt eine Ausgangsspannung zwischen 4,8 und 5,2 V.

Nachdem ich das herausgefunden hatte, änderte ich die Monte-Carlo-Analyse. Es sieht jetzt so aus:

Geben Sie hier eine Bildbeschreibung ein Geben Sie hier eine Bildbeschreibung ein

Wie Sie sehen, gibt es schöne Überlappungsbereiche, in denen ich nicht definitiv sagen kann, dass diese Spannung nur diese Adresse bedeuten kann. Grundsätzlich sind alle Adressen beginnend mit nr. 8 kann einen falschen Messwert erhalten (mit höheren Möglichkeiten für falsche Messwerte für höhere Adressen).

Ich möchte keine anderen Widerstandswerte als die bereits auf der Platine verwendeten hinzufügen (wie für die These, die ich für die Produktion optimieren möchte).

Ich möchte keine Spannungsreferenz (z. B. Zenerdiode) hinzufügen, um das DAC-Widerstandsnetzwerk zu speisen.

Ich kann die Anschaltbaugruppe nicht mehr ändern (und dort einen genaueren Spannungsregler verwenden).

Ich kann das PCB-Design / Schema der Sensorplatine noch ändern!

Wie kann ich sicherstellen, dass die Adresse immer korrekt angezeigt wird (entweder durch Programmieren oder durch Ändern der Schaltung)?

KarlKarlsom
quelle
3
+1 Schöne Frage. Können Sie die letzte LTspice asc-Datei in einem Pastebin irgendwo bereitstellen? Können wir also andere Kombinationen testen?
dim
2
Tolle Frage, gute Arbeit, um herauszufinden, was sie tatsächlich verursacht hat, bevor Sie hier um Rat fragen. Jetzt sind die Frage und die Antwort eine gute Lektüre für jeden, der vorbeikommt und nicht nur für Sie :-)
Mast

Antworten:

19

Nach Ihren Simulationen funktioniert Ihr Adressierungsschema einwandfrei, solange nur Unsicherheiten bei den Widerstandswerten berücksichtigt werden. Es ist die Unsicherheit über die Spannung, die zum Ausfall führt.

Mein Rat ist, die Schwankungen der VCC auszugleichen, indem Sie sie als Referenz für den ADC verwenden. Sie können dies tun, indem Sie die REFSBits im ADMUXRegister programmieren , wie im Datenblatt erläutert :

Bildbeschreibung hier eingeben

Sobald Sie auf VCC als Referenzspannung für den ADC umschalten, messen Sie keine Spannung mehr, sondern ein Verhältnis zwischen Widerstandswerten, die auf 1% genau sind. Im Schaltplan sind keine Änderungen erforderlich (obwohl Sie möglicherweise den Wert von R7 erhöhen möchten, um Ihre Messungen in der Mitte des ADC-Konvertierungsbereichs zu erhalten), muss nur die Firmware von Attiny aktualisiert werden.

Wenn Sie immer noch bereit sind, die Sensorplatine zu überarbeiten, können Sie Ihren Schaltplan durch eine R-2R-Leiter ersetzen, wie von Cano64 vorgeschlagen:

schematisch

simulieren Sie diese Schaltung - Schaltplan erstellt mit CircuitLab

Dadurch wird die Auflösung optimiert, indem alle Schritte in der Leiter gleich sind. 1% Widerstände sind präzise genug, um monotone Leitern mit bis zu 5 Bit zu bauen .

Dmitry Grigoryev
quelle
Doh! Ich habe den Wald vor lauter Bäumen nicht gesehen. Ich war so fixiert auf diese 1.1V ... Vielen Dank! Ich werde das versuchen.
KarlKarlsom
1
Getestet und es funktioniert. Groß!
KarlKarlsom
Ich habe es mit VCC als AREF und einem 220k Widerstand für R7 getestet. Ich könnte später versuchen, eine 100k, 220k R-2R Leiter zu simulieren und zu sehen, ob es mir noch bessere Ergebnisse bringt. Danke noch einmal!
KarlKarlsom
3

Ich musste einmal ein ähnliches Problem lösen. Ich musste 4 Tasten an einen analogen Pin auf dem Arduino anschließen, musste jedoch gleichzeitiges Drücken erkennen (alle Kombinationen). Ich habe die gleiche Schaltung wie Sie entwickelt und dann ein Programm geschrieben, um alle möglichen Widerstandswertkombinationen zu durchsuchen, damit die Endwerte beim Drücken der Tasten so weit wie möglich voneinander entfernt sind. Erraten Sie, was? Wir sind beschissen, das geht nicht. Ich wünsche Ihnen einen schönen Tag.

Ich habe erfahren, dass die optimalen Widerstandswerte für Schalter in der Nähe von R, 2R, 4R, 8R liegen und der untere Teil des Teilers den Wert R hat. Ihr Schaltkreis ist bereits in der Nähe des optimalen, Sie müssen nur R7 durch 10k ersetzen Widerstand.

Aber es gibt eine gute Nachricht für Sie. Da Sie nur eine Adresse festlegen müssen (Sie werden den Schalter nicht betätigen, während das Gerät läuft), empfehle ich, stattdessen SPDT-Schalter und R2R-Leiter zu verwenden.

Cano64
quelle
Warum konnte es nicht gemacht werden? Was ist passiert, als Sie Ihre Schalter an Widerstände (R, 2R, 4R, 8R) angeschlossen haben? Welche Kombinationen haben nicht funktioniert?
Dmitry Grigoryev
R-2R Leiter ist übrigens ein ausgezeichneter Vorschlag!
Dmitry Grigoryev
+ Dmitry ich meinte gleich die Ausgangsspannungen sind zu nah um sie zuverlässig zu unterscheiden.
Cano64