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:
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.
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.
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:
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)?
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 REFS
Bits im ADMUX
Register programmieren, wie im Datenblatt erläutert :
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:
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.
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.
schwach
Mast