EEPROM à haute endurance

8

Je travaille actuellement sur un projet embarqué dans lequel j'ai un compteur qui sera actif tout le temps. Si l'alimentation tombe en panne, je dois également enregistrer le dernier état du compteur et le recharger au prochain démarrage. Alors que je prévoyais d'utiliser l'EEPROM dans laquelle j'écrirai en continu ma valeur de compteur. Mais j'ai lu quelque part que l'EEPROM a une endurance en lecture / écriture à environ 100 000 et je mettrai à jour ce compteur probablement 120 000 par 24 heures. Je trouve donc des alternatives pour accomplir cette tâche. veuillez me donner votre suggestion pour faire de même.

Nishant Kathiriya
la source
4
Utilisez une grosse eprom et portez-vous un nivellement?
PlasmaHH
5
Duplication possible du niveau d'usure sur l'EEPROM d'un microcontrôleur
PlasmaHH
6
Pouvez-vous utiliser la détection de perte de puissance RAM +? C'est ce qui se fait habituellement.
Bryan Boettcher
1
L'EEPROM n'est probablement pas la solution la plus appropriée. En dehors de cela, vous pouvez essayer de réduire la fréquence d'écriture si vos besoins le permettent. De plus, vous voudrez peut-être effectuer les écritures sur des adresses aléatoires / en cours d'exécution au lieu de la même (vous devrez sûrement trouver une structure de données capable de récupérer cela par la suite.)
Eugene Sh.
2
Il existe d'autres types de NVRAM que l'EEPROM ou le flash. Essayez de rechercher des puces FRAM ou MRAM - celles-ci ont une endurance supérieure de plusieurs ordres de grandeur.
Turbo J

Réponses:

12

Une autre solution pourrait être d'utiliser un microcontrôleur avec FRAM non volatile. FRAM ne souffre pas des mêmes limitations sur les cycles d'écriture que l'EEPROM.

Certains des produits MSP430 de TI sont disponibles avec FRAM, voici un lien vers une application similaire à ce que vous décrivez:

MSP430 avec état de sauvegarde FRAM en cas de panne de courant

Voici l'article Wikipedia sur FRAM: FRAM

John D
la source
Ce n'est pas du tout une solution, car les écritures multi-octets seront toujours corrompues en cas de panne de courant. Ou suggérez-vous que l'OP se limite à un seul octet?
ultimA
1
@ultimA La bibliothèque NVS garantit des écritures 16 bits, l'OP ne dit pas la taille de son compteur. Ceci n'est qu'un exemple, d'autres techniques peuvent permettre le stockage de structures de données plus importantes: Stockage non volatile (NVS): bibliothèque qui rend la gestion des données non volatiles facile et robuste contre les pertes de puissance intermittentes ou les réinitialisations de périphériques asynchrones. Les périphériques MSP430 avec mémoire non volatile FRAM garantissent des écritures 16 bits dans tous les scénarios. Souvent, les données stockées sont une structure plus grande. le NVS contient des fonctions qui stockent les données d'une manière qui est garantie de récupérer la dernière entrée valide sans corruption.
John D
5
FRAM est une excellente solution à ce problème. Je suis heureux de voir ici une réponse suggérant son utilisation. S'il n'y en avait pas eu, j'allais écrire une réponse similaire. Mes solutions utilisant FRAM stockent toujours deux copies des données séquentiellement. Un seul d'entre eux risque d'être corrompu. FRAM écrit également beaucoup plus rapidement que l'EEPROM. Chaque copie des données nécessite un moyen de valider leur exactitude. Cela peut être fait en utilisant un simple CRC XOR ou pour un petit ensemble de données, vous pouvez simplement stocker des données et leur complément dans chaque ensemble de données. Au démarrage, il vous suffit de vérifier quelle copie des données stockées est validée.
Michael Karas
Soit dit en passant, certaines personnes suggéraient en plaisantant l'utilisation de la mémoire centrale. FRAM est une version moderne de la technologie qui fonctionne de la même manière que la mémoire centrale.
Michael Karas
1
Si un espace suffisant est disponible, la conservation d'un compteur d'une manière qui peut être mise à jour en toute sécurité peut être effectuée de plusieurs façons simples. Une façon simple est d'avoir deux copies du compteur ainsi qu'un indicateur pour lequel la copie est valide; si l'indicateur n'est modifié que lorsque les deux copies sont valides, et avant de modifier l'un ou l'autre des codes de copie, il définit l'indicateur pour indiquer que l'autre copie est valide (et après l'écriture, l'indicateur pour montrer que les deux sont valides), alors peu importe la valeur est lu à partir de quelque chose qui était en cours d'écriture lors d'une mise hors tension.
supercat
11

