EEPROM mit hoher Lebensdauer

Ich arbeite derzeit an einem eingebetteten Projekt, in dem ich einen Zähler habe, der die ganze Zeit aktiv sein wird. Wenn der Strom ausfällt, muss ich auch den letzten Zählerstand speichern und beim nächsten Start wieder laden. Damit hatte ich vor, EEPROM zu verwenden, in das ich meinen Zählerwert kontinuierlich schreiben werde. Aber ich habe irgendwo gelesen, dass das EEPROM eine Lese- / Schreibdauer von etwa 100.000 hat, und ich werde diesen Zähler wahrscheinlich 120.000 pro 24 Stunden aktualisieren. Also suche ich nach Alternativen, um diese Aufgabe zu erfüllen. Bitte geben Sie mir Ihren Vorschlag, dasselbe zu tun.

Verwenden Sie ein großes EPROM und führen Sie Verschleißnivellierung durch?
Können Sie RAM + Stromausfallerkennung verwenden? So wird es normalerweise gemacht.
EEPROM ist wahrscheinlich nicht die geeignetste Lösung. Ansonsten können Sie versuchen, die Häufigkeit des Schreibens zu verringern, wenn Ihre Anforderungen dies zulassen. Möglicherweise möchten Sie die Schreibvorgänge auch an zufälligen/laufenden Adressen anstelle derselben durchführen (sicherlich müssen Sie sich eine Datenstruktur einfallen lassen, die diese später abrufen kann.)
Schließen Sie die Abstimmungen erneut. Die Frage bezieht sich nicht auf Wear Levelling.
Es gibt andere Arten von NVRAM als EEPROM oder Flash. Versuchen Sie, nach FRAM- oder MRAM-Chips zu suchen - diese haben eine um mehrere Größenordnungen höhere Lebensdauer.
Ich würde dafür die SPIFFS eines ESP8266 verwenden: 3 MB Speicherplatz, automatisch angepasst. Ohne WLAN verbraucht ESP etwa 15 mA.

Antworten (9)

Eine andere Lösung könnte darin bestehen, einen Mikrocontroller mit nichtflüchtigem FRAM zu verwenden. FRAM leidet nicht unter den gleichen Einschränkungen bei Schreibzyklen wie EEPROM.

Einige der MSP430-Produkte von TI sind mit FRAM erhältlich, hier ist ein Link zu einer Anwendung, die der von Ihnen beschriebenen ähnelt:

MSP430 mit FRAM-Save-State bei Stromausfall

Hier ist der Wikipedia-Artikel zu FRAM: FRAM

