Saludos, lector.
Muy a menudo, tengo la tarea de desarrollar dispositivos portátiles alimentados por una batería de iones de litio de una sola celda. Y, si esto generalmente no es una preocupación para el cliente, entonces, como ingeniero experimentado, un escalofrío recorre mi espalda cuando veo tal TK. Esto se debe al hecho de que evaluar el nivel de la batería, así como la vida útil restante de la batería, es una tarea muy difícil, aunque a primera vista puede parecer diferente.

Hay varias opciones de acción en este caso, hablaremos de ellas a continuación.
- Lo más simple es no hacer nada para determinar el nivel de carga de la batería. El circuito de carga en una memoria lineal simple (por ejemplo, en TP4054) y un convertidor de voltaje para alimentar el dispositivo. Se apaga sin previo aviso y en el momento más inoportuno.
- Medir el voltaje de la batería. El resultado es aproximadamente el mismo que el párrafo anterior, pero requiere más esfuerzo. Esquema de medida típico:

De hecho, este es un divisor de voltaje para las resistencias R19 y R21, conectado a través de una tecla VT6. El transistor VT7 es necesario para eliminar la potencia parasitaria al MK a través del terminal EN.
VBAT - voltaje de la batería
VBAT_mes: voltaje que llega al ADC
EN - señal de control del divisor (0-off, 1-on)
Ahora que conocemos el voltaje de la batería, somos grandes compañeros. ¡PERO no da casi nada! El hecho es que una curva de descarga típica de una batería de iones de litio, por decirlo suavemente, no es lineal y depende del consumo de corriente y la temperatura de la batería en sí:

Mirando estos gráficos, ¿puede decir cuál es la capacidad restante de la batería a un voltaje de 3.5V? Creo que no ...
Este método se puede mejorar un poco utilizando el sensor de temperatura incorporado en el MC para una estimación aproximada de la temperatura de la batería, o puede colocar un sensor para medir la corriente o (si la corriente de consumo es aproximadamente constante) construir una curva de descarga para un consumo de corriente típico. Esto permitirá al menos una pequeña justificación de los costos laborales, pero no se puede hablar de ninguna precisión. Para indicar la carga en 3 LED, sí, lo hará.
En el caso del consumo de corriente constante, puede tomar la vida útil de la batería y estimar la carga consumida y el tiempo dedicado a la carga para evaluar la carga acumulada. Este método produce un error acumulativo, ya que la calibración solo puede realizarse en dos puntos (carga completa o descarga completa), y no siempre se logran. Además, a medida que la batería se deteriora, se debe ajustar el tiempo de funcionamiento máximo, pero en general, el método tiene derecho a la vida.
- Haga su propio sistema de monitoreo de carga de batería (BMS). Para su implementación, necesitamos sensores de corriente, temperatura y voltaje de batería. Creemos que MK ya existe en el dispositivo y sigue siendo "solo" escribir software para él, lo que en un momento me llevó un poco menos de un año.
- Tome el chip del medidor de gas terminado (por ejemplo, de TI o Maxim Integrated), configúrelo, calibre y trabaje. Por ejemplo, el diagrama para bq27220:

Hay varios matices al elegir este concepto:
- En caso de que la batería sea extraíble, debe colocar el circuito para determinar la carga en la batería (de lo contrario, se restablecerá a cero cuando se desconecte), o utilizar versiones especiales de Medidor de gas que permitan la desconexión de la batería. En el primer caso, la batería de su dispositivo se vuelve única y su reemplazo solo es posible con su participación, lo que no siempre es conveniente. En el segundo caso, existe el problema de colocar el sensor de temperatura en la batería.
- Solución de alto costo. Componentes principales: chip de medidor de gas, chip de protección, transistores, termistor, resistencia del sensor de corriente.
- Use opciones más simples para soluciones llave en mano como CW2015:

