0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

电池SOC估算中的安时积分与卡尔曼滤波的数值计算方法

冬至子 来源:日笃小站 作者:日笃小站 2023-06-25 17:06 次阅读

接下来的Matlab数值计算,将以电池建模的foster型等效电路为基础,在连续时间内对电池进行系统同定。

图片

foster等效电路

首先,我们利用输入输出的数据来推测电池模型的参数。推测的参数为:

θ = [ R0 Rd Cd FCC SOC0 ] T

图片

输入输出数据与SOC

电池的建模(Matlab)

数值实验用输入出数据的生成:

[ex_batt.m]1

%%假想实验数据的作成

Te = 2*3600; %实验结束时刻[sec]

Ts = 1; %采样周期[sec]

t = ( 0: Ts: Te );

N = length(t);

%输入(电流)的设定

u = 40sawtooth( tsqrt(2)) + 10*sin(t) - 18;

%输出(电压)的生成

SOC0 = 95; %初期SOC[%]

FCC = 40*3600; %满充电容量[C]

R0 = 0.450e-3; %电池内阻[ohm]

Rd = 0.500e-3; %扩散电阻[ohm]

Cd = 82000; %扩散电容[F]

th0 = [ R0, Rd, Cd, FCC ];

Nd = 3; %foster等效电路的近似级数

[ f, h, A, C, ymodel ] = batterymodel_foster(Nd);

%Simulation

[ y0, x ] = ymodel( u, t, th0, [SOC0; zeros(Nd, 1)] );

SOC = x(1, :);

%含有误差的采样值的模拟

um = u + randn(1, N) * 0.1; %电流传感器的误差

ym = y0 + randn(1, N) * 0.01; %电压传感器的误差

%波形

figure(3), hold on

subplot(3,1,1); plot(t/60, u)

ylabel('Current [A]'), xlim([0 Te/60]), ylim([-100 50)]

subplot(3,1,2); plot(t/60, y0)

ylabel('Voltage [V]'), xlim([0 Te/60]), ylim([3.2 4.2)]

subplot(3,1,3); plot(t/60, SOC)

ylabel('SOC [%]'), xlim([0 Te/60]), ylim([0 100)]

