Estoy diseñando un dispositivo que ajusta automáticamente su posición física a medida que cambia la temperatura. Si el dispositivo se apaga o se desconecta la alimentación, el dispositivo debe recordar su última temperatura y posición. Tengo la capacidad de almacenar estos valores en EEPROM, pero el problema es que la posición y la temperatura podrían estar cambiando muy rápidamente. Si tuviera que escribir la temperatura y la posición en EEPROM después de cada cambio, eso (1) ralentizaría un poco el firmware y (2) probablemente mataría la EEPROM después de un año o dos. Entonces, como lo veo, mis opciones son las siguientes ...
1) use un condensador / batería para mantener el dispositivo encendido por un corto tiempo después de que se pierde la energía para que pueda escribir los valores en EEPROM solo en ese momento. No me gusta esto porque el tablero tiene un poco de hambre de energía y esto requeriría una gran capitalización. Y no tengo un montón de espacio libre. Y no quiero el costo adicional de una batería y un soporte de batería / o una tapa grande.
2) use F-RAM en lugar de EEPROM para poder escribirle billones de veces sin desgastarlo. No me gusta esta opción porque FRAM es bastante más caro que EEPROM y esto es para un producto de producción (no solo uno).
3) Solo escriba la posición y la temperatura cada 5 minutos más o menos. De esa manera, siempre tengo una posición / temperatura bastante reciente registrada, pero no escribo cada segundo, por lo que mi programa no se ralentiza y la EEPROM no morirá tan rápido. Esta parece ser mi mejor opción.
¿Alguien más tiene alguna sugerencia en la que no esté pensando?
fuente
Respuestas:
Lo que necesita es una técnica llamada nivelación de desgaste . No escribe sus datos cada vez en la misma ubicación en la EEPROM, pero usa algún algoritmo para usar diferentes ubicaciones. He leído sobre algoritmos complejos de nivelación de desgaste, pero no sabría por qué el siguiente método simple no funcionaría.
Agregue a sus datos un contador de 24 bits, de modo que su bloque de datos tenga, por ejemplo, 8 bytes de longitud. Las páginas en un 24AA64 tienen una longitud de 32 bytes, por lo que una EEPROM de 64 kb tiene 256 páginas. De la hoja de datos:
por lo que no tiene sentido usar bloques de datos más pequeños que una página de 32 bytes.
Mira el contador de la primera página. Si es cero, usó el número máximo de ciclos de escritura para esa página, por lo que pasa a la página siguiente y verifica ese contador. Repita hasta encontrar un contador> cero. Esa es la página que estás usando actualmente. Las EEPROM de Microchip tienen una resistencia de 1 millón de ciclos, que puede aumentar a 256 millones con el ejemplo dado de un máximo de 32 bytes por bloque en una EEPROM de 64 kb. Eso debería ser suficiente para durar más que su producto: 40 años si escribe una vez cada 5 segundos (!).
Querrá inicializar su EEPROM en el primer uso. ¿Cómo sabes cuándo es eso? Use la última página para escribir una firma única después de la inicialización. Compruebe en cada encendido si la firma está allí. Si no es así, el dispositivo debe ser inicializado. Puede preestablecer el contador en cada página con 0xF4240 (para 1 millón) o borrar todo a 0xFF y escribir el 0xF4240 cuando use la página por primera vez.
Se necesita inicializar una EEPROM porque a veces se le escribe un cierto patrón en el proceso de producción / prueba.
editar
La nivelación del desgaste debería resolver sus problemas, pero aún quiero comentar sobre la solución del condensador. Usted dice que la placa necesita bastante energía, pero tal vez pueda aislar la potencia del microcontrolador / EEPROM del resto de la placa con un diodo. Por lo tanto, probablemente solo necesitará unos pocos mA cuando la alimentación principal se haya agotado. El 24AA64 escribe una página en menos de 5 ms, luego a 10 mA y una caída de voltaje permitida de 100 mV necesitará
Fácil con un pequeño supercap.
lectura adicional
hoja de datos 24AA64
EEPROM Endurance Tutorial
fuente
1) Una vez que haya comenzado el proceso de escritura, solo necesita alimentar la MCU / EEPROM y asegurarse de que las líneas de control no tengan fallas; I2C probablemente sea preferible a SPI para esto. Solo necesita unos pocos mA durante unos pocos milisegundos, por lo que no debería ser un gran límite, y podría poner la MCU en suspensión una vez que se inicia la escritura. 3) probablemente pueda aplicar algo de inteligencia, por ejemplo, un retraso: una vez escrito, siempre tiene cierto tiempo antes de que pueda ocurrir otra escritura. O espere hasta que el valor sea estable por un tiempo antes de escribir.
También puede aumentar la resistencia distribuyendo los datos en varias ubicaciones. Microchip tiene algunas herramientas y notas para calcular la resistencia de sus eeproms, lo que puede ser útil.
fuente
Sugeriría usar un dispositivo flash orientado a bloques y usar un byte de cada bloque como indicador de modo. Mantenga como invariante que casi todas las banderas de modo serán programadas; solo habrá un bloque donde el indicador de modo no esté programado, pero sí el bloque anterior (ajuste si es necesario) Ese bloque será el que tenga los datos más recientes. Cuando ese bloque se llene, borre el siguiente bloque (tenga en cuenta que el bloque que se está borrando podría contener cualquier combinación de datos durante el ciclo de borrado, y el invariante aún se mantendría), luego, una vez que el borrado haya terminado, programe el indicador de modo en lo que solía Ser el último bloque.
Será necesario proteger el suministro al flash lo suficientemente bien como para garantizar que cualquier intento de programar un byte tenga éxito o falle por completo, pero no importará si se interrumpe un ciclo de borrado dejando un bloque lleno de datos arbitrarios, ya que el próximo intento de escribir una entrada de datos volverá a borrar ese bloque.
Si sus datos son de 16 bits, un chip de 64Kx8 contendrá más de 32,000 entradas. Escribir una entrada por segundo llenaría el chip aproximadamente 2.7 veces. Incluso un chip con una resistencia de "solo" ciclos de borrado de 10K duraría más de 10 años. El uso de un chip más grande, o uno con resistencia de 100K, aumentaría la vida útil proporcionalmente.
fuente
1) Posiblemente la opción más simple, aunque puede requerir cambios de hardware. He logrado esto antes sin modificaciones de PBC simplemente aumentando las tapas de desacoplamiento e interrumpiendo el oscurecimiento.
2) Como ha señalado, ¡el problema con FRAM es el precio!
3) Dependiendo de la volatilidad de sus datos de temperatura y posición, aumentará la resistencia escribiendo solo si el valor ha cambiado. Es posible que esté muestreando la temperatura una vez por segundo, pero si solo cambia cada 5 minutos, el problema está resuelto.
fuente
Así es como resolví este problema en mi proyecto:
Reserve 1 sector de flash para mantener una máscara de bits de ranuras no utilizadas y una serie de ranuras para el valor.
La máscara de bits que utilicé tenía 16 bytes de longitud, por lo que tenía 128 espacios para poner valores.
La máscara de bits se inicializa en todos los que, en términos flash, es el estado borrado.
Cuando desee escribir un nuevo valor, lea en la máscara de bits y encuentre el primer bit que es uno. Este es el número de ranura donde escribirá el valor. Cambie ese bit a cero para marcarlo como usado y vuelva a escribir la máscara de bits en flash sin antes borrarlo. A continuación, escriba el valor en la ranura después de la máscara de bits también sin borrar el flash.
De esta manera, extiende los ciclos de escritura flash 128 veces escribiendo la nueva máscara de bits con solo un cambio de uno a cero.
Si toda la máscara de bits es 0, borre el sector flash y comience de cero.
fuente