首页 > 解决方案 > 我尝试使用 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;

下面是 Simulink 中被动电池平衡的连接

标签: c++cmatlabbatterybatterymanager

解决方案


min()有一个可选的第二个输出,它返回初始数组中最小值的位置。因此,您可以删除所有这些 if 语句并将其替换为

[a, idx] = min([s1, s2, s3, s4]);
y = ones(1, 4);
y(idx) = 0;

那么您的 y1, y2, ... 只是该向量中的第一个、第二个、... 元素。这肯定有助于发现您遇到的任何其他问题。


推荐阅读