您好!
用于 处理电池数据读取的固件设计高度依赖于可能由 CC_READY 触发的警报信号、或 bqOV、bqUV、bqSCD、bqOCD 等故障。
在输入中断例程中处理信号触发检测、如下所示:
//port1中断服务例程
#pragma vector=Port1_vector
_interrupt void ISR_PORT_1 (void)
{
中频(P1IFG 和 BIT5)
{
P1IFG &=~BIT4;//清除中断标志
bqAlert=true; <=!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
}
在任务中、如果 设置了"bqAlert"标志、则读取数据、如下代码所示、
void Taska (空)
{
uint8_t i;
静态 uint16_t TIME_OUT_COUNTER=0;
TIME_OUT_COUNTER++;
if (bqAlert=true) <=!!!!!!!!!!!!!!!!!!!!!!!!!!!
{
bqAlert=false; <=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
bqI2CError = no_significance;
bqStatus.StatusByte = BqGetRegisterByte (SYS_STAT); <=!!!!!!!!!!!!!!!!
bqI2CStatusReadError = bqI2CError;
BqSetRegisterByte (SYS_STAT、STAT_CC_READY); <=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if (bqI2CStatusReadError =false || TIME_OUT_COUNTER > 500)
{
if (bqStatus.StatusBit.DEVICE_XREADY =true)
{
//此故障数据不可信任
FAULT.BQ.bit.XREADY = true;
}
其他
{
FAULT.BQ.bit.XREADY = false;
// 250ms 周期完成
if (bqStatus.StatusBit.CC_READY = true) <=!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{
//读取库仑计数器
//int32_t cur;
float_t cur;
int16_t tmp;
tmp = BqGetCoulombCounter();
if (bqI2CError == false)
{
如果(tmp>=0)
bqCoulomb = tmp+1;
其他
bqCoulomb = tmp;//-1;
。 等等
}
其他
{
//I2C 错误
FAULT.BQ.bit.i2c =真;
}
//读取电池电压
uint16_t min=65535、max=0;
for (i=0;<NUMBER_OF_CELLS;i++)
{
tmp = BqGetCellVoltage (I+1);
if (bqI2CError == false)
{
RAM_Vol_Cell[i]=(uint16_t) gain2*tmp;
//RAM_Vol_Cell[i]= tmp;
IF (RAM_Vol_Cell[i]<min)
{
MIN=RAM_VolT_Cell[i];
LowestCellIndex = I;
}
IF (RAM_Vol_Cell[I]>max)
Max=RAM_Vol_Cell[i];
}
否则...
有趣的是、如果打开了 bqOV/bqUV 事件、警报信号 将不再生成任何数据、因此无法读取电池数据、
由于此类事件的恢复依赖于电池数据的持续读取、如下所示
静态空 FAULT_BQ_UV_RECOVERY_routine (空)
{
fault.delayCounter_1++;
if (fault.delayCounter_1 >(5*One_second))//20s
{
fault.delayCounter_1 =(5*One_second)+ 1;//继续
fault.delayCounter_2++;
if (fault.delayCounter_2 >(5*One_second))
{
if (RAM_LowestVol>= threshold[CUV_recovery_threshold]) <===== !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
{
//条件匹配,清除故障
FAULT.BQ.BYTE = 0x00;
FAULT.SYS.byte = 0x00;
BqSetRegisterByte (SYS_STAT、STAT_FLAGS);//清除故障和警报
logic.regbyte_sys_ctrl2.SysCtrl2Byte = BqGetRegisterByte (SYS_CTRL2);
//关闭 FET
logic.regbyte_sys_ctrl2.SysCtrl2bit。DSG_on = true;
logic.regbyte_sys_ctrl2.SysCtrl2bit。CHG_on = true;
BqSetRegisterByte (SYS_CTRL2、logic.regbyte_sys_ctrl2.SysCtrl2Byte);//在 bq UV 恢复时打开 FET
fault.delayCounter_1 = 0;
fault.delayCounter_2 = 5*One_second;
}
其他
{
fault.delayCounter_2 = 0;
}
}
}
}
我想知道当诸如 bqUV 之类的故障启用并与 CC_READY 事件混合时、bq76940中如何处理警报信号?
最恰当的考虑。