基于STM32L476的锂电池SOC检测

本文介绍了一种针对便携式设备的锂电池SOC(荷电状态)估算方法,通过采集电池电压并结合电池充放电特性曲线进行计算,实现简单有效的SOC估算。文章详细描述了硬件设计与软件实现过程,并展示了测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

便携式设备由于使用需求而配备了锂电池,但使用过程中需要掌握电源的状态才能保证设备正常运行。而且在电池充放电的过程中,监控电池的充放电状态也是保证设备安全的需要。

1、硬件设计

电池SOC检测是一个难题,有很多的模型和检测电路。但对于我们这样一台很小的便携式一起来说,使用各类检测模型和电路无论成本还是周期都不允许,所以只能想别的办法。

我们使用一个采样电路采集电压信号,形成以个0-2.5V的差分信号,如下图所示:

再将差分信号引入到具有差分信号输入功能的ADC控制器,就可以采集电池的电压了。模拟量采集在前面已经试验过了:

在STM32L476RG开发板中,有SPI3口已经引到端子可以使用。各引脚分别为:

CN7-1 PC10 SPI3-SCK

CN7-2 PC11 SPI3-MISO

CN7-3 PC12 SPI3-MOSI

在开发板上的位置如下红框标识:

关于硬件配置这里就不再叙述了。

2、软件设计

前面说过了我们使用采集电池电压的方式来估算电池的SOC,那么首先我们来看一看电池SOC与电压的关系。一般的锂电池电压与SOC的关系可表示如下图:

根据上图我们可以知道在10%到100%的范围内电压的变化是比较平缓的,但在10%以下就会计数下降。在我们估算SOC是其实在小于10%的时候就应该认为电池已经不具备工作条件。

首先定义一个数组用于存储电池电压值,然后再检测到电压值后与存储的数据对比。获得相应的区间计算SOC值。

float voltages[2][13];
/*查找目标位置*/
static uint16_t FindTargetLocation(float voltage)
{
  uint16_t position=0;
  while(voltages [1][position]< voltage)
  {
    if(position<12)
    {
      position++;
    }
    else
    {
      position++;
      break;
    }
  }
  
  return position;
}

static float LookupCalcSoc(float voltage)
{
  float temp;
  uint16_t index=14;
  
  index=FindTargetLocation(voltage);
  
  if(index<=0)
  {
    temp= voltages [0][0];
  }
  else if(index>=13)
  {
    temp= voltages [0][12];
  }
  else
  {
    float lowV= voltages [0][index-1];
    float lowS= voltages [1][index-1];
    float highS= voltages [1][index];
    
    temp=((resistance-lowS)*0.5)/(highS-lowS)+lowV;
  }
  
  return temp;
}

以上是我们对电池SOC的估算方式,当然不同的厂家电池也许充放电曲线会有些差异,但方法应该都是一致的。

3、测试结果

我们看一看在屏上显示出来的效果,有图标动态显示,也有数字指示,如下图所示:

在这一次我们采用了简单的做法,这种做法叫做电压估算法。

欢迎关注:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值