问题描述
Below is the code in my matlab function
我试图在 4 个电池单元中获得最低充电状态并尝试平衡电池以使所有电池处于类似的充电状态范围内,但电池 4 无法正常工作,而电池 1-3 工作正常。
function [y1,y2,y3,y4] = fcn(s1,s2,s3,s4)
s1 = int16(s1);
s2 = int16(s2);
s3 = int16(s3);
s4 = int16(s4);
a = min([s1 s2 s3 s4]);
if(s1 == a)
if(s1 == a && s4 == a)
y1 = 0;
y2 = 1;
y3 = 1;
y4 = 0;
elseif(s1 == a && s3 == a)
y1 = 0;
y2 = 1;
y3 = 0;
y4 = 1;
elseif(s1 == a && s2 == a)
y1 = 0;
y2 = 0;
y3 = 1;
y4 = 1;
elseif(s1 == a)
y1 = 0;
y2 = 1;
y3 = 1;
y4 = 1;
else
y1 = 0;
y2 = 0;
y3 = 0;
y4 = 0;
end
elseif(s2 == a)
if(s2 == a && s4 == a)
y1 = 1;
y2 = 0;
y3 = 1;
y4 = 0;
elseif(s2 == a && s3 == a)
y1 = 1;
y2 = 0;
y3 = 0;
y4 = 1;
elseif(s2 == a && s1 == a)
y1 = 0;
y2 = 0;
y3 = 1;
y4 = 1;
elseif(s2 == a)
y1 = 1;
y2 = 0;
y3 = 1;
y4 = 1;
else
y1 = 0;
y2 = 0;
y3 = 0;
y4 = 0;
end
elseif(s3 == a)
if(s3 == a && s4 == a)
y1 = 1;
y2 = 1;
y3 = 0;
y4 = 0;
elseif(s3 == a && s2 == a)
y1 = 1;
y2 = 0;
y3 = 0;
y4 = 1;
elseif(s3 == a && s1 == a)
y1 = 0;
y2 = 1;
y3 = 0;
y4 = 1;
elseif(s3 == a)
y1 = 1;
y2 = 1;
y3 = 0;
y4 = 1;
else
y1 = 0;
y2 = 0;
y3 = 0;
y4 = 0;
end
elseif(s4 == a)
if(s4 == a && s3 == a)
y1 = 1;
y2 = 1;
y3 = 0;
y4 = 0;
elseif(s4 == a && s2 == a)
y1 = 1;
y2 = 0;
y3 = 1;
y4 = 0;
elseif(s4 == a && s1 == a)
y1 = 0;
y2 = 1;
y3 = 1;
y4 = 0;
elseif(s4 == a)
y1 = 1;
y2 = 1;
y3 = 1;
y4 = 0;
else
y1 = 0;
y2 = 0;
y3 = 0;
y4 = 0;
end
else
y1 = 0;
y2 = 0;
y3 = 0;
y4 = 0;
Below is the Connection of passive cell balancing in Simulink
解决方法
min()
有一个可选的第二个输出,它返回初始数组中最小值的位置。所以你可以删除所有这些 if 语句并将它们替换为
[a,idx] = min([s1,s2,s3,s4]);
y = ones(1,4);
y(idx) = 0;
那么你的 y1,y2,... 只是该向量中的第一个、第二个、 ... 元素。 这肯定有助于找到您遇到的任何其他问题。