Este es el análogo chino del chip MAX17048. Un chip absolutamente simple sin sensores de temperatura y corriente, con baja precisión correspondiente, pero al mismo tiempo barato, fácil de usar y programar. Tiene la capacidad de funcionar en el lateral del dispositivo, lo que permite no modificar la batería en sí. El microcircuito se encontró en los espacios abiertos de la red en el proceso de escribir material, no hay experiencia con él, pero hay un deseo de probarlo, porque la opción es realmente interesante. Quizás en el próximo artículo hablaré sobre este chip con más detalle.
- Y finalmente, el último método que sé que quiero dedicar al artículo de hoy. En mi opinión, este método es el más simple, pero ofrece el mejor resultado. Consiste en el hecho de que tomamos la batería del iPhone con medidor de gas y protección incorporados, nos conectamos a través de HDQ o I2C, interrogamos y trabajamos. En este caso, la batería ya está ensamblada y calibrada. A continuación hay una tabla con las opciones de batería que conozco:

La tabla está parcialmente tomada de los sitios
ripitapart.com y
www.macplus.ru . Preste especial atención al controlador desconocido marcado A1141. Este chip es fabricado por
PowerFlash y esta es toda la información que se puede encontrar. El autor del
blog del que tomé la tabla no estaba seguro de que obtuviera la batería original del iPhone SE. Gracias al retiro de
asterix_tyumen , que desmontó la batería original de SE, se descubrió que cuesta sn27545. A continuación, nos veremos obligados a considerar el A1141 con más detalle. Pero por ahora, echemos un vistazo a las baterías:

Como puede ver, la batería para todos los gustos y colores, con y sin manzana. También se pueden conectar en paralelo para aumentar la capacidad, con sondeo por separado. De las deficiencias, vale la pena señalar que la relación longitud / ancho es de aproximadamente 3: 1, lo que no siempre es conveniente, así como un conector único para la conexión. Debido a la popularidad de los teléfonos Apple, estas baterías se pueden comprar de forma segura en muchos lugares y en grandes cantidades (como resultó, esto no es del todo cierto).
Al desarrollar un
lector RFID autónomo inalámbrico, fuimos por este camino.

Se eligió la batería del iPhone 6, que nos convenía en términos de capacidad y tamaño. Se compraron varias copias en varios lugares para su verificación:

El correcto fue comprado en China, el resto en Moscú. El costo es de $ 6-11. Cuando se verifican, se obtendrán resultados bastante interesantes. Presta especial atención a la caja con la inscripción "Orig", luego volveremos a ella. La verificación se llevó a cabo utilizando el propio lector RFID, el programador TI EV2300 y Battery Management Studio.
El circuito de alimentación del lector RFID se muestra en la figura:

Memoria lineal basada en STC4054 (TP4054), corriente de carga de 500 mA, interruptor de autoalimentación basado en el interruptor de láminas SF1, condensador C19, diodo VD4 y resistencia R15, así como un convertidor de pulso basado en NCP1529.
La primera que conecté una copia de China por $ 6:

La batería responde, PERO la corriente no se mostró durante la carga o la descarga, el voltaje no se correspondía con lo que realmente se midió y el grado de carga no cambió. La batería no respondió a los comandos. Se suponía que esta instancia era falsa, así que le quité una cinta protectora para mirar el tablero:

Este es un turno ... Ni siquiera volví a dibujar el circuito, aquí está claro que hay un emulador bq27545 y un circuito de protección contra sobredescarga / sobrecarga. Inmediatamente surgió la idea de ahorrar tiempo y abrir todas las baterías.

El vecino a la izquierda del colega chino por $ 8 es similar a la diferencia en la marca en las fichas. El resto se comporta igual. Estas 2 copias están inmediatamente en la basura. Desafortunadamente, no tenía el iPhone 6 a mano para revisar estas baterías en el dispositivo objetivo, fue muy interesante ver cómo se comportaría el teléfono cuando funcionara con estas baterías.

