我尝试使用 matlab 创建被动电池平衡,但我的电池 4 中的充电状态无法平衡

问题描述

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,... 只是该向量中的第一个、第二个、 ... 元素。 这肯定有助于找到您遇到的任何其他问题。