This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] BQ76940:用于中断 MCU 输入线路的 bq76940警报信号

Guru**** 2518240 points
Other Parts Discussed in Thread: BQ76940

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1170702/bq76940-bq76940-alert-signal-to-interrupt-mcu-input-line

器件型号:BQ76940

您好!

用于   处理电池数据读取的固件设计高度依赖于可能由 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中如何处理警报信号?

最恰当的考虑。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Kevin:

    一旦 ALERT 引脚为高电平、另一个故障将不会导致它再次切换。  它将保持高电平。  要确定是否触发了另一个故障、请检查状态寄存器。  这将显示发生了哪些事件和故障。

    最棒的

    Andria