J'ai ce problème dans un projet en cours.

La façon dont je traite est de garder la valeur en direct du compteur dans la RAM. J'ai ajouté un peu de matériel pour que le microcontrôleur puisse détecter que la tension d'alimentation d'entrée brute est faible. Si c'est le cas, il arrête ce qu'il fait, enregistre la valeur du compteur en direct dans l'EEPROM, puis attend de regarder la tension d'alimentation brute. S'il remonte, avec une certaine hystérésis, le micro redémarre essentiellement. Sinon, si l'alimentation continue de baisser, le micro finira par s'arrêter. Au redémarrage suivant, la valeur du compteur est chargée à partir de l'EEPROM, puis réutilisée en direct dans la RAM jusqu'à la prochaine mise hors tension.

Il ne faut pas longtemps pour écrire une petite valeur dans l'EEPROM. Il est fort probable que votre système d'alimentation électrique actuel dispose d'un stockage d'énergie suffisant pour détecter la tension en baisse, tout en ayant suffisamment de temps de fonctionnement garanti avant que l'alimentation du micro ne descende sous le seuil de fonctionnement ou d'écriture EEPROM.

Dans mon cas, le seul matériel supplémentaire était une diode Schottky pour empêcher l'alimentation en courant continu de sucer la charge du réservoir local en descendant, et deux résistances comme diviseur de tension afin que le micro puisse lire la tension d'entrée brute. Le reste est un firmware.

Il est important de noter que vous devez surveiller la tension à l'entrée de l'alimentation finale qui alimente le micro, pas directement la tension d'alimentation du micro. Au moment où ce dernier descend, il est peut-être trop tard. Espérons qu'il existe une plage de tension qui est inférieure au pire des cas lorsque tout fonctionne correctement et au-dessus de ce dont l'alimentation du micro a besoin pour garantir une tension régulée au micro. Dans mon cas, l'alimentation du micro était un régulateur abaisseur alimenté à partir de 48 V, il existe donc une large plage inférieure à la normale mais où le micro peut toujours fonctionner de manière fiable.

Olin Lathrop
la source
4

Vieille vieille vieille solution, compteur cmos + batterie au lithium ou batterie au lithium Ram +.

L'alimentation de l'élément de stockage provient de l'alimentation normale lorsqu'elle est disponible ou de la batterie lorsqu'elle ne l'est pas.

Beaucoup de micros modernes en veille maintiendront leur état avec une très faible alimentation en courant. Vous pouvez donc utiliser cette technique avec détection de mise hors tension pour vous endormir, puis utiliser une batterie pour maintenir l'état pendant la période de sommeil alors que l'alimentation principale est coupée.

RoyC
la source
2
Une solution encore plus ancienne est la mémoire à noyau magnétique.
glen_geek
Je voulais juste répondre à la même chose :) Voici l'appareil pour utiliser les fiches techniques.maximintegrated.com/en/ds/DS1307.pdf
Anonyme
1
@glen_geek Même je ne me souviens pas avoir utilisé ça. :)
RoyC
4

Microchip possède une série de pièces I 2 C "EERAM" qui permettront de stocker les données dans SRAM, puis de les écrire dans l'EEPROM (en utilisant l'énergie stockée dans un condensateur) en cas de coupure de courant, à charger lors du retour de l'alimentation. Cela semble être parfait pour votre application.

Un exemple représentatif de ces pièces est le 47L04 .

duskwuff -inactif-
la source
3

Une autre solution.

