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

Ich habe für meine Masterarbeit eine kleine Sensorplatine mit einem ATtiny44 Mikrocontroller entworfen. Ich brauche ungefähr 200 dieser Boards für meine Anwendung und 16 sind immer lokal mit Controllerboard verbunden. Das ganze Netzwerk sieht so aus:

Geben Sie hier die Bildbeschreibung ein

Um zwischen dem Controller und den Sensorplatinen zu kommunizieren, habe ich meinen eigenen 1-Pin-Bus geschrieben (Timing-basiert). 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 Jumper-basierte DAC-Schaltung, die eine analoge Spannung basierend auf der Einstellung von vier Jumpern 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 ). Was mir basierend auf der Jumper-Einstellung einen schönen Wert zwischen 0 V und 760 mV geben sollte. Genau das, was ich als analoge Spannung mit der internen 1,1-V-Referenz des ATtiny lesen musste. Beim Start liest der ATtiny diese Spannung und sollte seine Position kennen.

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

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

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Jetzt habe ich mehrere (zum Glück nicht 200) dieser Boards produziert und einige konnten ihre Adresse nicht korrekt ablesen (insbesondere in den höheren Adressregionen, wo alle Toleranzen gleichzeitig ins Spiel kommen). Ich habe alle möglichen Lösungen gemessen und endlich mein Problem herausgefunden. Meine ursprüngliche Analyse beinhaltete nicht die Toleranz der 5-V-Versorgungsspannung, die lokal aus 12 V mit einem MC7805 auf jeder Controllerplatine erzeugt wird. Laut Datenblatt hat der MC7805 eine Ausgangsspannung zwischen 4,8 und 5,2 V.

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

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Wie Sie sehen, gibt es schöne überlappende Bereiche, bei denen ich nicht definitiv sagen kann, dass diese Spannung nur diese Adresse bedeuten kann. Grundsätzlich 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 Diplomarbeit, 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 Steuerplatine nicht mehr modifizieren (und dort einen genaueren Spannungsregler verwenden).

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

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

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

Antworten (2)

Gemäß Ihren Simulationen funktioniert Ihr Adressierungsschema gut, solange nur Unsicherheiten in den Widerstandswerten berücksichtigt werden. Es ist die Ungewissheit über die Spannung, die es scheitern lässt.

Mein Rat ist, die Schwankungen des VCC auszugleichen, indem Sie ihn als Referenz zum ADC verwenden. Sie können dies tun, indem Sie die REFSBits im ADMUXRegister programmieren, wie im Datenblatt erläutert :

Geben Sie hier die Bildbeschreibung ein

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

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

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Dadurch wird die Auflösung optimiert, indem alle Schritte in der Leiter gleich gemacht werden. 1%-Widerstände sind genau genug, um monotone Leitern von bis zu 5 Bit zu bauen.

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

Ich musste einmal ein ähnliches Problem lösen. Ich musste 4 Tasten mit einem analogen Pin auf Arduino verbinden, aber ich musste gleichzeitiges Drücken erkennen (alle Kombinationen). Ich habe mir die gleiche Schaltung ausgedacht wie Sie, dann habe ich ein Programm geschrieben, um alle möglichen Kombinationen von Widerstandswerten zu suchen, damit die Endwerte beim Drücken der Tasten so weit wie möglich auseinander liegen. Erraten Sie, was? Wir sind am Arsch, das geht nicht. Das war's, schönen Tag noch.

Ich habe gelernt, dass die optimalen Widerstandswerte für Schalter nahe bei R, 2R, 4R, 8R liegen und der untere Teil des Teilers einen Wert von R hat. Ihre Schaltung ist bereits nahe am optimalen, Sie müssen nur R7 durch 10k ersetzen Widerstand.

Aber es gibt eine gute Nachricht für Sie. Da Sie nur eine Adresse einstellen 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.

Warum konnte es nicht getan werden? Was ist passiert, als Sie Ihre Schalter an (R, 2R, 4R, 8R) Widerstände angeschlossen haben? Welche Kombinationen haben nicht funktioniert?
Die R-2R-Leiter ist übrigens ein ausgezeichneter Vorschlag!
+Dmitry Ich meinte, dass die gleichen Ausgangsspannungen zu nahe beieinander liegen, um sie zuverlässig zu unterscheiden.