中颖AFE芯片:SH367303、SH367306 和 SH367309
中颖电子(Sinowealth)的 SH367303、SH367306 和 SH367309 都是锂电池管理(BMS)中常用的模拟前端(AFE)芯片,它们各自针对不同电池串数的应用场景设计。下面是它们的详细介绍。
一、SH367303芯片介绍
SH367303是一款专为3至5串锂电池包管理设计的模拟前端芯片,它集成了电池管理所需的多种保护、采样和通信功能。
| 特性类别 | 具体参数/功能 |
|---|---|
| 基本信息 | 适用电池:3-5串锂电池 封装:QFN28L |
| 核心保护功能 | 硬件过充电保护 硬件放电短路保护 集成平衡开关 |
| 检测与唤醒 | 充电器检测 负载检测 小电流唤醒 |
| 采集与ADC | 电芯电压:12-bit VADC 电流:13-bit CADC 温度:2通道 |
| 通信接口 | TWI(兼容I²C),CRC-8校验 |
| 系统管理与功耗 | 集成WatchDog与Reset功能 3.3V LDO输出 正常模式:≤ 70μA PowerDown模式:≤ 1μA |
集成化硬件保护与平衡:芯片内置了独立的硬件过充和放电短路保护电路,响应速度快,可靠性高。同时,集成的平衡开关有助于实现电芯间的主动均衡,提升电池包整体一致性。
全面检测与低功耗唤醒:SH367303具备充电器和负载检测功能,能自动识别系统状态。其小电流唤醒机制确保了在低功耗模式下也能被特定事件及时激活,兼顾了系统功耗与响应性。
高精度采集与系统支持:通过12位VADC和13位CADC,芯片能精确测量电芯电压和电流。内置的3.3V LDO(最大输出电流25mA)可为外部MCU等器件供电,简化了电源设计。
增强系统可靠性:集成的看门狗和复位电路能有效防止MCU死机,提升整个BMS系统的稳定性。Alarm功能的加入也能分担MCU在处理异常状态时的程序负荷。
强大的驱动与控制:芯片直接驱动N-MOSFET,并提供一个专用的CTLD管脚用于PWM控制放电MOSFET的驱动,实现了精细的充放电管理。
二、SH367306芯片介绍
SH367306是一款专为6至10串锂电池包管理的模拟前端芯片,来自中颖电子 (Sinowealth)。它高度集成,能精确监控和守护电池组,广泛用于电动工具、扫地机器人、无人机等产品。
| 特性类别 | 详细参数 |
|---|---|
| 基本信息 | 适用电池:6-10串锂电池 封装:QFN28L |
| 核心保护 | 硬件过充电保护 硬件放电短路保护 集成平衡开关 |
| 检测与唤醒 | 充电器检测、负载检测 小电流唤醒功能 |
| 采集与ADC | 电芯电压:12-bit VADC 电流:13-bit CADC 温度:2通道 |
| 通信接口 | TWI(兼容I²C)接口 支持CRC-8校验 |
| 系统管理与功耗 | 集成WatchDog与Reset功能,防MCU死机 3.3V LDO输出(最大25mA) 正常模式功耗 ≤ 70μA PowerDown模式功耗 ≤ 1μA |
| 工作电压 | 8V - 50V |
硬件保护与平衡:SH367306内置了独立的硬件过充和放电短路保护电路,响应速度更快,可靠性高,能及时切断故障。芯片集成了平衡开关,有助于实现电芯间的主动均衡,提升电池包整体一致性。
全面检测与低功耗设计:芯片具备充电器和负载检测功能,能自动识别系统状态。其小电流唤醒机制确保了在低功耗模式下也能被特定事件激活,兼顾了系统功耗与响应性。
高精度采集与系统支持:通过12位VADC和13位CADC,芯片能精确测量电芯电压和电流。内置的3.3V LDO(最大输出电流25mA)可为外部MCU等器件供电,简化了电源设计。
增强系统可靠性:集成的看门狗和复位电路能有效防止MCU死机,提升整个BMS系统的稳定性。Alarm功能的加入也能分担MCU在处理异常状态时的程序负荷。
驱动与控制:芯片直接驱动N-MOSFET,并提供一个专用的CTLD管脚用于PWM控制放电MOSFET的驱动,实现了精细的充放电管理。它支持电芯乱序上电,为生产流程带来便利。
三、SH367309芯片介绍
SH367309是一款专为5-16串锂电池包管理的电池数字前端采集芯片,来自中颖电子。它能全方位守护电池安全,并支持灵活的配置与应用。
| 特性类别 | 详细参数 |
|---|---|
| 基本信息 | 适用电池:5-16串锂电池包 总电压:不超过70V 封装:TQFP48L |
| 核心保护功能 | 过充/过放保护、温度保护 充放电过流/短路保护 二次过充电保护 断线保护 |
| 采集与ADC | 电压/温度/电流:13-bit VADC (10Hz, 16路电压+3路温度) 电流:16-bit Ʃ-∆CADC (4Hz) 内置EEPROM (≤100次擦写) |
| 工作模式 | 保护模式 (独立工作) 采集模式 (配合MCU) 仓运模式、烧写模式 |
| 通信与控制 | TWI接口 (兼容I²C), 支持CRC8校验 集成看门狗模块 CTL管脚优先关断MOSFET |
| 系统与功耗 | 内置3.3V LDO (25mA Max) 支持乱序上下电 低功耗状态:IDLE, SLEEP, Powerdown |
双重工作模式:SH367309提供了保护模式和采集模式。
- 在保护模式下,芯片可以独立工作,无需外部MCU,即能实现对电池包的各种硬件保护,适合对成本和空间有严格要求的应用。
- 在采集模式下,芯片与外部MCU配合,除了完成所有的数据采集任务,保护功能也同时保持使能。这使得系统能够进行更复杂的电池状态计算(如SOC估算)和智能管理。
全面的硬件保护:芯片内置了丰富的硬件保护功能,能够应对各种异常情况,包括过充电、过放电、充放电过流、短路、二次过充电以及断线检测等。这些保护由硬件直接实现,响应速度快,可靠性高。
高精度采集与均衡:通过13位的VADC和16位的CADC,芯片能够高精度地测量每节电芯的电压、电流以及温度。内置的平衡开关有助于实现电芯间的主动均衡,改善电池包的一致性,延长使用寿命。
集成化与可靠性设计:芯片内部集成了EEPROM,可用于保存用户自定义的保护阈值、延时等参数,提供了灵活性(但需注意,其擦写次数有限,约为100次)。内置的看门狗和3.3V LDO(最大输出电流25mA)进一步增强了系统稳定性和集成度。其CTL管脚能在发生保护时优先关闭充放电MOSFET,确保快速响应。
四、中颖AFE芯片选型考量
基于上面的表格,我们来进一步了解每款芯片的侧重点和适用场景。
SH367303:适用于3-5串电池包。这款芯片集成了完备的硬件保护功能(如过充和放电短路保护)和平衡开关,提供了基础的12-bit电压和13-bit电流采集精度。其特点是集成了WatchDog(看门狗)和Reset(复位)功能,能有效防止MCU死机,降低了系统设计的复杂性并提升了可靠性。它非常适合那些需要高集成度和可靠性的中小规模电池包应用。
SH367306:适用于6-10串电池包。SH367306定位于6-10串的电池应用。它同样具备硬件保护功能和内置平衡开关。此外,它还支持小电流检测功能,这对于需要精确监控待机功耗或微小电流的应用场景很有帮助。这款芯片是中规模电池包应用的一个选择。
SH367309:适用于5-16串高性能电池包。这是中颖电子面向更高串数、更高性能需求推出的一款数字前端芯片。它不仅提供了全面的硬件保护,还集成了高精度的13-bit VADC和16-bit CADC,用于高精度采集电压、温度和电流。其显著特点是内置EEPROM,可用于保存保护阈值及延时等可调参数,提供了极大的灵活性。同时,它支持多种工作模式(如采集模式、保护模式等),允许芯片既可与MCU配合工作,也可独立运行保护功能,非常适合需要复杂管理和高可靠性的高性能电池系统。
总的来说,这三款芯片的选择主要取决于你的电池组规模和对功能的具体需求:
对于3-5串的电池包,追求高集成度和防死机可靠性,SH367303是一个精简而强大的选择。
对于6-10串的电池包,SH367306提供了适中的规模和基础功能。
对于5-16串且需要高性能、高精度采集和灵活配置的复杂电池系统,SH367309则更为合适。
五、中颖AFE芯片驱动代码示例
1、寄存器地址
//系统标志状态控制寄存器
#define AFE_FLAG1 0x00
#define AFE_FLAG2 0x01
#define AFE_BSTATUS 0x02
#define AFE_INT_EN 0x03
#define AFE_SCONF1 0x04
#define AFE_SCONF2 0x05
#define AFE_SCONF3 0x06 //电芯电压,芯片内部温度,外部温度
#define AFE_SCONF4 0x07 //平衡寄存器--不会置位
#define AFE_SCONF5 0x08
#define AFE_SCONF6 0x09
#define AFE_SCONF7 0x0A
#define AFE_SCONF8 0x0B
#define AFE_SCONF9 0x0C
#define AFE_SCONF10 0x0D //第14个//电芯寄存器地址
#define AFE_CELL1H 0x0E
#define AFE_CELL1L 0x0F
#define AFE_CELL2H 0x10
#define AFE_CELL2L 0x11
#define AFE_CELL3H 0x12
#define AFE_CELL3L 0x13
#define AFE_CELL4H 0x14
#define AFE_CELL4L 0x15
#define AFE_CELL5H 0x16
#define AFE_CELL5L 0x17
#define AFE_CELL6H 0x18
#define AFE_CELL6L 0x19
#define AFE_CELL7H 0x1A
#define AFE_CELL7L 0x1B
#define AFE_CELL8H 0x1C
#define AFE_CELL8L 0x1D
#define AFE_CELL9H 0x1E
#define AFE_CELL9L 0x1F
#define AFE_CELL10H 0x20
#define AFE_CELL10L 0x21//外部温度寄存器地址
#define AFE_TS1H 0x22
#define AFE_TS1L 0x23
#define AFE_TS2H 0x24
#define AFE_TS2L 0x25
//内部芯片温度寄存器地址
#define AFE_TEMP1H 0x26
#define AFE_TEMP1L 0x27
#define AFE_TEMP2H 0x28
#define AFE_TEMP2L 0x29//电流寄存器
#define AFE_CURH 0x2A
#define AFE_CURL 0x2B#define AFE_ALARM_SC 0x40
#define AFE_ALARM_OV 0x20
#define AFE_ALARM_CD 0x10
#define AFE_ALARM_CADC 0x08
#define AFE_ALARM_VADC 0x04
#define AFE_ALARM_WDT 0x02
#define AFE_ALARM_TWI 0x01
2、初始化代码
xdata u8 WriteBuf[50];
xdata u8 ReadBuf[50];u8 TestBufLen;u16 Reg_Addr = AFE_SCONF3;typedef struct _AFEREG_ //data for AFE set in init
{u8 AFEFLAG1;u8 AFEFLAG2;u8 AFEBSTATUS;u8 AFEINTEN;u8 AFESCONF1;u8 AFESCONF2;u8 AFESCONF3;u8 AFESCONF4;u8 AFESCONF5;u8 AFESCONF6;u8 AFESCONF7;u8 AFESCONF8;u8 AFESCONF9;u8 AFESCONF10;
}AFEREG;AFEREG REG; u8 Vcell_01[2] = {0,0};
u8 Vcell_02[2] = {0,0};
u8 Vcell_03[2] = {0,0};
u8 Vcell_04[2] = {0,0};
u8 Vcell_05[2] = {0,0};
u8 Vcell_06[2] = {0,0};
u8 Vcell_07[2] = {0,0};
u8 Vcell_08[2] = {0,0};
u8 Vcell_09[2] = {0,0};
u8 Vcell_10[2] = {0,0};u32 bVal[10] = {0};u8 Wrdata = 0; u8 Crc_buf[3]={0x36,0,0};
u8 Crc_Value = 0; //CRC运算得到的值u8 code CRC8Table[256]=
{ //120424-1 CRC Table0x00,0x07,0x0E,0x09,0x1C,0x1B,0x12,0x15,0x38,0x3F,0x36,0x31,0x24,0x23,0x2A,0x2D,0x70,0x77,0x7E,0x79,0x6C,0x6B,0x62,0x65,0x48,0x4F,0x46,0x41,0x54,0x53,0x5A,0x5D,0xE0,0xE7,0xEE,0xE9,0xFC,0xFB,0xF2,0xF5,0xD8,0xDF,0xD6,0xD1,0xC4,0xC3,0xCA,0xCD,0x90,0x97,0x9E,0x99,0x8C,0x8B,0x82,0x85,0xA8,0xAF,0xA6,0xA1,0xB4,0xB3,0xBA,0xBD,0xC7,0xC0,0xC9,0xCE,0xDB,0xDC,0xD5,0xD2,0xFF,0xF8,0xF1,0xF6,0xE3,0xE4,0xED,0xEA,0xB7,0xB0,0xB9,0xBE,0xAB,0xAC,0xA5,0xA2,0x8F,0x88,0x81,0x86,0x93,0x94,0x9D,0x9A,0x27,0x20,0x29,0x2E,0x3B,0x3C,0x35,0x32,0x1F,0x18,0x11,0x16,0x03,0x04,0x0D,0x0A,0x57,0x50,0x59,0x5E,0x4B,0x4C,0x45,0x42,0x6F,0x68,0x61,0x66,0x73,0x74,0x7D,0x7A,0x89,0x8E,0x87,0x80,0x95,0x92,0x9B,0x9C,0xB1,0xB6,0xBF,0xB8,0xAD,0xAA,0xA3,0xA4,0xF9,0xFE,0xF7,0xF0,0xE5,0xE2,0xEB,0xEC,0xC1,0xC6,0xCF,0xC8,0xDD,0xDA,0xD3,0xD4,0x69,0x6E,0x67,0x60,0x75,0x72,0x7B,0x7C,0x51,0x56,0x5F,0x58,0x4D,0x4A,0x43,0x44,0x19,0x1E,0x17,0x10,0x05,0x02,0x0B,0x0C,0x21,0x26,0x2F,0x28,0x3D,0x3A,0x33,0x34,0x4E,0x49,0x40,0x47,0x52,0x55,0x5C,0x5B,0x76,0x71,0x78,0x7F,0x6A,0x6D,0x64,0x63,0x3E,0x39,0x30,0x37,0x22,0x25,0x2C,0x2B,0x06,0x01,0x08,0x0F,0x1A,0x1D,0x14,0x13,0xAE,0xA9,0xA0,0xA7,0xB2,0xB5,0xBC,0xBB,0x96,0x91,0x98,0x9F,0x8A,0x8D,0x84,0x83,0xDE,0xD9,0xD0,0xD7,0xC2,0xC5,0xCC,0xCB,0xE6,0xE1,0xE8,0xEF,0xFA,0xFD,0xF4,0xF3
};u8 CRC8cal(u8 *p, u8 counter) //look-up table calculte CRC
{ u8 crc8 = 0; for( ; counter > 0; counter--){crc8 = CRC8Table[crc8^*p]; p++; } return(crc8);
}
void InitAFE_Reg(void)
{u8 i = 0;u8 temp_time = 1000; //延时时间u8 Flag = 1; // 读/写函数的返回值,0=成功,其它=失败for(i=0;i<14;i++){Flag = TWI0_WriteBuf(AFE_ID, i, 0x00); DelayXms(temp_time); //延时if(!Flag) //如果返回0(不为真值),表示通信成功{SendStr("\n...Write Okey; Reg_addr[ 0x");SendHex(i);SendStr(" ] = 0 ");}else{SendStr("\n...Write Err; Flag = ");SendHex(Flag);}}REG.AFEINTEN = 0x00; REG.AFESCONF1 = 0x50; REG.AFESCONF2 = 0x00; REG.AFESCONF3 = 0xF8; REG.AFESCONF4 = 0x00; REG.AFESCONF5 = 0x00; REG.AFESCONF6 = 0x70; REG.AFESCONF7 = 0x01; REG.AFESCONF8 = 0x03; REG.AFESCONF9 = 0xff; REG.AFESCONF10= 0x00; TWI0_WriteBuf(AFE_ID, AFE_INT_EN , REG.AFEINTEN ); DelayXms(temp_time); //延时TWI0_WriteBuf(AFE_ID, AFE_SCONF1 , REG.AFESCONF1 );DelayXms(temp_time); //延时TWI0_WriteBuf(AFE_ID, AFE_SCONF2 , REG.AFESCONF2 );DelayXms(temp_time); //延时TWI0_WriteBuf(AFE_ID, AFE_SCONF3 , REG.AFESCONF3 ); DelayXms(temp_time); //延时TWI0_WriteBuf(AFE_ID, AFE_SCONF4 , REG.AFESCONF4 );DelayXms(temp_time); //延时TWI0_WriteBuf(AFE_ID, AFE_SCONF5 , REG.AFESCONF5 );DelayXms(temp_time); //延时TWI0_WriteBuf(AFE_ID, AFE_SCONF6 , REG.AFESCONF6 );DelayXms(temp_time); //延时TWI0_WriteBuf(AFE_ID, AFE_SCONF7 , REG.AFESCONF7 );DelayXms(temp_time); //延时TWI0_WriteBuf(AFE_ID, AFE_SCONF8 , REG.AFESCONF8 );DelayXms(temp_time); //延时TWI0_WriteBuf(AFE_ID, AFE_SCONF9 , REG.AFESCONF9 );DelayXms(temp_time); //延时TWI0_WriteBuf(AFE_ID, AFE_SCONF10, REG.AFESCONF10);DelayXms(temp_time); //延时for(i=0;i<14;i++){Flag=TWI0_ReadBuf(AFE_ID, i, &ReadBuf,2);DelayXms(temp_time); //延时if(Flag==0) //如果返回0,表示通信成功{SendStr("\n...Read Okey; Reg_addr[ 0x");SendHex(i);SendStr(" ] = 0 ");SendHex(ReadBuf[0]);}else{SendStr("\n...Read Err; Flag = ");SendHex(Flag);}}
}
