随着电子产品的不断发展,人们对于电子产品充电的速度要求越来越高,今年刚好有个项目用到了IP2315,回顾后整理了一下
一、IP2315是什么?
IP2315 是一款集成 MOS 和输入快充协议的高效同步降压转换充电 IC 。
1.用于单节锂电池的充电IC
单节锂电池同步开关降压 4.8A 充电 IC
具体说明直接上图了
这里我以4.2V为满电电压, 应用电路按推荐电路设计 如下:
IP2315的NTC温度保护需要根据自己项目需求配置对应电阻 ,根据推荐的参数如下
IP2315 集成 NTC 温度保护功能,配合 NTC 热敏电阻,当检测到温度在 0~55 度范围内时正常充电;当温 度高于 45 度或低于 0 度时,停止充电。
电阻是可以根据实际项目需求调整的,由于实际项目PCB板太小,散热问题不好解决,而且对实际产品影响不大,NTC功能直接删减掉了
IP2315是可以通过硬件和软件控制充电电流的,这个也是为了保护电池,因为有些电池承受不来大电流,且过载会减少电池寿命,早期的时候是直接调节外部电阻来控制电流,
测试是是外接的200K电阻 接到IP2315的27脚 ICHGSET
手册说的3000mA 根据实际情况会有所耗损 比如接电池的电源线的长度和大小
外置电阻控制存在一个问题 就是 5V的时候 9V 和12V的时候对应的充电功率是不一样的
以理想充电电流3000mA 5V时 最高15W 9V时最高27W 12V时最高36W
客户要求12V时电流调小,这个时候就遇到问题了,硬件控制的都是统一的不管你多少V电流最大都是3000mA ,如果调小会导致整体充电电流变小,这时候没办法了,只能用软件IIC发协议来工作充电电流和开关了
首先看一下介绍
有关IIC介绍参考:【通信协议】IIC通信协议详解_狂飙的笨牛的博客-CSDN博客_iic通信协议
相关操作如下
#define I2C_SCL RA1 //I2C SCL引脚
#define I2C_SDA RA0 //I2C SDA引脚
#define I2C_SCL_IO TRISA1
#define I2C_SDA_IO TRISA0#define POWER_SCL(n) n?(RA0 = 1):(RA0 = 0)
#define POWER_SDA(n) n?(RA1 = 1):(RA1 = 0)
#define SDA_Read RA1#define IP2315_ADDRESS (0xea>>1) //IP2315地址写地址
#define IP2315_ADDRESS1 (0xeb>>1) //IP2315地址读地址#define SetIIC (~(0x38)&0x38)static void SDA_OUT(void)
{TRISA1 = 0;
}static void SDA_IN(void)
{TRISA1 = 1;
}
void IIC_Start(void)
{SDA_OUT();POWER_SCL(0);SysDelay_us(2);POWER_SDA(1);SysDelay_us(2);POWER_SCL(1);SysDelay_us(2);POWER_SDA(0);SysDelay_us(2);POWER_SCL(0);SysDelay_us(2);
}
void IIC_Stop(void)
{SDA_OUT();POWER_SCL(0);SysDelay_us(2);POWER_SDA(0);SysDelay_us(2);POWER_SCL(1);SysDelay_us(2);POWER_SDA(1);SysDelay_us(2);
}
//等待应答
unsigned char IIC_WaitAck(void)
{unsigned char Time_Out=0;SDA_IN();SysDelay_us(4);POWER_SCL(1);SysDelay_us(2);while(SDA_Read){Time_Out++;SysDelay_us(2);if(Time_Out>5){IIC_Stop();return 0;}}SDA_OUT();POWER_SDA(0);SysDelay_us(2);return 1;
}//发送应答
void IIC_SendACK(void)
{SDA_OUT();POWER_SDA(0);SysDelay_us(2);SysDelay_us(2);POWER_SCL(1);SysDelay_us(2);POWER_SCL(0);SysDelay_us(2);
}
//不使用ACK应答
void IIC_SendNoAck(void)
{SDA_OUT();POWER_SDA(1);SysDelay_us(2);POWER_SCL(1);SysDelay_us(2);POWER_SCL(0);SysDelay_us(2);
}//IIC发送一个字节
void IIC_SendByte(unsigned char Byte)
{unsigned char i;for(i=0;i<8;i++){POWER_SCL(0);SysDelay_us(2);POWER_SDA((Byte&0x80)>>7);SysDelay_us(4);Byte<<=1;SysDelay_us(4);POWER_SCL(1);SysDelay_us(2);}POWER_SCL(0);SysDelay_us(2);
}//写一个字节
uint8_t IP2315_Write_Byte(uint8_t reg,uint8_t data)
{WDT_FEED();
IIC_Start();IIC_SendByte((IP2315_ADDRESS<<1)|0);//发送器件地址IIC_WaitAck();IIC_SendByte(reg);IIC_WaitAck();IIC_SendByte(data);IIC_WaitAck();IIC_Stop();return 0;}uint8_t IP2315_Byte(uint8_t reg)
{uint8_t res;IIC_Start();IIC_SendByte((IP2315_ADDRESS<<1)|0);//发送器件地址IIC_WaitAck();IIC_SendByte(reg);IIC_WaitAck();IIC_Start();IIC_SendByte((IP2315_ADDRESS<<1)|1);//发送器件地址IIC_WaitAck();res=IIC_Read_IP2315_Byte(0);IIC_Stop();return res;}//IP2315读1个字节,ack=1时,发送ACK,ack=0,发送nACKuint8_t IIC_Read_IP2315_Byte(unsigned char ack)
{unsigned char R_Data = 0;IIC_Start();IIC_SendByte((IP2315_ADDRESS<<1)|0);//发送器件地址IIC_WaitAck();IIC_SendByte(ack);IIC_WaitAck();IIC_Start();IIC_SendByte((IP2315_ADDRESS1<<1)|1);//发送器件地址IIC_WaitAck();R_Data = IIC_Read_Byte1(0);IIC_SendNoAck();IIC_Stop();return R_Data;}//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
uint8_t IIC_Read_Byte1(unsigned char ack)
{unsigned char i,receive=0;SDA_IN();//SDA设置为输入for (i = 0; i < 8; i++){POWER_SCL(0); SysDelay_us(2);POWER_SCL(1);receive <<= 1;if (SDA_Read==1)receive++;SysDelay_us(2);}if (!ack)IIC_SendNoAck();//发送nACKelseIIC_WaitAck(); //发送ACK return receive;
}/************************************************************/
IP2315_Write_Byte(0X1E,SetIIC);//通过寄存器控制充电电流
IP2315_Write_Byte(0x01,0x00);//关闭充电使能
IP2315_Write_Byte(0x01,0x01);//开启充电使能IP2315_Write_Byte(0X26,61);//设置5V 1.5A
IP2315_Write_Byte(0X29,61);//设置9V 1.5A
IP2315_Write_Byte(0X2A,61);//设置12V 1.5A IIC_Read_IP2315_Byte(0XC7);//读电池是否充满
总结
总的来说这款充电IC充电相对来说是很快,自动识别充电协议,高输出的同时不会把充电器拉死