Das ist überhaupt keine Lösung, da Multibyte-Schreibvorgänge bei einem Stromausfall immer noch beschädigt werden. Oder schlagen Sie dem OP vor, sich auf ein einzelnes Byte zu beschränken?
@ultimA Die NVS-Bibliothek garantiert 16-Bit-Schreibvorgänge, das OP sagt nicht, wie groß sein Zähler ist. Dies ist nur ein Beispiel, andere Techniken können die Speicherung größerer Datenstrukturen ermöglichen: Non-Volatile Storage (NVS): Bibliothek, die den Umgang mit nichtflüchtigen Daten einfach und robust gegenüber zeitweiligen Stromausfällen oder asynchronen Geräte-Resets macht. MSP430-Bausteine ​​mit nichtflüchtigem FRAM-Speicher garantieren 16-Bit-Schreibvorgänge in allen Szenarien. Häufig handelt es sich bei den zu speichernden Daten um eine größere Struktur. Das NVS enthält Funktionen, die Daten so speichern, dass garantiert der letzte gültige Eintrag ohne Beschädigung wiederhergestellt wird.
FRAM ist eine hervorragende Lösung für dieses Problem. Ich freue mich, hier eine Antwort zu sehen, die seine Verwendung vorschlägt. Wenn es keine gegeben hätte, würde ich eine ähnliche Antwort schreiben. Meine Lösungen mit FRAM speichern immer zwei Kopien der Daten nacheinander. Nur einer davon wird möglicherweise beschädigt. FRAM schreibt auch viel schneller als EEPROM. Jede Kopie der Daten muss auf ihre Korrektheit überprüft werden. Dies kann mit einem einfachen XOR-CRC erfolgen, oder für kleine Datensätze können Sie einfach Daten und ihre Ergänzung in jedem Datensatz speichern. Beim Start prüfen Sie einfach, welche Kopie der gespeicherten Daten gültig ist.
Übrigens schlugen einige Leute scherzhaft vor, Kernspeicher zu verwenden. FRAM ist eine moderne Version der Technologie, die ähnlich funktioniert wie der Kernspeicher.
@MichaelKaras Richtig, es ist eine Art moderne Version des Kernspeichers. Ich glaube, ich habe vor einiger Zeit gelesen, dass der letzte echte Hersteller von Magnetkernspeichern endlich aufgehört hat, ihn herzustellen. Es wurde bis vor kurzem in bestimmten Anwendungen verwendet, weil nichts anderes so strahlungstolerant war.
Wenn ausreichend Platz zur Verfügung steht, kann es auf verschiedene einfache Weise erfolgen, einen Zähler so zu halten, dass er sicher aktualisiert werden kann. Eine einfache Möglichkeit besteht darin, zwei Kopien des Zählers sowie einen Indikator zu haben, für den eine Kopie gültig ist; Wenn der Indikator nur geändert wird, wenn beide Kopien gültig sind, und vor dem Ändern einer der beiden Kopien der Code den Indikator setzt, um anzuzeigen, dass die andere Kopie gültig ist (und nach dem Schreiben den Indikator setzt, um anzuzeigen, dass beide gültig sind), spielt es keine Rolle, welcher Wert wird von etwas gelesen, das während eines Stromausfalls geschrieben wurde.
Was wird ein Preis von FRAM sein? denn hier sind die Kosten ein echtes Problem. Außerdem möchte ich nur 20 Bytes schreiben.
Ein MSP430-Mikrocontroller mit FRAM kostet etwa 3 US-Dollar in Stückzahlen von 1.000 Einheiten. Bei hoher Lautstärke deutlich weniger. Sie können kostenlose Muster erhalten. Ich bin sicher, es gibt Beispiele von anderen Unternehmen und vielleicht sogar eigenständige FRAM-Geräte.
Sie können FRAM-Geräte auch als I2C- oder parallele externe Chips erhalten. Ich kann serielle 16-Kbit-FRAM-Chips von chinesischen Anbietern im Bereich von 1 US-Dollar pro Stück finden (in Mengen von 100). Ich habe jedoch festgestellt, dass europäische Lieferanten dazu neigen, viel mehr für sie zu wollen.
... eigentlich vielleicht nicht so viel wie ich dachte. Ich sehe, Mouser UK hat die FM24CL16B-Chips, die ich mir angesehen habe, für jeweils 1,22 £ (= ~ 1,80 $) auf Rollen von 3.000, und digikey wird sie für nicht viel mehr als den Preis für einen einzelnen Chip herstellen.
@Michael Karas: Ja, die Technik, die Sie beschreiben, ist großartig, aber es ist eine Softwaretechnik und hat nichts mit der Verwendung von FRAM zu tun. Diese Lösung würde genauso gut mit herkömmlichem EEPROM funktionieren. Daher ist die Lösung des OP-Problems nicht die Verwendung von FRAM, sondern die Verwendung entsprechender Techniken in der Software (oder der Notstromversorgung, wie andere vorgeschlagen haben). Die Verwendung von FRAM kann aus anderen Gründen (Geschwindigkeit usw.) immer noch vorteilhaft sein, aber im Allgemeinen hilft es nicht bei der Sicherheit gegen Stromausfälle, außer dass Sie weniger Zeit zum Überbrücken haben, wenn Sie Notstrom verwenden.
@ultimA Das stimmt, aber wenn Sie viele Stromausfälle oder Unterbrechungen über eine lange Lebensdauer erwarten, hat FRAM den Vorteil von viel mehr Schreibzyklen.

Ich habe dieses Problem in einem aktuellen Projekt.

