LTC4015 - when I detach the battery the LTC4015 CHARGER STATE REGISTER remains "absorb charge"

Hello Zack,

I am using the inside telemetry of the LTC4015 and I am in this situation:

if I detach the battery from the board, the LTC4015 remains in absorb state, the voltage at the battery socket is that before the disconnection.

This is double confirmed with a voltmeter, even if there isn't the battery, the voltage at the socket is 28.4V as before the disconnection (Vin is 28.8V).

How to go out from this behaviour? 


  • 0
    •  Analog Employees 
    on Mar 29, 2021 7:19 PM

    Hi Mario,

    This is normal behavior. Since the charge is outputting voltage, the battery node remains high when the battery is removed, so the LTC4162 does not know it has been disconnected. If this is an issue for you, there are a few workarounds. You can add some "smarts" via microcontroller to watch for a sudden decrease in charge current. If that is detected, you might assume the battery was removed. To have the LTC4162 check that, toggle suspend_charger on/off which will put the LTC4162 back into the battery detection state. From there, it will be able to tell if the battery is actually present or not.



  • already experimented the action based on the current absorption. But if the battery is detached when it is charged the current doesn't change. It was zero and remains zero.

    I tried forcing the LTC4015 to suspend charge charge and restart again, without success (of course) ... today I try let the LTC4015 restart from zero, I mean including the detection of the battery state.

    Thank you.

    CIao. Mario   

  • .....
    void UPS_stop() {
    	uint16_t Reg_Value =LTC4015_readReg16Bit(LTC4015_CONFIG_BITS) | suspend_charger;
    	uint16_t temp =LTC4015_writeReg16Bit(LTC4015_CONFIG_BITS, Reg_Value);
    void UPS_start() {
    	uint16_t Reg_Value =LTC4015_readReg16Bit(LTC4015_CONFIG_BITS) & ~suspend_charger;
    	uint16_t temp =LTC4015_writeReg16Bit(LTC4015_CONFIG_BITS, Reg_Value);
    		if(Clock_Kick_Batt!=Clock_min && UPS_Already_Kicked) {
    			UPS_counter =5;
    			UPS_Already_Kicked =TRUE;
    			Clock_Kick_Batt =Clock_SEC;
    		else if(UPS_counter==0) UPS_start();
    		else UPS_Already_Kicked =FALSE; 

    I wait 5 seconds and after this period I restart again. But this action doesn't solve the "matter".

  • 0
    •  Analog Employees 
    on Mar 30, 2021 7:00 PM in reply to revenac

    That should work, so try each step individually. With no battery connected and in this state, first suspend charging and verify that it is in the suspended state. Then, re-enable charging and verify that it detects a missing battery (this will take a few seconds). Which part of this fails?

    If re-enabling charging with no battery connected puts it back into the charging state, you may have something fooling the LTC4015 into thinking a battery is present. This could be a voltage source or a very large bank of capacitance.

  • finally I found the way monitoring the charging current.

    0x00ff is a kind of threshold for the raw Ibat value.

    		if(Clock_Kick_Batt!=Clock_min) {
    			if(UPS_raw_Ibat <0x00ff) {
    				UPS_Kick_Counter =5;				//wait 5 sec before restart (by interrupt on timer)
    				UPS_Already_Kicked =FALSE;
    				lcd_gotoxy(0,0); lcd_putc(0xFF);
    			Clock_Kick_Batt =Clock_min;
    		if(UPS_Kick_Counter==0 && !UPS_Already_Kicked) {
    			UPS_Already_Kicked =TRUE;

    When the battery is detached the LTC4015 continues to charge the bunch of capacitors at the battery input and - important! - the LED I use to monitor the voltage.

    below 0x00ff I kich the LTC4015 to really restarts and executes a start cycle.

    Now I monitor the 0x00ff threshold to be sure it is an "universal" parameter in my application.

    One question (I don't want to open another thread):

    why the internal resistance of the battery, measured by the LTC4051 telemetry, is always 0x0000? I read the register 0x41. Should be because it is a 36Ah battery, paralleled with a bunch of caps with low ESR?

    #define LTC4015_RBAT					0x41