Détectez la mise hors tension et utilisez un supercap ou un non super cap pour maintenir le courant pendant quelques millisecondes. Utilisez ce temps pour écrire la valeur de votre compteur dans l'EPROM. N'écrivez sur l'EPROM qu'à la mise hors tension. Nombre de cycles EPROM = nombre de cycles de mise hors tension.

RoyC
la source
3

Utilisez une puce FRAM telle que la FM24C04B. Ils ont une très grande endurance en écriture et sont non volatils.

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

Vous pouvez également utiliser un module SRAM (NVRAM) alimenté par batterie. Par exemple M48Z02-150PC1

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

user4574
la source
Je ne suis pas sûr dans d'autres régions, mais ici au Royaume-Uni, Digikey est beaucoup moins cher que Mouser pour les pièces FRAM. Et comme toujours, tant que vous pouvez trouver un fournisseur sur lequel vous pouvez compter (ou si vous n'avez besoin que d'une petite série et que vous pouvez vivre avec la possibilité de traiter avec un fournisseur potentiellement non fiable), il y a beaucoup de fournisseurs chinois qui peuvent considérablement s'améliorer. les deux prix.
Jules
1

J'ai décidé d'aller avec "ds1307 RTC". Parce qu'il dispose de 54 octets de mémoire SRAM alimentée. qui permet un cycle de lecture / écriture infini.

Nishant Kathiriya
la source
0

Si votre projet intégré contient une carte réseau, envoyez votre compteur à un ordinateur / serveur distant. Il semble que 120 000 itérations en 24 heures soit environ une itération en 0,72 seconde, devrait être OK pour le trafic réseau.

Le serveur aura toujours la dernière valeur du compteur stockée. Aucune corruption de valeur de compteur en cas de perte d'alimentation car un paquet valide doit être émis pour mettre à jour la valeur sur le serveur; nécessite cependant une connectivité constante, ou un protocole spécial de temporisation doit être conçu. De plus, en prime, vous pourrez contrôler votre appareil à distance si nécessaire.

Anonyme
la source
1
Si l'exigence est d'implémenter un compteur de trames pour empêcher les attaques de relecture et garantir autrement la conformité du protocole, comment allez-vous envoyer la valeur au périphérique?
0

A) Utilisez un condensateur de 100 µF (ou plus) pour alimenter le compteur pendant le temps d'arrêt. Ou quelle que soit la logique requise pour conserver la valeur du compteur.

B) Utilisez des mémoires à noyau magnétique , elles peuvent être un peu difficiles à configurer.

C) Faites un potentiomètre commandé par moteur (comme un servo), à un moment donné votre compteur va déborder, non? Mappez cela à 360 degrés. Ensuite, faites une boucle de rétroaction afin que vous puissiez définir la valeur du potentiomètre numériquement et la lire numériquement.

D) Envoyez votre valeur de compteur une fois par minute à un ou plusieurs serveurs, et laissez-les se souvenir de la valeur pour vous pendant le temps d'arrêt. Ensuite, une fois le courant rétabli, récupérez la valeur du compteur.

Harry Svensson
la source
1
Pouvez-vous même encore acheter de la mémoire centrale?
BeB00
@ BeB00 Je ne sais pas, c'est avant mon temps. Mais j'utiliserais un écrou hexagonal pour des tiges filetées de 2 mm avec des fils enroulés à travers comme une bobine toroïdale. - Et puis revenons aux circuits couramment utilisés avec la mémoire centrale. Je suppose qu'un simple ADC serait assez bon à lire, lorsque l'hystérésis du noyau va dans l'autre sens et libère de l'énergie.
Harry Svensson
Je veux dire ... peut-être qu'en tant qu'expérience, ce serait amusant, mais je ne l'utiliserais certainement jamais dans un système sur lequel je devais travailler
BeB00
@ BeB00 ebay.com/bhp/vintage-core-memory Eh bien, on dirait qu'il existe au cas où quelqu'un veut l'étoffe de haute qualité.
Harry Svensson
: P Je ne suis pas sûr que ce soit garanti pendant 60 ans
BeB00