Die Art und Weise, wie ich damit umgehe, besteht darin, den Live-Wert des Zählers im RAM zu halten. Ich habe ein wenig Hardware hinzugefügt, damit der Mikrocontroller erkennen kann, dass die rohe Eingangsspannung niedrig ist. Wenn dies der Fall ist, stoppt es, was es tut, speichert den Live-Zählerwert im EEPROM und wartet dann, um die Rohspannung zu beobachten. Wenn es mit einer gewissen Hysterese wieder hochgeht, startet das Mikro im Wesentlichen neu. Andernfalls, wenn die Stromversorgung weiter abfällt, wird das Mikro schließlich gestoppt. Beim nächsten Neustart wird der Zählerwert aus dem EEPROM geladen und dann bis zum nächsten Ausschalten wieder live im RAM verwendet.

Es dauert nicht lange, einen kleinen Wert in das EEPROM zu schreiben. Höchstwahrscheinlich verfügt Ihr vorhandenes Stromversorgungssystem über genügend Energiespeicher, um einen Spannungsabfall zu erkennen, und hat dennoch genügend garantierte Laufzeit, bevor die Stromversorgung des Mikros unter die Betriebs- oder EEPROM-Schreibschwelle fällt.

In meinem Fall war die einzige zusätzliche Hardware eine Schottky-Diode, um zu verhindern, dass die Gleichstromversorgung auf dem Weg nach unten Ladung aus dem lokalen Reservoir saugt, und zwei Widerstände als Spannungsteiler, damit das Mikro die rohe Eingangsspannung lesen kann. Der Rest ist Firmware.

Es ist wichtig zu beachten, dass Sie die Spannung am Eingang zu der Endversorgung beobachten sollten, die das Mikro mit Strom versorgt, und nicht die Leistungsspannung des Mikros direkt. Wenn letzterer niedrig wird, kann es zu spät sein. Hoffentlich gibt es einen Spannungsbereich, der unter dem schlimmsten Fall liegt, wenn alles korrekt funktioniert, und über dem, was die Stromversorgung des Mikros benötigt, um eine geregelte Spannung für das Mikro zu gewährleisten. In meinem Fall war die Versorgung des Mikros ein Abwärtsregler, der von 48 V gespeist wurde, sodass es einen großen Bereich gibt, der unter dem Normalwert liegt, in dem das Mikro jedoch noch zuverlässig arbeiten kann.

Alte alte alte Lösung, CMOS-Zähler + Lithiumbatterie oder Ram + Lithiumbatterie.

Die Energieversorgung für das Speicherelement kommt von der normalen Energieversorgung, wenn sie verfügbar ist, oder von der Batterie, wenn sie nicht verfügbar ist.

Viele moderne Mikros im Ruhezustand behalten ihren Zustand mit einer sehr geringen Stromzufuhr bei. Sie können also diese Technik mit Stromausfallerkennung verwenden, um in den Ruhezustand zu wechseln, und dann eine Batterie verwenden, um den Zustand während der Ruhephase aufrechtzuerhalten, während die Hauptversorgung ausgeschaltet ist.

Eine noch ältere Lösung sind Magnetkernspeicher.
Wollte nur dasselbe beantworten :) Hier ist das zu verwendende Gerät datasheets.maximintegrated.com/en/ds/DS1307.pdf
@glen_geek Auch ich kann mich nicht erinnern, das benutzt zu haben. :)

Microchip verfügt über eine Reihe von I 2 C-"EERAM"-Teilen, die es ermöglichen, Daten im SRAM zu speichern und sie dann bei Stromausfall in das EEPROM zu schreiben (unter Verwendung der in einem Kondensator gespeicherten Energie), um bei Stromrückkehr geladen zu werden. Dies scheint für Ihre Anwendung perfekt zu sein.

Ein repräsentatives Beispiel für diese Teile ist der 47L04 .

Eine andere Lösung.

Erkennen Sie einen Stromausfall und verwenden Sie eine Supercap oder eine Nicht-Supercap, um die Stromversorgung für einige Millisekunden aufrechtzuerhalten. Nutzen Sie diese Zeit, um Ihren Zählerstand in das EPROM zu schreiben. Nur beim Ausschalten in EPROM schreiben. Anzahl der EPROM-Zyklen = Anzahl der Abschaltzyklen.