Y esta es una batería central, que cuesta $ 8. Incluso tiene un sensor de corriente y algún tipo de microcircuito de 8 pines con una marca modesta 6G3. En Battery Management Studio, esta batería pretende ser la bq27545 más hábilmente. Se muestran el nivel de carga, el voltaje correcto, la corriente de la batería. Pero si todo esto fuera real, entonces lo falso no sería falso. En realidad, la temperatura se estableció por una constante, la corriente se midió muy mal. La imagen muestra el consumo actual del lector RFID, que se mide con la batería con una lectura constante de la tarjeta.

En realidad, equivale a ~ 55 mA para dicho modo de funcionamiento, y dado que el campo del lector siempre está activado, no puede ser cero. Cuando se carga (cuando la corriente es constante durante un largo período de tiempo), el sensor de corriente funciona bien. Naturalmente, todos los demás parámetros se calculan incorrectamente (nivel de carga, tiempo de funcionamiento hasta la descarga completa, etc.). El indicador FC (carga completa) se establece en 4.4V.

La batería no responde a los comandos, los indicadores QEN y RUP_DIS no están configurados. En general, este es un intento fallido por parte de los chinos de escribir el truco bq27545 en MK (en cualquier caso, creo que lo es). También en la basura.
¿Recuerdas que pedí prestar especial atención a la copia en la caja con la inscripción "Orig"? Fue él quien resultó estar lo más cerca posible de lo que estábamos buscando (¿y cómo no creer en el anuncio ahora?):

Su costo fue de $ 9. En el centro, puede ver claramente el chip con la etiqueta SN27545: esto es exactamente lo que estábamos buscando. Con esta instancia, comencé a trabajar más de cerca. Durante el ciclo de prueba de carga y descarga, surgieron problemas. No pude obtener el conjunto de banderas FC (carga completa), lo que significaba el final del proceso de carga. La corriente de carga con un voltaje de batería cercano a 4.2 V se volvió extremadamente pequeña (aproximadamente 20 mA) y el proceso de carga amenazaba con nunca terminar. Una de las posibles razones fue un cable USB con una gran caída de voltaje (4,5 V alcanzó el chip de memoria), lo reemplazamos por uno mejor con una menor caída de voltaje. Los indicadores mejoraron, la batería se cargó a 4.2V, la corriente bajó a 0, pero el SOC (estado de carga - nivel de carga) alcanzó solo 85, por lo que no se configuró el indicador FC.

Durante varios días conduje ciclos con la expectativa de que la batería aprendería, pero eso no ayudó. El problema resultó ser común, pero su búsqueda tomó 2 días. En algún momento, noté que la batería es de 4.35V y esta fue la respuesta a todas las preguntas. La memoria es estándar a 4.2V y no noté en absoluto que la batería está a 4.35V y que hay una carga incompleta. Como las placas ya estaban fabricadas, la única forma de salir de la situación era buscar un reemplazo para el STC4054 con un voltaje de 4.35V. Resultó que tales microcircuitos existen, pero no se pueden comprar en nuestro gran país (aparentemente, son completamente impopulares de la palabra). Por lo tanto, la versión MCP73832T-3 se ordenó con un par de semanas de espera.
Mientras tanto, los viajes ordenados, haremos un parche de granja colectiva para verificar el concepto. Para hacer esto, haga una "copia de seguridad" de 0.15V para el chip de memoria usando un diodo:

Debo admitir que la granja colectiva funcionó, se configuró la bandera FC, todo funciona, pero el voltaje final de la batería es de 4.4V (la caída en el diodo es mayor que los 0.15V requeridos).

Es importante tener en cuenta que es posible cargar hasta 4.2V con una pérdida correspondiente de ~ 15% de la capacidad, pero al mismo tiempo extender significativamente la vida útil de la batería. Terminamos la copia de Orig; se puede poner en desarrollo de forma segura.
Queda la última copia. Los más caros ($ 11), en el empaque más fresco y que requieren más tiempo para ellos. Miramos adentro:

