4、功率计算与积分:瞬时功率、平均功率与累计能耗(mAh/Wh)的计算方法

做低功耗设计,绕不开一个核心问题:这玩意儿到底能撑多久?

我见过不少工程师,拿着万用表测了个电流,然后简单一乘就算出续航了。结果呢?实际跑起来差一大截。为什么?因为电池供电的设备,电流从来不是恒定的。

今天我们就来聊聊功率计算和能耗积分。说白了,就是怎么把「瞬间的电流电压」变成「实实在在的电池消耗」。

4.1 瞬时功率:那一瞬间的能量流动

瞬时功率,就是某一时刻的功率值。公式很简单:

P(t) = V(t) × I(t)

其中 V(t) 是瞬时电压,I(t) 是瞬时电流。

嗯,这里要注意:对于电池供电设备,V(t) 并不是恒定的3.3V或1.8V。电池放电过程中,电压会逐渐下降。我遇到过不少新手,直接用标称电压算功率,结果误差能到10%以上。

关键点:瞬时功率是时间的函数。你测到的每一个电流值,都要乘以对应的电压值,才是真实的功率。

举个例子:

// 假设采样时刻 t1
V(t1) = 3.7V
I(t1) = 50mA
P(t1) = 3.7V × 0.05A = 0.185W

你想想看,如果这时候你用3.3V去算,得到的是0.165W,差了12%。对于低功耗设备来说,这个误差足以让你对续航的判断产生严重偏差。

4.2 平均功率:一段时间的平均消耗

平均功率,就是在一段时间内,瞬时功率的平均值。公式:

P_avg = (1/T) × ∫ P(t) dt

实际工程中,我们很少做连续积分。一般都是离散采样:

P_avg = (1/N) × Σ P(t_i)

我个人习惯的做法是:用示波器或者数据采集器,以固定间隔采样电流和电压,然后逐点计算功率,最后取平均。

我的经验:采样间隔要合理。对于MCU休眠+唤醒的工作模式,采样率至少要覆盖唤醒脉冲的宽度。我曾经因为采样率太低,漏掉了几个大电流脉冲,算出来的平均功率只有实际的一半。

来看一个实际案例:

// 假设一个BLE设备的工作周期
// 休眠:I=2μA, V=3.6V, 持续990ms
// 广播:I=8mA, V=3.6V, 持续10ms

// 瞬时功率
P_sleep = 3.6V × 0.000002A = 0.0000072W
P_tx = 3.6V × 0.008A = 0.0288W

// 平均功率(1秒周期)
P_avg = (0.0000072W × 0.99s + 0.0288W × 0.01s) / 1s
P_avg = 0.000295W ≈ 0.3mW

看到了吗?平均功率只有0.3mW,但瞬时功率在广播时高达28.8mW。这就是为什么不能用万用表直接测电流的原因——万用表的响应速度跟不上这种脉冲变化。

4.3 累计能耗:mAh 与 Wh 的恩怨情仇

累计能耗,就是一段时间内消耗的总能量。两个常用单位:mAhWh

先说说它们的区别:

  • mAh:电荷量单位。1mAh = 3.6库仑。它只考虑电流和时间,不考虑电压。
  • Wh:能量单位。1Wh = 3600焦耳。它同时考虑电压、电流和时间。

为什么会有两个单位?说白了,mAh 方便,Wh 准确。

电池厂商喜欢标 mAh,因为数字大,看着爽。但做低功耗设计,我建议你用 Wh。为什么?因为电池放电过程中电压在变,mAh 无法反映真实的能量消耗。

避坑指南:我曾经用mAh算续航,结果实际使用时间比理论值少了20%。后来发现,电池在低压段(3.0V以下)虽然还能放出mAh,但能量密度已经很低了。用Wh算,就不会有这个问题。

累计能耗的计算公式:

// 累计电荷量(mAh)
Q = ∫ I(t) dt
Q_mAh = Q / 3.6  (如果I的单位是A,t的单位是秒)

// 累计能量(Wh)
E = ∫ P(t) dt
E_Wh = E / 3600  (如果P的单位是W,t的单位是秒)

离散化之后:

// 假设采样间隔为 Δt(秒)
Q_mAh = Σ (I(t_i) × Δt) / 3.6
E_Wh = Σ (V(t_i) × I(t_i) × Δt) / 3600

4.4 实际工程中的积分方法

做嵌入式开发,我们不可能在MCU里做连续积分。常用的方法有两种:

方法一:定时采样累加法

用ADC定时采样电流和电压,然后累加。适合中等精度的场景。

// 伪代码示例
float total_mAh = 0;
float total_Wh = 0;
float dt = 0.001;  // 1ms采样间隔

void timer_isr() {
    float V = read_voltage();
    float I = read_current();
    
    total_mAh += (I * dt) / 3.6;
    total_Wh += (V * I * dt) / 3600;
}

方法二:库仑计芯片法

用专用的库仑计芯片(如TI的BQ系列、Maxim的MAX17260等)。这些芯片内部集成了ADC和累加器,精度高,而且不占用MCU资源。

我个人更推荐第二种方法,尤其是产品级的项目。为什么?因为MCU的ADC精度有限,而且采样间隔受程序执行时间影响,容易引入误差。

小技巧:如果预算有限,可以用MCU的ADC配合外部运放做电流检测。但一定要校准!我习惯在产线上用高精度万用表标定每个产品的电流检测通道,把增益误差和偏移误差都补偿掉。

4.5 一个完整的计算示例

假设我们有一个传感器节点,工作周期如下:

阶段 电流 电压 持续时间
休眠 5μA 3.6V 60s
传感器采集 15mA 3.6V 200ms
无线发送 25mA 3.5V 100ms

我们来算一个完整周期的能耗:

// 休眠阶段
Q_sleep = 0.000005A × 60s = 0.0003 库仑
E_sleep = 3.6V × 0.000005A × 60s = 0.00108 焦耳

// 采集阶段
Q_sense = 0.015A × 0.2s = 0.003 库仑
E_sense = 3.6V × 0.015A × 0.2s = 0.0108 焦耳

// 发送阶段
Q_tx = 0.025A × 0.1s = 0.0025 库仑
E_tx = 3.5V × 0.025A × 0.1s = 0.00875 焦耳

// 总能耗(一个周期)
Q_total = 0.0003 + 0.003 + 0.0025 = 0.0058 库仑
E_total = 0.00108 + 0.0108 + 0.00875 = 0.02063 焦耳

// 换算成常用单位
Q_total_mAh = 0.0058 / 3.6 × 1000 ≈ 1.61 mAh
E_total_Wh = 0.02063 / 3600 × 1000 ≈ 0.00573 mWh

// 如果周期是60.3秒,一天有多少个周期?
cycles_per_day = 86400 / 60.3 ≈ 1433

// 一天的能耗
daily_mAh = 1.61 × 1433 ≈ 2307 mAh
daily_Wh = 0.00573 × 1433 ≈ 8.21 Wh

嗯,这个结果告诉我们,如果用一节2000mAh的锂电池,理论上能撑不到一天。但实际中还要考虑电池的自放电、温度影响、以及电池在低压段的可用容量,所以实际续航会更短。

总结一下我的建议:

  • 用Wh算能耗,别只用mAh
  • 采样间隔要覆盖所有工作模式
  • 电压不能假设恒定,要实时测量
  • 有条件就用库仑计芯片,省心又准确

功率计算和能耗积分,说白了就是「积少成多」的过程。每一个微安、每一毫秒的消耗,最终都会反映在电池的续航上。做低功耗设计,就是要对这些细节斤斤计较。