Verwenden Sie einen FRAM-Chip wie den FM24C04B. Sie haben eine sehr hohe Schreibdauer und sind nicht flüchtig.

https://www.mouser.com/ds/2/100/001-84446_FM24C04B_4_KBIT_512_X_8_SERIAL_I2C_F-RAM-477782.pdf

Sie können auch ein batteriegestütztes SRAM-Modul (NVRAM) verwenden. Zum Beispiel M48Z02-150PC1

https://www.mouser.com/ds/2/389/m48z02-955115.pdf

In anderen Regionen bin ich mir nicht sicher, aber hier in Großbritannien ist Digikey für FRAM-Teile viel billiger als Mouser. Und wie immer, solange Sie einen Lieferanten finden, auf den Sie sich verlassen können (oder wenn Sie nur eine kleine Auflage benötigen und mit der Chance leben können, es mit einem möglicherweise nicht vertrauenswürdigen Lieferanten zu tun), gibt es viele chinesische Lieferanten, die sich erheblich verbessern können beide Preise.

Ich habe mich für "ds1307 RTC" entschieden. Weil es 54 Byte stromunterstützten SRAM hat. was einen unendlichen Lese-/Schreibzyklus ermöglicht.

Wenn Ihr eingebettetes Projekt NIC enthält, senden Sie Ihren Zähler an den Remote-Computer/Server. Es scheint, dass 120.000 Iterationen in 24 Stunden etwa eine Iteration in 0,72 Sekunden sind und für den Netzwerkverkehr in Ordnung sein sollten.

Der Server hat immer den letzten Wert des Zählers gespeichert. Keine Beschädigung des Zählerwerts bei Stromausfall, da ein gültiges Paket ausgegeben werden muss, um den Wert auf dem Server zu aktualisieren; erfordert jedoch ständige Konnektivität, oder es muss ein spezielles Zeitüberschreitungsprotokoll entwickelt werden. Als Bonus können Sie Ihr Gerät bei Bedarf auch aus der Ferne steuern.

Wenn die Anforderung darin besteht, einen Frame-Zähler zu implementieren, um Replay-Angriffe zu verhindern und ansonsten die Protokollkonformität zu gewährleisten, wie werden Sie den Wert an das Gerät senden?

A) Verwenden Sie einen 100-µF-Kondensator (oder größer), um den Zähler während der Ausschaltzeit einzuschalten. Oder welche Logik auch immer erforderlich ist, um den Zählerwert zu halten.

B) Verwenden Sie Magnetkernspeicher , die möglicherweise etwas schwierig einzurichten sind.

C) Machen Sie ein motorgesteuertes Potentiometer (wie ein Servo), irgendwann läuft Ihr Zähler über, oder? Bilden Sie das auf 360 Grad ab. Machen Sie dann eine Rückkopplungsschleife, damit Sie den Wert des Potentiometers digital einstellen und digital ablesen können.

D) Senden Sie Ihren Zählerwert einmal pro Minute an einen oder mehrere Server und lassen Sie sie sich den Wert während der Auszeit für Sie merken. Sobald die Stromversorgung wiederhergestellt ist, rufen Sie den Zählerwert zurück.

Kann man Kernspeicher überhaupt noch kaufen?
@BeB00 Ich weiß nicht, das ist vor meiner Zeit. Aber ich würde eine Sechskantmutter für 2-mm-Gewindestangen verwenden, durch die einige Drähte wie eine Ringspule gewickelt sind. - Und dann zurück zu der Schaltung, die üblicherweise mit dem Kernspeicher verwendet wird. Ich nehme an, dass nur ein ADC gut genug wäre, um zu lesen, wenn die Hysterese des Kerns in die andere Richtung geht und Energie freisetzt.
Ich meine ... vielleicht würde es als Experiment Spaß machen, aber ich würde das definitiv nie in einem System verwenden, das ich zum Arbeiten brauchte
@BeB00 ebay.com/bhp/vintage-core-memory Oh, sieht so aus, als ob es existiert, falls jemand das hochwertige Zeug haben möchte.
:P Ich bin mir nicht sicher, ob es eine Garantie von 60 Jahren gibt