Aquí se trata de un chip A1141 desconocido para el que no existe otra documentación que no sea la
página del fabricante . Conexión forzada en cuanto a bq27545 en Battery Management Studio, vemos la siguiente imagen:

Basura llena Al intentar cargar con una corriente de ~ 500 mA, muestra 125 mA, mientras que al descargar con una corriente de ~ 25 mA muestra 214 mA. Está claro que si el A1141 tiene direcciones de parámetros diferentes o un formato diferente para almacenar datos que bq27545, entonces nada brilla sin documentación con esta batería. Por lo tanto, se dejó de lado, pero al final de escribir el material, decidí volver a conectarlo. Tomé la tabla de comandos del chip bq27545:

Y leí los registros de voltaje (0x08 y 0x09) a través del menú Advanced Comm:

Obtenga 0x10 << 8 | 0x38 = 4152 o 4.152V, que corresponde a un voltaje de 4.15V medido por un multímetro. Entonces, si los datos son correctos, ¿por qué se muestran 57mV en el programa? Notamos que 57mV es exactamente 0x38, es decir, el valor es 0x08 registro. Con un voltaje de 4.152V en la batería, el nivel de carga del 96% se ve bastante bien; puede obtenerlo leyendo los registros 0x2c y 0x2d. Lea 0x2c = 0x60, 0x2d = 0 (en el caso del parámetro SOC, el registro más alto siempre es cero). Se suponía que el programa o EV2300 no puede leer (o la batería no responde) el byte alto en la solicitud o un byte con una dirección impar. Para probar esta teoría, la batería se conectó directamente al lector RFID y la batería se encuestó a través del MK. La interfaz HDQ se implementó de acuerdo con un
documento de TI . El chip bq27545 utiliza el protocolo HDQ de un solo cable para comunicarse con el controlador de control, que en el STM32 se implementa de manera bastante conveniente sobre la base de un UART de un solo cable gracias al soporte del modo Half Duplex.
Porque nuestro lector RFID funciona en MicroPython, envolvimos el trabajo con HDQ en una clase y obtuvimos el trabajo con el controlador de carga de la siguiente forma:
desde hdq import HDQ
bat = HDQ (pyb.UART (1))
bat.charge () # charge
bat.read_u16 (0x14) # registro arbitrario
De hecho, resultó que A1141 no responde a una solicitud para leer bytes con direcciones impares.

La forma de onda muestra que hay una solicitud, pero no hay respuesta. Cuando agregaron un reinicio de la lógica del intercambio de datos (Break) antes de cada solicitud, cada dos veces, pero el microcircuito comenzó a responder correctamente.

Luego comparamos el tipo de cambio del EV2300 y la RFID del lector y resultó que el EV2300 usa una velocidad de 10-15% más baja que los conjuntos de TI:

Después de ralentizar el HDQ y completar el descanso, la batería funcionó normalmente con cada solicitud. Se leyeron los principales parámetros de la batería:

Victoria completa! De hecho, A1141 resultó ser un clon de alta calidad de bq27545 con fallas menores. Queda por hablar sobre los matices de trabajar con la batería desde el lado del software (usando modos de suspensión, corriente de activación, etc.), pero esto duplicará la cantidad de grabación y, tal vez, escribiré esto en otro momento.
Conclusiones
Como puede ver, hay muchas opciones para desarrollar dispositivos alimentados por baterías de iones de litio. Honestamente, originalmente se planeó escribir material al estilo de vino, vio, ganó, pero en el proceso surgieron muchos matices (la lucha con A1141 es especialmente buena) y el material resultó ser muy interesante y extenso. De las 5 baterías, solo 2 de hecho se pueden usar normalmente. Por lo tanto, la elección del proveedor en este caso es muy relevante. Si vio la batería de otros dispositivos que contienen BMS, escriba el modelo en los comentarios. ¡Gracias a todos por su atención!