7 votos

¿Resistencia de la EEPROM en el contador de energía?

Estoy diseñando un contador de energía para la facturación de la electricidad convirtiendo un contador de energía analógico y contando el número de pulsos que da el LED del contador analógico. Como la energía puede cortarse en cualquier momento, el número de pulsos tiene que almacenarse en una memoria no volátil. He visto las hojas de datos de la EEPROM AT24C0X de Atmel y las EEPROMS incorporadas de ATmega328 y PIC16F877A, y he encontrado que todas tienen una resistencia de lectura/escritura de un máximo de 1000000.

En este contexto, ¿cómo se aborda el problema de la duración de la EEPROM en los contadores de energía comerciales?

2 votos

¿no podrías usar otro tipo de sram? datasheets.maximintegrated.com/es/ds/DS1350W.pdf presume de ciclos de lectura/escritura ilimitados y de 10 años de retención... por supuesto hay chips más sencillos, que utilizan conexiones spi/otras conexiones en serie con un número de pines muy reducido

1 votos

16voto

RelaXNow Puntos 1164

Yo no escribiría cada evento en la EEPROM. La mayor parte del tiempo tendrás energía, así que mantén el conteo en vivo en la RAM.

La cantidad de energía que se necesita para guardar el valor vivo de la RAM a la EEPROM es bastante mínima. Utiliza un condensador para almacenar suficiente energía para que el micro funcione el tiempo suficiente después de que se detecte un fallo de alimentación para copiar los datos en vivo en la EEPROM, y luego apágalo limpiamente. Sólo deberías necesitar unos 10s de ms como máximo, tal vez sólo unos pocos ms. También necesitas ser capaz de detectar un fallo de alimentación lo suficientemente pronto como para que todavía haya energía en la tapa para realizar la secuencia de apagado limpio. Esto no debería ser difícil.

Por ejemplo, digamos que el micro requiere 20 mA a 3,3 V (que en realidad es bastante alto para este tipo de aplicación) y que el apagado tarda 20 ms. Eso es (20 mA)(3,3 V)(20 ms) = 1,3 mJ. Un tapón de 470 µF cargado a 12 V contiene 34 mJ, por ejemplo. Digamos que normalmente mantienes la tapa cargada a 12 V, y detectas un fallo de alimentación cuando baja a 11 V. En ese momento le quedan 28 mJ. Para sacar 2 mJ más sólo hay que vaciarla a 10,6 V.

Estos son sólo números que saqué del aire como ejemplo. Una tapa de 470 µF y 16 V no sería gran cosa para añadir al dispositivo, pero incluso eso es claramente más de lo necesario en este caso. El punto es mostrar que este método es bastante factible.

2 votos

+1, los micros son rápidos y pueden responder en un instante. La parte difícil en mi mente es, irónicamente, porque usted está tratando con una señal de alimentación lenta de 60 Hz que tendría que ser suficiente espacio de cabeza entre la carga / descarga y lo que su entrada LDO es para disparar de forma fiable fuera de.

0 votos

+1; esa fue mi reacción inmediata y empecé a publicarlo como comentario; luego vi el tuyo. Para quien tenga problemas para visualizarlo, piense en la tapa y la detección de energía como un "micro SAI" que indica al "ordenador" (el contador) que debe apagarse limpiamente antes de que el SAI se agote.

8voto

Bernd Puntos 61

La solución al problema es relativamente sencilla. Acumulas el recuento de pulsos en una ubicación regular de la RAM. Luego, una vez cada 10 minutos se copia el valor actual del contador basado en la RAM a la EEPROM. Utilizando esta estrategia, una EEPROM con una resistencia de un millón de ciclos durará unos 19 años. Para la mayoría de los productos esta es una buena comparación con el ciclo de vida esperado del producto.

Si se produce una pérdida repentina de energía, como máximo se perderán 10 minutos de acumulación de pulsos.

Hay una estrategia adicional que debe tenerse en cuenta para este tipo de aplicación de la EEPROM. Debido a la posibilidad de una pérdida repentina de energía y a la posible corrupción de la operación de escritura de la EEPROM, siempre debes almacenar los datos en la EEPROM con un simple código de comprobación de un byte de tipo XOR para que puedas validar los datos de la EEPROM como buenos. Luego, cuando vayas a almacenar los datos cada 10 minutos, almacena DOS copias de los datos y del código de comprobación. Asegúrese de que una copia está completamente almacenada antes de comenzar con la segunda copia. La razón de almacenar las dos copias es para que si se produce una pérdida de energía mientras se escribe una copia, la otra copia siga ahí. En el caso de que la primera operación de almacenamiento se corrompa, la segunda copia conservará los datos de la operación de almacenamiento anterior de 10 minutos.

Cada vez que su microcontrolador se pone en marcha lee la primera copia de los datos de la EEPROM en la ubicación de trabajo de la RAM y valida su código de comprobación. Si la comprobación es correcta, proceda al funcionamiento normal del producto. Si la primera comprobación es mala, lea la segunda copia de los datos de la EEPROM y compruébela. Si esa copia está bien, puede continuar con el funcionamiento normal. En el caso improbable de que ambos códigos de comprobación sean malos, deberá poner a cero el valor del contador y notificar a la oficina central que ha habido un problema.