xlabel('Time [min]),

上述 “m file” 里面使用的函数 “batterymodel_foster" , 用以下方式记述。

[batterymodel_foster.m]

function [ f, h, A, C, ymodel ] = batterymodel_foster(Nd)

n = 1:Nd;

%参数矢量与物理常数的关系定义

R0 = @(th) th(1);

Rd = @(th) th(2);

Cd = @(th) th(3);

FCC = @(th) th(4);



A = @th blkdiag(0, -pi^2/4 * diag((2*n-1).^2)/Rd(th)/Cd(th();

B = @th [100/FCC(th); 2*ones(Nd,1)/Cd(th)];



f = @(x, u, th) A(th)*x + B(th)*u;

h = @(x, u, th) SOC2OCV(x(1,:)) + [0, ones(1, Nd)]*x+R0(th)*u;



%利用数值微分来计算SOC的雅可比数列

C = @(x) [numdiff(@SOC2OCV, x(1)), ones(1, Nd)];

%yhat:预测输出的函数

function [y, x] = proto_ymode(u, t, th, x0)

    x = lsim(ss(A(th), B(th), eye(Nd+1), 0), u, t, x0, 'zoh')';

    y = h(x, u, th);

end

ymodel = @proto_ymodel;

end

上述的雅可比数列A,C为状态推算时使用。

我们再来看看偏微分的数值计算。

[numdif.m]

function [dfdx] = numdiff(f, x)

n = length(x);

h = eye(n)*1e-5;

dfdx = arrayfun(@(k) (f(x+h(:, k)) - f(x-h(:,k)))/(2*h(k, k)), 1:n);

end

另外,SOC-OCV特性的简易模型我们可以用以下m file来记述。

[SOC2OCV.m]

function ocv=SOC2OCV(SOC)

%系数设定

E0 = 4.14;    

K1 = 0.237;

K2 = -0.0516;

K3 = 1.05e-3;

K4 = 0.183;



mode = @(soc) E0 + K1.*log(soc/100) + K2.*log(1-soc/100) - K3./soc*100 - K4.*soc/100;

ocv = model(SOC);



ocv(SOC >98) = numdiff(model, 98)*(SOC(SOC >98)-98) + model(98);

ocv(SOC<  2) = numdiff(model, 2)*(SOC(SOC< 2)-2) + model(2);

end

下面继续[ex_batt.m]来进行连续时间里的电池系统同定,转而来推算模型的参数。

[ex_batt.m]2

%%连续时间系统同定

yhat = @(th) ymodel(um, t, th(1:4), [th(5); zeros(Nd, 1)]);

%初期推算值

thhat0 = [1e-3, 1e-3, 1e5, 30*3600, 80];

%输出误差最小化的参数推算

thhat = Isqnonlin(...

@(th) ym-yhat(th.*thhat0), thhat0./thhat0, [ ], [ ],...

            optimoptions(@Isqnonlin, 'Display', 'iter',...

            'Algorithm', 'levenberg-marquardt')) .*thhat0

综如上述所诉,在连续时间内利用系统同定的方法,从实验得到的输入输出数据,可以定义内含物理现象的电池模型的参数。

电池状态的推定

众所周知,电池的状态主要包括SOC(剩余电量)和SOH(剩余寿命)。

SOC的推定方法可以总结为:

  1. 依据放电试验的SOC测定
  2. 基于电池端子电压的SOC推定
  3. 基于OCV测试的SOC推定
  4. 依据安时积分法的SOC推定
  5. 基于模型的SOC推定

图片

SOH的推定方法可以总结为:

  1. 利用完全充放电测试容量的SOH推定
  2. 依据内部电阻查表的SOH推定
  3. Bookkeeping的SOH推定
  4. 基于模型的SOH推定

图片

内部电阻的推定方法可以总结为:

  1. 依据I-V特性(电流电压特性)的线性回归的内部电阻推定
  2. 从step跳跃应答的内部电阻推定
  3. 依据电阻测试的内部电阻推定
  4. 基于模型的内部电阻推定

图片

虽然有各种推算方法,但是我们需要根据:要求精度,使用环境,硬件条件,在线连续推定的必要性等等来具体判断用什么方法。

下面我们就给出比较复杂的利用卡尔曼滤波以及安时积分推算SOC的Matlab建模方法。

[ex_batt.m]3

%%利用EKF的状态推定

%离散时间的状态空间建模

f_ct = @(x, u) f(x, u, th0); %模型参数的固定

f_dt = c2d_euler(f_ct, Ts); %euler法的离散化

%fd的雅可比数列

Ad = expm(A(th0)*Ts); %f的雅可比解析计算

Q = diag([0.1Ts)^2, 1e-6ones(1, Nd)]); %系统外乱

R = 0.01^2; %观测外乱

xhat = zeros(Nd+1, N); %状态推算值

P = zeros(Nd+1, Nd+1, N); %推定分散

%初期推算值

SOChat0 = OCV2SOC(ym(1));

xhat(:,1) = [SOChat0; zeros(Nd,1)];

P(:,:,1) = diag([1e2, 1e-4*ones(1, Nd)]);

%更新时间

for k=2:N

[xhat(:,k),P(:,:,k)] =...

ekf(@(x) f_dt(x, um(k-1)), @x h(x, um(k), th0),...

@(x) Ad, C, Q, R, ym(k), xhat(:,k-1), P(:,:,k-1));

end

%表示结果

figure, plot_SOC(t, xhat(1,:), squeeze(P(1,1,:))',SOC);

EKF_RMSE = sqrt(mean((xhat(1,:) - SOC).^2,2));

%%安时积分法

SOC_cc = zeros(1, N);

SOC_cc(1) =SOChat(0);

for k=1:N-1

SOC_cc(k+1) = SOC_cc(k) + um(k)*Ts/FCC*100;

end

%表示结果

figure, plot_SOC(t, SOC_cc, [ ], SOC);

CC_RMSE = sqrt(mean((SOC_cc - SOC).^2,2));

上述euler的离散时间的状态方程式变化方法为:

[c2d_euler.m]

function fd = c2d_euler(fc, h)

fuction x_new = fproto(x, u)

    x_new = x + h*fc(x, u);

end

fd = @fproto;

end

SOC推算结果的表示

[plot_SOC.m]

function [ ] = plot_SOC(t, SOChat, P, SOC)

subplot(2,1,1), hold on

plot(t/60, SOC, 'r', 'LineWidth', 2)

plot(t/60, SOChat, 'b', 'LineWidth', 0.5)

xlim([0 t(end)/60]), ylim([0 100]);

xlabel('Time [min]'), ylabel('SOC [%]')

legend('True', 'Estimated', 'Location', 'Best')

box on



subplot(2,1,2), hold on

if ~isempty(P)

    hold on

    patch([t, fliplr(t)]/60,...

        [(SOChat-SOC-2*sqrt(P)), fliplr(SOChat-SOC+2*sqrt(P))],...

        ' ','FaceColor', [0.5, 0.5, 1], 'FaceAlpha', 0.5,...

        'EdgeAlpha', 0)

end

plot(t/60, SOChat-SOC, 'b')

plot([0 t(end)/60], [0 0], 'r', 'LineWidth', 2)

xlabel('Time [min]'), ylabel('Error [SOC%]')

xlim([0 t(end)/60]), ylim([-5 3]);

box on

end

上述为线性卡尔曼滤波的推算方法,非线性卡尔曼滤波的matlab建模方式基本相同,这里就不做介绍了。另外,本文是以EV为对象所建模,以HEV为对象时,由于电流波形的差异,推定的结果会有变故。HEV的刹车回生充电,内燃机回生充电,SOC都是在50%附近控制,所以对于输入的电流波形,不会有低频率的成分。

对于实际使用电池的系统来说,有着电池组内的误差,生产误差,环境温度误差等各项影响因素,所以未来我们使用模型推算电池状态时,不仅要考虑到这些误差因素的影响,更要考虑到锂电池材料进化的影响。未必复杂的算法适用于每个产品,我们需要根据实际的条件以及性价比等各种综合因素来挑选推算的方法,希望读者朋友们互相切磋,共同进步。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SoC芯片
    +关注

    关注

    1

    文章

    608

    浏览量

    34878
  • MATLAB仿真
    +关注

    关注

    4

    文章

    176

    浏览量

    19904
  • 卡尔曼滤波
    +关注

    关注

    3

    文章

    162

    浏览量

    24636
  • 电池系统
    +关注

    关注

    9

    文章

    387

    浏览量

    29898
收藏 人收藏

    评论

    相关推荐

    卡尔滤波的原理说明

    机器人导航,控制,传感器数据融合甚至在军事方面的雷达系统以及导弹追踪等等。近年来更被应用于计算机图像处理,例如头脸识别,图像分割,图像边缘检测等等。2.卡尔滤波器的介绍(Introd
    发表于 09-21 11:41

    电池SOC

    电池SOC对于电池组目前电量计实现方法主要有TI的阻抗跟踪、电流积分的库伦计、卡
    发表于 08-26 10:59

    soc计算方法

    soc计算方法,BMSSOC计算其实可以分为三大部分:1、电芯层级的SOC
    发表于 07-27 06:13

    电池SOC的自适应平方根无极卡尔滤波计算

    电池SOC的自适应平方根无极卡尔滤波计算法,下来看看
    发表于 01-13 13:26 19次下载

    基于卡尔滤波的动力电池SOC精确估计

    基于卡尔滤波的动力电池SOC精确估计
    发表于 01-13 13:28 33次下载

    卡尔滤波算法在锂电池SOC估算的应用

    卡尔滤波算法在锂电池SOC估算的应用
    发表于 01-13 13:50 17次下载

    基于自适应卡尔滤波的矿用救生舱动力电池SOC估计_于微波

    基于自适应卡尔滤波的矿用救生舱动力电池SOC估计_于微波
    发表于 12-31 14:44 7次下载

    电池SOC的自适应平方根无极卡尔滤波计算

    电池SOC的自适应平方根无极卡尔滤波计算法_胡志坤
    发表于 01-07 17:16 3次下载

    球面单形—径向容积求积分卡尔滤波算法

    为了进一步提高非线性卡尔滤波算法的估计精度,提出一种高阶球面单形一径向容积求积分卡尔
    发表于 01-15 16:58 1次下载

    如何在单片机上实现卡尔滤波详细计算方法和程序概述

    本文档的主要内容详细介绍的是如何在单片机上实现卡尔滤波详细计算方法和程序概述。
    的头像 发表于 08-11 11:23 1.3w次阅读
    如何在单片机上实现<b class='flag-5'>卡尔</b><b class='flag-5'>曼</b><b class='flag-5'>滤波</b>详细<b class='flag-5'>计算方法</b>和程序概述

    电池SOC 估算方法卡尔滤波器法

    本期主要介绍的是电池SOC 估算方法的第三种方法的剩余部分
    的头像 发表于 09-21 15:51 1.3w次阅读
    <b class='flag-5'>电池</b><b class='flag-5'>SOC</b> <b class='flag-5'>估算</b><b class='flag-5'>方法</b><b class='flag-5'>中</b><b class='flag-5'>卡尔</b><b class='flag-5'>曼</b><b class='flag-5'>滤波</b>器法

    基于扩展卡尔滤波SOC估算仿真

    基于扩展卡尔滤波SOC估算Simulink仿真,内容完整,模型可仿真,代码可实现
    发表于 08-25 15:22 14次下载

    浅析卡尔滤波

    在 飞行器姿态计算 卡尔滤波是最常用的姿态计算方法之一。今天就以目前的理解讲以下
    的头像 发表于 06-14 10:44 2004次阅读

    基于自适应卡尔滤波算法的电池SOC估算研究

    本文采用自适应卡尔滤波算法,基于Thevenin/RC电池模型,锂离子电池SOC进行
    的头像 发表于 06-28 11:45 3312次阅读
    基于自适应<b class='flag-5'>卡尔</b><b class='flag-5'>曼</b><b class='flag-5'>滤波</b>算法的<b class='flag-5'>电池</b><b class='flag-5'>SOC</b><b class='flag-5'>估算</b>研究

    卡尔滤波的数学基础

    卡尔滤波是一种用于估算线性动态系统状态的优化算法,其基础数学理论为贝叶斯定理,将传感器测量值和系统模型的预测值进行融合,得到对系统状态的估计。贝叶斯定理是基于条件概率的公式,用于
    的头像 发表于 08-30 10:18 852次阅读
    <b class='flag-5'>卡尔</b><b class='flag-5'>曼</b><b class='flag-5'>滤波</b>的数学基础