Lo que hay que tener en cuenta a la hora de determinar el estado de carga de las baterías es que su voltaje es sólo una indicación aproximada del mismo, y en particular cuando están bajo carga su resistencia interna cambia su salida de voltaje, lo que le induce a pensar que están en un SoC inferior al que realmente tienen. Este es el caso de las baterías de litio, porque su curva de descarga en función del tiempo es relativamente plana (no perfectamente plana, pero sí más plana que la de otros productos químicos) para la mayor parte de su capacidad (excepto al principio y al final).
El cálculo "profesional" del SoC de la batería se realiza integrando el área bajo la curva corriente-vs-tiempo, esencialmente para contar cuántos culombios de energía entran o salen de la batería, y comparando eso con (a) la capacidad teórica/diseñada de culombios de la batería, o (b) llevando la cuenta durante largos periodos de tiempo de cuántos culombios obtienes de una "carga completa", lo cual es preferible porque esto disminuye a medida que la batería envejece.
Las baterías encapsuladas, como las de los ordenadores portátiles y los teléfonos móviles, tienen estos chips integrados en la carcasa de la batería (junto con el módulo de protección de la batería), y la CPU anfitriona puede interrogar a la batería para averiguar su SoC en un porcentaje bastante preciso.
Permitir que su aparato funcione hasta que se apague, de vez en cuando, es una buena manera de dejar que el chip "gas-guage" actualice su medición de capacidad total de culombios.
Como dijo @Matt Young, hay muchos chips de gestión de la batería de "medidor de gas" por ahí para hacer esto.
relacionados: http://jeelabs.org/2012/11/26/watts-amps-coulombs/ ¿Por qué las baterías se miden en amperios-hora y la electricidad en kilovatios-hora?