resistencia de EEPROM en medidor de energía?

7

Estoy diseñando un medidor de energía para fines de facturación de electricidad convirtiendo un medidor de energía analógico y contando el número de pulsos dados por el LED del medidor analógico. Dado que la alimentación puede interrumpirse en cualquier momento, el número de pulsos debe almacenarse en una memoria no volátil. Vi las hojas de datos de Atmel EEPROM AT24C0X y las EEPROM incorporadas de ATmega328 y PIC16F877A, y encontré 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 resistencia a la vida EEPROM en los medidores de energía comercial?

    

5 respuestas

16

No escribiría todos los eventos en EEPROM. La mayoría de las veces tendrás potencia, así que mantén el conteo en vivo en la RAM.

La cantidad de energía que se necesita para guardar el valor en vivo de la RAM a la EEPROM es bastante mínima. Use un condensador para almacenar suficiente energía para hacer funcionar el micro lo suficiente después de que se detecte una falla de energía para copiar los datos en tiempo real en la EEPROM, luego, apague de manera limpia. Solo debe necesitar unos 10s de ms como máximo, tal vez solo unos pocos ms. También debe poder detectar fallas de energía lo suficientemente temprano para que aún haya energía en la tapa para realizar la secuencia de apagado limpio. Aunque 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. Una tapa de 470 µF cargada a 12 V contiene 34 mJ, por ejemplo. Digamos que normalmente mantienes la tapa cargada a 12 V, y detectas una falla de energía cuando baja a 11 V. En ese punto, le quedan 28 mJ. Para obtener 2 mJ más, solo es necesario drenarlos a 10.6 V.

Estos son solo números que saqué del aire como ejemplo. Una tapa de 470 µF 16 V no sería una gran cosa para agregar 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.

    
respondido por el Olin Lathrop
8

La solución al problema es relativamente simple. Acumulas el recuento de pulsos en una ubicación de RAM normal. Luego, una vez cada 10 minutos, copie el valor actual del contador basado en RAM a EEPROM. Usando esta estrategia, una EEPROM con una resistencia de un millón de ciclos durará aproximadamente 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 tiene una pérdida repentina de energía, a lo sumo, perderá 10 minutos de acumulación de pulsos.

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

Cada vez que se inicie su microcontrolador, lea la primera copia de los datos de la EEPROM en la ubicación de trabajo de la RAM y valide su código de verificación. Si la comprobación es correcta, continúe con el funcionamiento normal del producto. Si la primera verificación es incorrecta, lea la segunda copia de los datos de la EEPROM y verifíquela. Si esa copia sale bien, entonces es bueno continuar con el funcionamiento normal. En el caso improbable de que los dos códigos de verificación sean incorrectos, debe restablecer a cero el valor de su contador y luego notificar a la oficina en casa que hubo un problema.

Si su producto tiene un proceso de encendido / apagado iniciado por el usuario normal, 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 último segundo como éste y luego una salida controlada por el firmware del microcontrolador realiza la acción para apagar la alimentación.

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

    
respondido por el Michael Karas
3

Recuerdo de forma remota haber leído una Nota de aplicación Atmel que cubre ese tema. Consulte AVR101 acerca de la técnica de almacenamiento de alta resistencia de EEPROM utilizando un búfer circular y proporcionando protección de restablecimiento.

    
respondido por el Ghanima
3

1,000,000 ciclos de borrado es mucho, pero puedes quemarlo rápidamente como te diste cuenta. Para lecturas de una vez por segundo, eso se cumpliría en 11.6 días.

Como ya se mencionó, almacenar en la RAM y luego escribir en la EEPROM solo ocasionalmente es una forma.

Otra forma es usar FLASH EEPROM. Con FLASH solo importa el recuento de borrados. Puedes escribir muchas veces convirtiendo 1s en 0s sin penalización. Si solo tiene unas pocas lecturas y una cantidad relativamente grande de espacio FLASH, puede usar los registros.

Borre los datos, dejándolos todos 0xFFs.

Para escrituras: Escribir secuencialmente en el espacio EEPROM. Cuando estés lleno, borra todo y vuelve a empezar. Si su valor de datos es todos 0xFFs, debe cambiarlo por un LSB para evitar parecer un registro en blanco. En su caso, esa sería una condición de desbordamiento de todos modos.

Para las lecturas: Busque el registro de todos los 0xFF y haga una copia de seguridad de uno. Si llegas al final y no hay un registro de todos los 0xFF, la última posición es esa.

La resistencia de FLASH es usualmente más baja ... digamos 100,000. Sin embargo, un simple FLASH de 1Mbit tendría suficiente espacio para casi 104 años de almacenamiento con este método.

Para un producto comercial como este, debe tener seguridad de falla de energía en las escrituras de EEPROM. Agregue detección de falla de energía y suficiente energía de respaldo (supercap, lo que sea) para completar una operación de escritura ... o realice las escrituras de manera segura. Para hacer esto, puede dividir la EEPROM en dos mitades, alternar entre mitades en las escrituras y escribir un CRC con el registro de datos. La lectura buscará el último registro en cualquiera de las páginas con un CRC válido. Las mitades deben estar alineadas con un bloque de borrado para su seguridad.

Sin embargo, las utilidades generalmente quieren algo más que la potencia total utilizada. Considere llevar la cuenta de cuántos conteos / segundo obtiene y almacene estos números también. La mayoría de las empresas de servicios públicos cobran a los clientes comerciales según la potencia máxima que necesitan en un intervalo de 15 minutos aproximadamente.     

respondido por el darron
3

Tuve un problema similar cuando necesito almacenar datos de estado de tiempo de ejecución. Utilizo el F-RAM ferromagnético I2C RAM ( enlace ). La resistencia es de hecho ilimitada (10 ^ 14 lecturas / escrituras). El precio es más alto que la EEPROM normal pero sigue siendo conveniente.

    
respondido por el TMa

Lea otras preguntas en las etiquetas