Kodierungsversion oder Konfiguration auf der Platine

Ich muss Informationen über Version oder Konfiguration auf der Platine/elektrisch codieren, damit die Firmware erkennen kann, welches Platinenlayout verwendet wird.

Welche Möglichkeiten gibt es und welche Vor- und Nachteile haben sie?

Es gibt auch dieses Q von vor einiger Zeit, die Antworten ähneln denen, die bereits gegeben wurden (was gut ist!): electronic.stackexchange.com/questions/41757/…

Antworten (4)

Spontan fallen mir zwei einfache Lösungen ein.

  1. Haben Sie n Leitungen an den GPIO Ihres Mikrocontrollers angeschlossen. Binden Sie diese je nach Board-Version hoch oder niedrig. Dies würde Ihnen geben 2 n Board-Konfigurationsoptionen. Dies würde n Pins auf Ihrem Mikrocontroller verwenden. Die statische Stromaufnahme wäre vernachlässigbar.
  2. Haben Sie einen Eingang zum ADC des Mikrocontrollers und verwenden Sie je nach Platinenkonfiguration einen Spannungsteiler mit unterschiedlichen Werten. Dies würde nur einen einzigen Mikrocontroller-Pin verwenden. Dies hat den Nachteil, dass statischer Strom durch den Teiler gezogen wird. Es wäre auch anfällig für Stücklistenfehler, während der erste Vorschlag fest mit der Platine verdrahtet ist.

Beide Vorschläge haben eine Schwäche, da der Endbenutzer sie leicht ändern könnte, um beispielsweise "gesperrte" Funktionen zu öffnen. Dies ist vielleicht kein Problem für Sie, aber etwas, das Sie bedenken sollten.

Es gibt auch eine Kombination aus [1] und [2]. Sie können einen Pin des Mikrocontrollers für den ADC verwenden, aber eine parallel geschaltete Komponente mit demselben Wert verwenden, um einen Spannungsteiler zu bilden. So können Sie zum Beispiel vier 10k-Widerstände haben, die 10k/float (pull to vcc), float/10k (pull to gnd), 10k/10k(vcc/2), 5k/10k (2/3 von vcc), 10k/ 5k (1/3 von vcc). Kurz gesagt: eine Zeile in der Stückliste, nur unterschiedliche Menge und ein ADC-Eingang erforderlich. Es hilft auch optisch.
Auf die statische Stromaufnahme der ADC-Lösung kann man verzichten, wenn man einen zweiten Pin entbehren kann: Statt eines Spannungsteilers zwischen VCC und GND ersetzt man entweder VCC oder GND durch den zweiten Pin – man muss nur einmal die Platinenkonfiguration auslesen , am Anfang des Programms, also den Pin hoch/niedrig setzen, um den Spannungsteiler zu aktivieren, die ADC-Messung durchführen, dann den Pin umschalten, so dass beide Enden des Spannungsteilers auf dem gleichen Potential liegen und kein Strom fließt.
Die GPIO-Version ist auch anfällig für BOM-Fehler, da diese typischerweise mit Null-Ohm-Verbindungen konfiguriert ist. Sie könnten es im Schaltplan und im Layout tun, aber das ist teurer (Layoutzeit kostet ).
Bezüglich des ADC haben wir dies für Produkte verwendet, an denen ich derzeit arbeite. Sie müssen jedoch mit Widerstandstoleranzen vorsichtig sein. Wenn Ihre beiden Widerstände eine Toleranz von 1% aufweisen, kann die Spannung bis zu 2% abweichen, sodass Sie höchstens 50 Schritte erhalten, die Sie auflösen können. In der Praxis ist es sicherer, das zu halbieren. Wenn Sie also 1-%-Widerstände und einen 5-V-Bereich auf Ihrem ADC haben, möchten Sie, dass Versionen in 0,2-V-Schritten gemeldet werden.

Ich habe bisher ein Schieberegister mit hoch und niedrig gebundenen Pins verwendet, um die Board-Revision zu codieren. Wenn Sie SPI bereits für etwas auf Ihrem Board verwenden, ist es trivial, es zu lesen.

Wenn Sie in der Lage sein müssen, die ID zur Laufzeit zu ändern, wäre es eine gute Idee, Jumper zu verwenden, anstatt die Eingänge mit Spuren zu verbinden.

Ich habe nach ICs mit nicht eindeutigen Seriennummern aus Silikon gegoogelt, aber dies ist eine intelligente Alternative. Vor allem, wenn Sie es mit einem Single-Wire-IO-Expander kombinieren.
Wie laden Sie die Versionsdaten in das Schieberegister?
Wenn Sie einen 74xx165 (oder ein ähnliches paralleles Register) verwenden, können Sie seine Eingänge mit Vdd und Vss verbinden, um einzustellen, was Sie erhalten, wenn Sie Daten austakten
Ah, verstanden. Sie verdrahten also die parallelen Eingänge fest, verbinden den seriellen Ausgang mit einem GPIO-Pin und benötigen dann eine Möglichkeit, die Uhr anzusteuern und die Pins zurückzusetzen (in meinem Fall wahrscheinlich auch GPIO). Ich verwende einen Raspberry PI, um verschiedene Relais zu steuern, daher müsste ich ~ 3 GPIO-Pins für die Versionierung zuweisen. Wenn ich denke, dass ich mehr als 4 Versionen haben werde, wäre dies ein guter Weg.

Einige Optionen, die ich mir vorstellen kann: -

SMD-PADS/O-OHM-Widerstandsverbindungen. Verwenden Sie ein binäres System für die Hardwarekonfiguration, um die Anzahl der Pins für Ihren Prozessor zu reduzieren.

Pullover. Die Platine hätte 2xN-Anschlussstifte, wenn Sie einen Jumper zum rechten Stift hinzufügen, können Sie Ihre Konfiguration auswählen. Ein Fehler ist leichter zu beheben. Dies kann je nach Jumper etwas kostspielig sein und mehr Platz auf der Platine beanspruchen.

Wenn Sie EEPROM auf der Platine haben, können Sie die Konfiguration möglicherweise in den Speicher einbetten.

Ist es möglich, dass Sie die Firmware selbst mit einem #define oder ähnlichem ändern? Dann brauchen Sie keinen Platz auf der Platine und keine zusätzlichen Pins für die Versionserkennung.

One-Wire-EEPROMs sind eine gute Lösung, da sie nur einen GPIO benötigen, aber eine große Menge an Konfigurationsinformationen speichern können. Sie ermöglichen dem Mikrocontroller auch, diese Informationen während des Board-Tests zu schreiben (z. B. Kalibrierungsdaten). Viele haben einen Schreibschutz-Pin oder ein einmalig programmierbares Bit, um weitere Änderungen zu verhindern.

Weitere Vorteile sind nützliche Features wie garantiert eindeutige Seriennummern.

Diese Option wird in vielen Systemen wie Oszilloskop-Tastköpfen und Batterien verwendet, da nur eine einzige Datenleitung benötigt wird. Das EEPROM kann sogar über die Datenleitung selbst versorgt werden.

Der Hauptnachteil sind die Kosten. Die Kosten sind nicht hoch, aber bei Massenprodukten können ein paar Cent eine Rolle spielen.

Ein Beispiel für ein solches EEPROM ist das DS2431, das 1 kb speichert.