第2章:电量计量基础——库仑计数法原理、电压查表法、混合计量模型

各位同学,欢迎来到电量计量的核心章节。

做智能手表,最头疼的问题是什么?我猜很多人会说是「续航」。但续航准不准,其实取决于一个更底层的东西——电量计量。你想想看,用户看着手表上还剩20%的电,结果出门跑个步就自动关机了,这种体验有多糟糕?

这一章,我们就来聊聊电量计量的三种主流方法。我个人习惯把它们叫做「老中青三代」:库仑计数法(老将)、电压查表法(中年)、混合计量模型(新秀)。

2.1 库仑计数法:最朴素的「数电子」方法

库仑计数法,说白了就是数流进流出电池的电荷量。

它的原理非常简单:
电流对时间积分,得到的就是电量。

// 库仑计数法核心公式
Q(t) = Q(t₀) + ∫ I(t) dt

// 离散化实现(每100ms采样一次)
static float total_capacity = 0;  // 单位:mAh
void coulomb_counting(float current_ma) {
    total_capacity += current_ma * 0.1 / 3600;  // 100ms = 0.1h
}

嗯,这里要注意一个关键点:初始电量Q(t₀)怎么确定? 我在项目中遇到过这个问题——手表刚开机时,电池电压是3.8V,但你怎么知道它对应的是80%还是85%?

避坑指南: 我曾经在一个量产项目中,因为初始电量校准偏差了3%,导致用户反馈「电量跳变」。后来我加了一个开机静置5秒后查表校准的流程,才彻底解决。

库仑计数法的优点很明显:

  • 精度高(如果电流采样够准)
  • 实时性好(每100ms更新一次)
  • 实现简单(一个累加器搞定)

但缺点也很致命:

  • 累积误差——采样误差会一直累加,跑一个月可能偏了10%
  • 需要校准——每次充满电或放空电时,必须重置
  • 低功耗场景不准——手表待机时电流只有几微安,ADC根本测不准

2.2 电压查表法:简单粗暴的「看电压猜电量」

电压查表法,就是根据电池的开路电压(OCV)来估算剩余电量。

为什么能这么干?因为锂电池的电压和电量之间,存在一个近似单调的关系——OCV-SOC曲线

电压 (V) 电量 (%) 备注
4.20 100% 满电
3.80 60% 平台区
3.60 20% 开始陡降
3.30 5% 接近关机

你想想看,这个表看起来很简单,但实际做起来坑很多。我遇到过最典型的问题:手表在运动时,电压会剧烈波动。跑步时电流突然增大,电压瞬间掉0.2V,查表一看电量从50%掉到30%——用户直接吓傻了。

我的经验: 电压查表法只适合在「静置状态」下使用。我一般会在手表检测到静止超过30秒后,才用电压法做一次校准。运动过程中,坚决不用。

电压查表法的优缺点:

  • ✅ 实现简单,不需要电流传感器
  • ✅ 没有累积误差
  • ❌ 动态负载下不准
  • ❌ 电池老化后曲线会偏移
  • ❌ 温度影响大(低温时电压偏低)

2.3 混合计量模型:取长补短的「黄金搭档」

既然库仑计数法和电压查表法各有短板,那把它们结合起来呢?

这就是混合计量模型的核心思想:用库仑计数法做短期高精度计量,用电压查表法做长期校准

// 混合计量模型伪代码
typedef struct {
    float coulomb_soc;      // 库仑法估算的电量
    float voltage_soc;      // 电压法估算的电量
    float blended_soc;      // 最终输出
    float confidence;       // 置信度(0~1)
} BatterySOC;

void update_soc(BatterySOC *soc, float current, float voltage) {
    // 1. 库仑法更新
    soc->coulomb_soc += current * 0.1 / 3600;
    
    // 2. 电压法查表
    soc->voltage_soc = lookup_ocv_table(voltage);
    
    // 3. 动态权重融合
    float weight = calculate_weight(current, voltage);
    soc->blended_soc = weight * soc->coulomb_soc 
                     + (1 - weight) * soc->voltage_soc;
    
    // 4. 边界校准
    if (voltage > 4.15V) soc->blended_soc = 100%;
    if (voltage < 3.30V) soc->blended_soc = 0%;
}

这里最关键的是权重计算。我个人的做法是:

  • 当电流稳定且适中(10mA~100mA)时,库仑法权重给到0.8
  • 当电流接近0(待机)或剧烈波动时,电压法权重提升到0.6
  • 当检测到充满或放空时,强制重置库仑计数器

核心要点: 混合模型不是简单的平均,而是根据工况动态调整信任度。说白了,就是「谁准听谁的」。

2.4 实战中的坑与对策

讲了这么多理论,来点实际的。我在智能手表项目中踩过的坑:

  1. 温度补偿——冬天在户外,电池内阻增大,电压偏低。我加了一个温度查表修正,每5°C一个档位。
  2. 电池老化——用了半年的手表,满电电压从4.20V降到4.15V。我加了一个循环计数,每100次充放电更新一次OCV曲线。
  3. 关机电压不准——有些手表在3.0V才关机,有些3.3V就保护了。这个必须根据具体电芯规格来配。

我曾经犯过的错: 有一款手表,我直接用参考设计里的OCV表,没做实测校准。结果量产5000台后,有300台反馈「电量显示不准」。后来我花了两周时间,用高精度电源测了50块电池,重新拟合了曲线才搞定。所以,永远不要相信参考设计里的参数

2.5 小结

这一章我们聊了三种电量计量方法:

  • 库仑计数法——精度高但有累积误差,适合短期计量
  • 电压查表法——简单但动态不准,适合静置校准
  • 混合计量模型——取长补短,是目前智能手表的主流方案

下一章,我们会深入讲电池建模与参数辨识——也就是怎么给你的手表电池建一个「数字孪生」模型。到时候你会看到,真正的电量计量远不止「数电子」这么简单。

嗯,今天就到这里。有问题欢迎在课程群里讨论,或者直接来找我。