引言
随着中国市场对电池需求的迅速增大,越来越多的公司加入到电池管理的开发、设计中来。飞思卡尔半导体适时推出多路电池管理芯片MM9Z1_638。本文着重介绍MM9Z1_638电池管理系统的搭建、各个模块的功能,以及所用元件的选型,希望帮助读者掌握基于MM9Z1_638的电池管理系统原理,并快速实现电池管理系统的设计。
1 MM9Z1_638特性
MM9Z1_638是一个全面集成的电池监控器件。该器件可通过一个外部分流电阻进行精确电流测量,可通过使用内部校准电阻分频器或外部分频器提供4路电压测量,其包括一个内部温度传感器,可贴紧电池并测量电池温度,外加4个外部温度传感器输入。
MM9Z1_638包括LIN 2.2协议和物理接口以及一个MSCAN协议控制器,可通过外接一个CAN接口芯片与汽车总线连接。MM9Z1_638特性如下:
◆ 宽电池电流测量,可实现片上温度测量。
◆ 采用内部电阻分频器提供4块电池电压测量,采用外部电阻分频器提供最多5个直流电压测量。
◆ 电压通道和电流通道间的测量同步。
◆ 5个外部温度传感器输入,同时为外部温度传感器供电。
◆ 低功耗模式,采用低电流工作。
◆ 多唤醒源:LIN、计时器、高压输入、外部CAN接口、电流阈值和集成。
◆ 提供高精度内部振荡器,并提供与外部晶体的连接。
◆ 支持LIN 2.2/ 2.1/ 2.0协议和物理接口。
◆ 提供MSCAN协议控制器,能够为8引脚和14引脚CAN接口供电。
◆ S12Z MCU,带有128 KB闪存、8 KB RAM、4 KB EEPROM。
2 MM9Z1_638组成的电池监控系统
单片MM9Z1_638最多可实现对4块锂电池的监控,组成的电池监控系统如图1所示。
其中,Vsup的正常工作电压为3.5~28 V。Vbat1=2.2 μF,Vbat2=100 nF。
图1 MM9Z1_638电池监控系统
2.1 电池电压的测量
通过VSENSE0~3来测量4块电池的电压,如图2所示。
其中,电池#1的电压应为VSENSE0-(VSENSEL-VSENSEH),其他电池的电压是两个VSENSE的差。各通道电压测量范围如表1所列。
图2 电池电压测量
表1 各通道电压范围
2.2 电池电流的测量
如图3所示,在电池的负端串接一个Rshunt电阻(分流电阻),通过测量Rshunt两端的电压,计算出电池的电流。Rshunt可以采用50~200 μΩ。ISENSEH/L的正常测量范围为-0.3~0.3 V。
2.3 电池温度的测量
通过NTC来测量每一块电池的温度,把NTC贴在电池的表面,每一路温度测量电路如图4所示,温度的正常测量范围(PTB0~3)为0~1 V。
在测量温度时,设置寄存器使PTB5接地。在温度变化时,NTC的电阻会改变,通过测量PTBx的电压来检测电池的温度。其中,x为0~3,元件的参数如表2所列。
图3 电池电流测量
图4 电池温度测量
2.4 电池被动均衡
当某一块电池的电压比其他电池的电压高时,需要通过放电来降低这块电池的电压,实现被动均衡。每块电池通过一个开关与放电电阻相连,实现对电池放电。开关可以采用飞思卡尔的多路开关芯片MC33879,MM9Z1_912通过SPI实现对MC33879的控制,电路如图5所示。
表2 元件参数表
图5 MC33879控制电路
图中,Cvpwr=Cvdd=100 nF, R可选用10~20 Ω,VDDX为MM9Z1_912的5 V输出,VSUP为电池组正端,PA0~PA3为MM9Z1_912的复用SPI接口。MC33879的每一路开关既可以接在电池正端,又可以接在电池负端来使用。
2.5 MM9Z1_638的CAN总线接口
MM9Z1_638支持CAN和LIN接口,LIN接口可以直接接LIN总线,CAN的接口是MSCAN,所以需要外接一个CAN接口芯片才可以接到CAN总线上。可以选用飞思卡尔的MC33901或MC34901作为CAN接口芯片,接口电路如图6所示。
图6 接口电路
图中,VDDX为从MM9Z1_638输出的5 V电源,PA4/PA5为MM9Z1_638的MSCAN输入/输出引脚,PA6为MM9Z1_638的I/O接口。MM9Z1_638可以通过PA6设置MM33901/MM34901工作在正常或待机模式,CAVL端接的是120 Ω的端接电阻,主要是用来匹配的(匹配电阻)。
3 电池监控的例程
3.1 MM9Z1_638的SPI初始化
MM9Z1_638通过16位SPI来控制开关芯片MC33879,相关的SPI配置寄存器格式如下。
SPICR1:
SPI的初始化函数如下:
void SPI_MC33879_init (){
SPICR1_LSBFE = 0 ;//高位在前
SPICR1_SSOE = 1 ;//与SPICR2的MODFEN位配合,
//使能SPI的CS信号
SPICR1_CPHA = 1 ;//与CPOL配合,实现SPI在SCLK
//的下降沿采数据,上升沿发数据
SPICR1_CPOL = 0 ;//与CPHA配合,实现SPI在SCLK
//的下降沿采数据,上升沿发数据
SPICR1_MSTR = 1 ;//SPI采用主模式
SPICR1_SPTIE = 0 ;//SPI发送中断禁止
SPICR1_SPIE = 0 ;//SPI接收中断禁止
SPICR2_XFRW = 1 ;//16位SPI格式
SPICR2_MODFEN = 1 ;//与SPICR1的SSOE位配合,
//使能SPI的CS信号
SPICR2_BIDIROE = 0 ;//与SPICR2的SPC0位配合使
//用,禁止接收/发送的缓冲
SPICR2_SPISWAI = 1 ;//在芯片等待模式下,停止SCLK
//发送
SPICR2_SPC0 = 0 ;//设置发送/接收单向模式
SPIBR = 0x02;//在MM9Z1_638总线频率为32 MHz
//的条件下,设置SPI的SCLK为4 MHz
SPICR1_SPE = 1 ;//使能SPI模块
}
16位SPI发送函数:
void SPI_send_16 (unsigned int data){
while (!SPISR_SPTEF); //判断SPI状态寄存器SPISR
//的SPTEF位,等待发送寄存器为空
SPIDR = data; //数据送给SPI数据寄存器SPIDR
}
3.2 电池被动均衡函数
通过控制开关芯片MC33879接合或断开放电电阻,实现每块电池的被动均衡。MM9Z1_638通过SPI来控制MC33879的每一路开关。可以看出,要控制开关1~4,只需要对Bit0~3进行置位(“1”,开关闭合)、复位(“0”,开关打开)的操作。
#1电池的放电函数:
void BAL_CELL1_ON (unsigned int* SPI_message){
*SPI_message = (*SPI_message & 0xFFF0) | 0x0001;
SPI_send_16(*SPI_message);
}
#2电池的放电函数:
void BAL_CELL2_ON (unsigned int* SPI_message) {
*SPI_message = (*SPI_message & 0xFFF0) | 0x0002;
SPI_send_16(*SPI_message);
}
#3电池的放电函数:
void BAL_CELL3_ON (unsigned int* SPI_message) {
*SPI_message = (*SPI_message & 0xFFF0) | 0x0004;
SPI_send_16(*SPI_message);
}
#4电池的放电函数:
void BAL_CELL4_ON (unsigned int* SPI_message){
*SPI_message = (*SPI_message & 0xFFF0) | 0x0008;
SPI_send_16(*SPI_message);
}
4 块电池全部断开放电电路的函数:
void BAL_4CELL_OFF (unsigned int* SPI_message){
*SPI_message = *SPI_message & 0xFFF0;
SPI_send_16(*SPI_message);
}
MC33879的SPI格式如下。
结语
通过介绍基于飞思卡尔电池管理芯片MM9Z1_638的硬件系统、软件模块,阐明了电池管理系统的设计流程,详细分析了开发中的技术难题和细节。对于想要开发基于MM9Z1_638的工程技术人员有直接的参考意义,同样,对于开发基于其他电池管理芯片的设计也有一定的参考价值。