先说明:硬件上确实可以直接采样电池总电压、电池总电流,做 (P_{bat}=V_{bat}* I_{bat};但在你这套多机并联 PCS 储能 没有直接这么做,而是用交流侧、PV 侧各路功率做功率守恒反推得到电池等效功率。
两个层面问题: 1)硬件直接 \(V\times I\) 的现实缺陷(为什么工程中也不迷信直接相乘) 2)代码为什么不走 “直接采样电池电压、电池电流算电池功率” 这条路线,而走交流侧功率守恒反推
一、理想世界:\(P=V_{bat} \cdot I_{bat}\) 是完美的
理想:
- \(V_{bat}\):电池端电压,高精度采样;
- \(I_{bat}\):电池总电流,高精度采样; 直接相乘,得到电池功率。
现实硬件会遇到一堆问题,导致直接\(V\cdot I\)不准。
1、采样误差、偏移、温漂(最现实)
- 电池电压采样:分压电阻、运放零点漂移,温度变化会带来偏移误差;
- 电池电流采样:分流电阻 / 霍尔电流传感器,零点漂移非常头疼。
尤其电池小电流:比如待机、轻充轻放,电流接近 0A,霍尔存在零点偏移。 例:真实电流 0.2A 充电,传感器零点偏移‑0.3A;读出来‑0.1A; \(P=V_{bat} \times I_{read}\),功率直接符号算反,闭环直接错乱。
电池侧经常工作在小电流工况(比如自发自用,负载不大),相对误差被放大。大电流下误差占比小,轻载误差爆炸。
2、电池侧是脉动电流,不是直流!(Boost‑BuckBoost 拓扑致命点)
硬件:电池 → Buck‑Boost 双向变换器。 电池端并不是平滑直流! Buck‑Boost 的电感 PWM 开关,电池侧电流是高频脉动电流,含有大量开关频率纹波。
- 如果 ADC 采样是PWM 异步采样(不是同步采样):采到的是瞬时脉动尖峰,不是真实平均电流。
- 想要得到一个控制周期内的平均电池电流,需要做同步采样 + 多采样滑动滤波。
如果你随便抓一个瞬时采样点做 \(V\times I\),算出来功率跳动剧烈,不适合作为功率闭环的反馈量。
👉对比:交流侧逆变器输出功率,一般是电网周期同步采样,可以算出一个电网周期的平均有功功率,相对稳定。
3、多机并联场景!支持系统是多台 PCS 并联接同一组电池
多台 PCS 共用同一锂电池簇:
- 每一台机器各自有 Buck‑Boost,多台机器的 Buck‑Boost 全部并联到同一路电池总母排。
方案 A:每台 PCS 本机采样本机 Buck‑Boost 的本机电池支路电流。 ✅可以得到:本机这一台 PCS 流入 / 流出电池的支路功率。 ❌但是!ADC 读不到整套电池的总电流! 整套电池总电流 = PCS1 支路电流 + PCS2 支路电流 + PCS3 支路 + …… 每一台机器只能读到自己这一路的支路电流,读不到其他从机的电池电流。
主机要做整套系统的总功率闭环(PCC 闭环、发电机削峰闭环),主机需要知道所有机器合起来,整套电池一共吞吐多少总功率。 👉主机本机的
Vbat * Ibat_local,只能算出本机 PCS 的电池支路功率,拿不到系统全部电池总功率! 这就是为什么源码不去直接用本机电池 V*I 当闭环反馈。
方案:
- 方案 1:电池总母排装一个总霍尔传感器,硬件测整套电池总电流;所有机器共享这个总电流信号。但工程布线、绝缘、硬件成本、可靠性会增加。
- 方案 2:功率守恒,交流侧反推整套系统电池总功率。通过并机通信把从机的 PV 功率、交流功率上传给主机,主机汇总所有交流、PV 功率,用节点功率守恒反推整套电池等效总功率。
这就是源码变量
g_parallelCtrl.AllInvPowerTotal的由来:整机交流功率,减去全部 PV 功率,反推系统电池总功率。注意:反推得到的是整套系统电池总功率,正好是主机做 PCC、发电机削峰闭环所需要的被控量。
二、两种获取电池功率路线对比
路线① 直接采样电池侧:\(P_{bat\_local}=V_{bat}\times I_{bat\_local}\)
优点:
- 物理直接,直观;不受交流侧采样影响。
缺点:
- 多机并联:本机只能得到本机支路电池功率,得不到整套系统电池总功率;主机闭环需要整套电池总功率,单靠本机 V*I 做不到;
- 电池 PWM 脉动电流,异步采样会带来功率抖动,必须做滤波;
- 轻载下霍尔零点漂移带来符号错误风险;
- 如果要总电池功率,需要额外增加电池总母排大霍尔传感器,增加 BOM 成本与布线。
用途:本机内部保护:过流、本机 BuckBoost 的电流内环,用本机电池电流,保护用,完全没问题。 ❌不适合作为主机整机系统级功率闭环的反馈量。
路线② 交流侧功率守恒反推
节点功率守恒(忽略损耗)
\(P_{bat\_total}=P_{ac\_inv\_total} - P_{pv\_all}\)
- \(P_{ac\_inv\_total}\):所有 PCS 逆变器交流输出总功率;
- \(P_{pv\_all}\):全部通道光伏总功率;
- \(P_{bat\_total}\):反推整套系统电池总功率。
优点:
- 多机并联天然友好:通过并机通信汇总所有从机的交流、PV 功率,直接算出整套系统电池总功率,正好满足主机 PCC / 发电机削峰闭环的被控对象;不需要在电池母排增加总霍尔硬件。
- 交流侧功率是按电网周期算平均有功功率,脉动小,适合做 ms 级慢速闭环反馈。
缺点:
反推会把整机所有损耗(逆变器损耗、线缆损耗)全部算进电池功率里面。 所以这套架构才需要你之前看到的:前馈 + 弱 PI;前馈是功率守恒模型,PI 专门用来补偿损耗、采样带来的稳态残余误差。 👉这就是为什么代码 PI 增益设置得很小,只做残余误差补偿。
关键真相: 反推出来的不是 100% 真实物理电池功率,是“系统等效电池功率”,它包含整机损耗。但对于 PCC 并网点功率闭环,这个等效量恰恰是闭环需要的量。 PCC 闭环关心的是:交流端口对外表现的功率平衡,电池在这里充当 “系统能量缓冲池”;损耗是系统内部,闭环可以靠 PI 残余修正吃掉。
三、那源码里 RealValue.f32BatChgDischgPower 是什么?
结构体
RealValue.f32BatChgDischgPower,这个变量很多人会混淆。 这个变量就是本机 PCS 的电池支路功率,本机电池电压 × 本机 BuckBoost 电池支路电流算出来的!源码中它的用途:
s_f32ForwardPower = RealValue.f32BatChgDischgPower; f32InvOutCalc = RealValue.f32BatChgDischgPower;在分支③(非发电机、非 PCC 闭环模式),环路切到跟随本机电池实际功率,做无扰切换。
✅本机保护、本机状态观测、无扰切换可以用 V×I; ❌但是主机做整套系统 PCC / 发电机削峰闭环,不用这个本机支路功率做闭环反馈,而是用交流侧反推的系统总电池功率。
四、工程上的现实折中总结
- 本机的保护、本机 BuckBoost 电流环:用本机电池电压 × 本机电池支路电流,无可替代。
- 多机并联系统级闭环(PCC 功率闭环、发电机削峰),主机需要整套电池总吞吐功率。
- 方案 A:电池母排加装总霍尔硬件;成本增加。
- 方案 B(本项目):交流侧 + PV 功率汇总,功率守恒反推系统等效总电池功率;依靠前馈 + 弱 PI 补偿损耗与采样误差,省去电池总霍尔硬件。
- 直接 \(V_{bat}\times I_{bat}\) 本身数学没问题,但受:PWM 脉动电流、霍尔零点温漂、轻载相对误差、多机并联拿不到总电流这些工程现实制约。
五、补充一个坑点
如果硬件同时有:电池总霍尔(测整套电池总电流),又用交流侧反推,两者数值不会完全相等,差值就是整机变换损耗 + 各路采样综合误差。 反推方案必须保留 PI 反馈用来吃掉这个差值,不能纯开环前馈运行,这也是代码 “前馈 + 弱 PI” 架构来源。
一句话记忆: \(V\times I\) 可以得到本机单台 PCS 的电池支路功率,但多机并联时主机拿不到整套电池总功率,所以系统级闭环不用它做反馈;转而用交流侧功率守恒反推整套系统等效电池总功率,再靠 PI 补偿损耗和采样偏差。