clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
rng('default')
C1 = 1000;
C2 = 2500;
R1 = .015;
R2 = .0015;
% R0 = .02402;
R0 = .001;
alpha = .65;
Cbat = 5*3600;
Tau1 = C1*R1;
Tau2 = C2*R2;
dt = .1;
% Continuous Time Model:
A_c = [0 0 0 ; ...
0 (-1/(R1*C1)) 0 ;...
0 0 (-1/(R2*C2))];
B_c = [(-1/Cbat); (1/C1); (1/C2)];
C_c = [alpha -1 -1 ];
D_c = [-R0];
sys = ss(A_c,B_c,C_c,D_c);
sys_d= c2d(sys,dt);
% Discrete Time Model:
Ad = [1 0 0 ; ...
0 exp(-dt/Tau1) 0 ; ...
0 0 exp(-dt/Tau2)];
Bd = [(-dt/Cbat); (R1)*(1-exp(-dt/Tau1)); (R2)*(1-exp(-dt/Tau2))];
Cd = C_c;
Dd = D_c;
wk_mean = 0;
Q = 2.5*10^-7;
vk_mean = 0;
R = 1*10^-4;
Wp = 2.5*10^-9;
% Wp = 2.5*10^-6;
A_ek = 1 ;
E_ek = 1;
F_ek = 1;
% Load Battery Measurements
load('mat\OCV_table.mat')
load('mat\OCV_slope_table.mat')
load('mat\Sim_Truth_ThirdOrder_with_CurrentBias.mat')
% Initial Conditions:
P(1) = 0; % Covariance
PT(1) =0 ; % Parameter Covariance
x1(1) = .98; % SOC - Battery Fully Charged
x2(1) = 0; % Vc1
x3(1) = 0; % Vc2
x1_hat(1) = x1(1);
theta_hat(1) = 0;
CT_ek(1) =0;
for k = 2:1:length(t)
x1(k) = Ad(1,1)*x1(k-1) + Bd(1,1)*I(k-1); % soc
x2(k) = Ad(2,2)*x2(k-1) + Bd(2,1)*I(k-1); % Vc1
x3(k) = Ad(3,3)*x3(k-1) + Bd(3,1)*I(k-1); % Vc2
% Model Prediction:
x1_hat_prev = Ad(1,1)*x1_hat(k-1) + Bd(1,1)*I(k-1);
theta_hat_prev = theta_hat(k-1);
P_prev = A_ek*P(k-1)*A_ek'+ E_ek*Q*E_ek';
PT_prev = PT(k-1)+ E_ek*Wp*E_ek';
if(x1_hat_prev >1)
x1_hat_prev = 1;
end
C_ek = interp1(soc_intpts_OCV_slope', OCV_slope_intpts, x1_hat_prev);
% Measurement Update:
V_hat(k) = interp1(soc_intpts_OCV',OCV_intpts,x1_hat_prev) - I(k)*R0 - x2(k) - x3(k)+ theta_hat_prev;
%Kalman Gains
L = P_prev*C_ek'*inv(C_ek*P_prev*C_ek'+ F_ek*R*F_ek');
CT_ek(k) = -R0+C_ek*(-dt/Cbat+Ad(1,1)*(-dt/Cbat-L*CT_ek(k-1)));
LT = PT_prev*CT_ek(k)'*inv(CT_ek(k)*PT_prev*CT_ek(k)'+ F_ek*R*F_ek');
x1_hat(k) = x1_hat_prev + L*(V(k)-V_hat(k));
theta_hat(k) = theta_hat_prev + LT*(V(k)-V_hat(k));
P(k) = P_prev - L*C_ek*P_prev;
PT(k) = PT_prev - LT*CT_ek(k)*PT_prev;
end
figure(1);
hold on
plot(t,SOC_act)
plot(t,x1_hat)
plot(t,x1)
title('扩展卡尔曼滤波器: SOC');
xlabel('时间');
ylabel('充电状态(SOC)');
legend('SOC 真实值','SOC 估计值','SOC OL');
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1.版本:matlab2022A,包含仿真操作录像,操作录像使用windows media player播放。 2.领域:电池SOC估计 3.仿真效果:仿真效果可以参考博客同名文章《基于EKF扩展卡尔曼滤波的电池SOC估计算法matlab仿真》 4.内容:基于EKF扩展卡尔曼滤波的电池SOC估计算法matlab仿真。基于扩展卡尔曼滤波(EKF)的电池SOC(State of Charge,即电荷状态)估计算法是一种用于估算电池剩余电量的有效方法。这种方法主要适用于非线性系统,如锂电池等,其电量状态与电压、电流等参数之间存在复杂的非线性关系。 5.注意事项:注意MATLAB左侧当前文件夹路径,必须是程序所在文件夹位置,具体可以参考视频录。
资源推荐
资源详情
资源评论
收起资源包目录
基于EKF扩展卡尔曼滤波的电池SOC估计算法matlab仿真.rar (16个子文件)
code
Runme1.m 2KB
mat
Sim_Truth_ThirdOrder_Corrected1.mat 1.34MB
Sim_Truth_ThirdOrder_with_CurrentBias.mat 1.3MB
OCV_slope_table.mat 2KB
Sim_Truth_SecondOrder_Corrected5.mat 1.35MB
Sim_Truth_FifthOrder_Corrected1.mat 1.35MB
IV_data_nonlinear.mat 1.35MB
OCV_table.mat 10KB
Sim_Truth_ThirdOrder_with_Bias.mat 1.35MB
ThreeRCModel_Validation_Data.mat 1.34MB
Sim_Truth_FifthOrder_w_Bias.mat 1.34MB
Runme2.m 2KB
func
KalmanParams.m 177B
Test_NaN.m 199B
BatteryParams.m 810B
操作视频.mp4 2.04MB
共 16 条
- 1
fpga和matlab
- 粉丝: 17w+
- 资源: 2627
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 使用C++实现的常见算法
- travel-web-springboot【程序员VIP专用】.zip
- 基于Matlab, ConvergeCase中部分2D结果文件输出至EXCEL中 能力有限,代码和功能极其简陋.zip
- java桌面小程序,主要为游戏.zip学习资源
- Java桌面-坦克大战小游戏.zip程序资源
- java语言做的魔板小游戏.zip
- 初学JAVA制作的坦克大战小游戏,使用JAVA 的GUI模拟2,5D界面.zip
- 公开整理-2024年832个国家级贫困县摘帽情况分省分年统计.xlsx
- 纯js+Jquery实现2048游戏
- 叠罗汉游戏,安卓java实现,自定义Framlayout,属性动画.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页