Si su producto tiene un proceso normal de encendido/apagado iniciado por el usuario, entonces como parte de su secuencia normal de apagado puede almacenar los datos en la EEPROM en ese caso. Para que esto sea efectivo, la solicitud de apagado debe venir como una señal al microcontrolador para que pueda realizar cualquier detalle de último momento como este y luego una salida separada controlada por el firmware del microcontrolador realmente hace la acción de apagar la energía.

He utilizado este esquema en múltiples productos comerciales con buen éxito. Está un poco más allá del alcance de esta respuesta discutir el simple código de verificación XOR de un byte que se utiliza para comprobar la validez de los datos de la EEPROM. Dicho esto, puedo compartir ese algoritmo con cualquiera que esté interesado.

0 votos

El contador de energía es alimentado por el suministro de electricidad. No hay certeza cuando la electricidad se corta. En caso de corte de energía, ¿cómo puedo hacer frente a la situación?

1 votos

Lo manejas como lo describí en detalle en mi respuesta. Si se corta la alimentación, como mucho se pierde la acumulación de impulsos desde la última operación de almacenamiento de la EEPROM. Este esquema puede parecer inaceptable para algunas personas porque puedes perder algunos conteos pero tienes que sopesar eso contra la frecuencia con la que ocurre la pérdida de energía.

2 votos

Si el simple esquema de EEPROM que describo no es "lo suficientemente bueno", entonces hay que recurrir a una RAM externa en serie que se respalde desde una célula de batería o una supercápsula. Dado que muchos productos tienen una función RTC puede ser ventajoso seleccionar el chip RTC que tiene algunas células RAM que pueden ser utilizadas para este tipo de almacenamiento de parámetros.

3voto

hirschhornsalz Puntos 255

Recuerdo remotamente haber leído una nota de aplicación de Atmel que cubría ese tema. Ver AVR101 sobre la técnica de almacenamiento de EEPROM de alta resistencia utilizando un búfer circular y proporcionando protección de reinicio.

3voto

kyle Puntos 274

1.000.000 de ciclos de borrado es mucho, pero se puede quemar rápidamente como te has dado cuenta. Para lecturas de una vez por segundo, eso se cumpliría en 11,6 días.

Como ya se ha mencionado, almacenar en la RAM y luego escribir en la EEPROM sólo ocasionalmente es una forma.

Otra forma es utilizar la EEPROM FLASH. Con la FLASH lo único que importa es la cuenta de borrado. Puedes escribir muchas veces convirtiendo 1s en 0s sin penalización. Si sólo tienes unas pocas lecturas y una cantidad relativamente grande de espacio FLASH, puedes usar registros.

Borra los datos, dejándolos todos 0xFF.

Para las escrituras: Escribe secuencialmente en el espacio de la EEPROM. Cuando esté llena, bórrala toda y vuelve a empezar. Si tu valor de datos es todo 0xFF, tienes que cambiarlo por un LSB para evitar que parezca un registro en blanco. En tu caso, eso sería una condición de desbordamiento de todos modos.

Para leer: Busca el registro de todo-0xFFs, y retrocede uno. Si llegas al final y no hay ningún registro all-0xFFs, es la última posición.

La resistencia de FLASH suele ser menor... digamos 100.000. Sin embargo, una simple FLASH de 1Mbit tendría espacio suficiente para casi 104 años de almacenamiento utilizando este método.

Para un producto comercial como éste, debería tener seguridad contra fallos de alimentación en las escrituras de la EEPROM. O bien se añade la detección de fallos de alimentación y suficiente energía de reserva (supercap, lo que sea) para completar una operación de escritura... o bien se realizan las escrituras a prueba de fallos. Para hacer esto, podrías dividir la EEPROM en dos mitades, alternar entre las mitades en las escrituras, y escribir un CRC con el registro de datos. La lectura buscaría el último registro en cualquier página con un CRC válido. Las mitades deben estar alineadas con el bloque de borrado por seguridad.

Sin embargo, las empresas de servicios públicos suelen querer algo más que la potencia total utilizada. Considere la posibilidad de llevar un registro de los recuentos/segundo que obtiene y guarde también estas cifras. La mayoría de las empresas de servicios públicos cobran a los clientes comerciales en función de la potencia máxima que necesitan en un intervalo de 15 minutos aproximadamente.

3voto

KayJay Puntos 26

He tenido un problema similar cuando necesito almacenar datos de estado en tiempo de ejecución. Uso I2C ferromagnética RAM F-RAM ( http://uk.farnell.com/ramtron/fm24c04b-g/fram-4k-i2c-8soic/dp/2077745?Ntt=2077745 ). La resistencia es de hecho ilimitada (10^14 lecturas/escrituras). El precio es mayor que el de una EEPROM normal, pero sigue siendo conveniente.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X