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:
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.
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.
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:
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)?
quelle
Antworten:
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
REFS
Bits imADMUX
Register programmieren , wie im Datenblatt erläutert :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:
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 .
quelle
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.
quelle