2、功耗分析基础:电流电压基础、功率计算、电池模型与放电曲线

好,咱们正式开始聊功耗分析。说实话,很多做应用层的兄弟一听到「电流电压」就觉得头大,觉得这是硬件工程师的事。我以前也这么想,直到有一次被一个功耗问题折腾了整整两周……嗯,从那以后我老实了。不懂基础,你连问题出在哪都说不清楚。

2.1 电流与电压:功耗的「油门」和「速度」

先来点最基础的。电压,你可以理解为「推动力」;电流,就是「流量」。功耗呢?说白了就是这两者的乘积。

我习惯用一个比喻:电压像水管里的水压,电流像水流的速度。水压大,水流快,单位时间流过的水就多——功耗就大。反过来,水压小,水流慢,功耗就小。

在手机、IoT设备里,我们最常打交道的电压是 3.3V、1.8V、1.2V 这些。电流呢?待机时可能是微安级(μA),跑起来就是毫安级(mA),甚至安培级(A)。

核心公式:

  • 直流功率: P = V × I
  • 交流功率(简化): P = V × I × cosφ(功率因数,一般嵌入式里近似为1)
  • 能量: E = P × t(单位:焦耳 或 毫瓦时 mWh)

举个例子。你测到一个模块工作电流是 200mA,电压 3.3V。那它的功耗就是 3.3 × 0.2 = 0.66W。如果它持续工作 1 小时,消耗的能量就是 0.66Wh,也就是 660mWh。

我的小技巧: 实际项目中,我习惯把电流单位统一成安培(A),电压统一成伏特(V),这样算出来的功率就是瓦特(W),不容易搞混。很多新手用 mA 和 V 直接乘,结果单位对不上,排查半天才发现问题。

2.2 功率计算:不只是 V×I 那么简单

你以为功耗就是 V×I?太天真了。实际项目中,电流是动态变化的,电压也不是恒定的。

我遇到过最典型的场景:一个 WiFi 模块在发射数据时,电流会瞬间飙到 300mA,然后迅速回落到几十毫安。如果你只测一个平均值,那你就错过了峰值功耗——而峰值功耗恰恰是导致电池电压跌落、系统重启的元凶。

所以,功率计算要分几种情况:

场景 计算方法 典型应用
稳态功耗 P = V × I(I 稳定) 待机、常亮屏幕
平均功耗 P_avg = (1/T) × ∫V(t)×I(t) dt 周期性任务(如传感器采样)
峰值功耗 P_peak = max(V(t) × I(t)) 射频发射、CPU 突发运算
能量消耗 E = ∫P(t) dt 电池续航估算

你想想看,如果只算平均功耗,你可能会觉得「嗯,50mA,还行」。但实际峰值到了 500mA,电池内阻大一点,电压直接掉到 2.7V,系统就复位了。这种坑,我踩过不止一次。

注意: 计算平均功耗时,采样率一定要够。我曾经用 1Hz 的采样率去测一个 100ms 的脉冲,结果平均功耗算出来只有实际的一半。后来改用 100Hz 采样,数据才靠谱。建议至少是信号频率的 10 倍。

2.3 电池模型:不是简单的「电压源」

很多初学者把电池当成一个理想电压源——3.7V 就是 3.7V,直到没电。但实际电池不是这样的。

电池有内阻。你想想看,当电流突然增大时,内阻上会产生压降,导致电池端电压瞬间下降。这就是为什么你手机在打游戏时,电量显示会突然掉一截——不是电池坏了,是内阻在作祟。

常用的电池模型有两种:

  • 简单 RC 模型: 一个电压源 + 一个内阻 R0 + 一个 RC 网络(模拟极化效应)。适合快速估算。
  • Thevenin 模型: 更精确,包含多个 RC 支路,模拟不同时间常数的极化反应。适合高精度仿真。

我个人的习惯是:做快速原型时用简单 RC 模型,做产品级功耗评估时用 Thevenin 模型。别一上来就搞复杂的,先跑通再说。

电池模型关键参数:

  • 开路电压(OCV): 电池不放电时的电压,与 SOC(荷电状态)有固定关系。
  • 内阻(R0): 通常几十到几百毫欧,随 SOC 和温度变化。
  • 容量(C): 单位 mAh 或 Ah,但实际可用容量受放电倍率影响(Peukert 效应)。

2.4 放电曲线:读懂电池的「心电图」

放电曲线,说白了就是电池电压随放电时间的变化图。我刚开始看这图时,觉得不就是一条斜线嘛。后来才发现,这里面信息量巨大。

典型的锂电池放电曲线分三个阶段:

  1. 快速下降区: 刚放电时,电压从 4.2V 快速降到约 3.8V。这个阶段很短,但容易让人误以为电池「虚电」。
  2. 平台区: 电压在 3.6V~3.8V 之间缓慢下降。这是电池的主要工作区间,占了 70%~80% 的容量。
  3. 陡降区: 电压低于 3.3V 后,下降速度急剧加快。这时候电池基本快没电了,系统应该及时关机保护。

我曾经犯过一个错误:用平台区的电压去估算剩余电量,结果在低温环境下,电压掉得特别快,系统还没到 3.0V 就关机了。后来我学乖了,必须用 OCV-SOC 曲线查表,而不是简单线性映射。

避坑指南: 不同放电倍率下,放电曲线差异很大。0.2C 放电和 1C 放电,平台区电压能差 0.2V 以上。做电池续航测试时,一定要用实际负载电流去测,别用标准放电条件的数据来估算。

2.5 实战:用 Python 模拟电池放电

光说不练假把式。我写了个简单的 Python 脚本,模拟电池放电过程。你可以拿它来理解放电曲线的形状。

import numpy as np
import matplotlib.pyplot as plt

# 模拟电池参数
capacity_mah = 3000  # 电池容量 3000mAh
voltage_full = 4.2   # 满电电压
voltage_cutoff = 3.0 # 截止电压
internal_resistance = 0.1  # 内阻 100mΩ

# 放电电流(模拟不同负载)
current_a = 0.5  # 500mA 放电

# 时间轴(小时)
time_hours = np.linspace(0, capacity_mah / 1000 / current_a, 100)

# 简化放电模型:电压随 SOC 线性下降 + 内阻压降
soc = 1 - (time_hours * current_a * 1000) / capacity_mah
voltage_ocv = voltage_full - (voltage_full - voltage_cutoff) * (1 - soc)
voltage_terminal = voltage_ocv - current_a * internal_resistance

# 只保留高于截止电压的部分
valid = voltage_terminal >= voltage_cutoff
time_valid = time_hours[valid]
voltage_valid = voltage_terminal[valid]

print(f"模拟放电时间: {time_valid[-1]:.2f} 小时")
print(f"截止时电压: {voltage_valid[-1]:.3f} V")

# 实际项目中,你会用这个模型去估算不同负载下的续航
# 比如:待机 0.1mA 能撑多久?打游戏 500mA 能撑多久?

这段代码虽然简单,但已经能帮你理解内阻对端电压的影响了。你试试把内阻改成 0.5Ω,看看电压掉得多快——这就是为什么旧电池「不耐用」的原因之一。

注意: 实际电池的 OCV-SOC 曲线不是线性的,尤其是磷酸铁锂电池,平台区非常平坦,用线性模型会严重误判。建议从电池厂商拿到实测数据,用插值法查表。

好了,这一章的内容就到这。电流电压是基础,功率计算是工具,电池模型和放电曲线是实战武器。下一章我们会聊怎么用这些基础去搭建自动化检测框架——到时候你会发现,今天这些「枯燥」的理论,全都能派上用场。