SimpleFOC核心代码,解决Id一直为正 无法控为0

        注:(我这个是用simulink仿真做的SimpleFOC,因此代码是m语言的,在stm32可以改成C的,这两种基本差不多,搭建的SimpleFOC仿真下载链接:https://download.csdn.net/download/qq_35239859/88642607?spm=1001.2014.3001.5501 

SimpleFOC核心代码如下:

function [Ta,Tb,Tc] = fcn(Uq,Ud,angle_el)
    Ta=0;Tb=0;Tc=0;
    PI_2 = pi/2;
    PI_3 = pi/3;
    voltage_power_supply=24;
	angle_el = mod(angle_el,2*pi);                    
	
	% U_alpha=Ud*cos(angle_el)-Uq*sin(angle_el);            
	% U_beta=Ud*sin(angle_el)+Uq*cos(angle_el);
	if Ud
	    Uref=sqrt(Uq*Uq + Ud*Ud) / voltage_power_supply;
        angle_el = mod(angle_el+atan2(Uq,Ud),2*pi);
    else
        Uref=abs(Uq) / voltage_power_supply;
    	if Uq>0 
	    angle_el =mod(angle_el+PI_2,2*pi);
	    else
		angle_el =mod(angle_el-PI_2,2*pi);
        end
    end
	if Uref > 0.577  
        Uref = 0.577;
    end

	if Uref<-0.577 
        Uref=-0.577; 
    end
    disp(Uref);


	sector = floor(angle_el / PI_3) + 1;                			                        

	T1 = sqrt(3)*sin(sector*PI_3 - angle_el) * Uref;            
	T2 = sqrt(3)*sin(angle_el - (sector-1.0)*PI_3) * Uref;
	T0 = 1 - T1 - T2;   

	switch(sector) 
		case 1
			Ta = T1 + T2 + T0/2;
			Tb = T2 + T0/2;
			Tc = T0/2;
		case 2
			Ta = T1 +  T0/2;
			Tb = T1 + T2 + T0/2;
			Tc = T0/2;
		case 3
			Ta = T0/2;
			Tb = T1 + T2 + T0/2;
			Tc = T2 + T0/2;
		case 4
			Ta = T0/2;
			Tb = T1+ T0/2;
			Tc = T1 + T2 + T0/2;
		case 5
			Ta = T2 + T0/2;
			Tb = T0/2;
			Tc = T1 + T2 + T0/2;
		case 6
			Ta = T1 + T2 + T0/2;
			Tb = T0/2;
			Tc = T1 + T0/2;
    end

         网上很多Stm32移植SimpleFOC的程序,都是做FOC开环的,所以将很多重要的东西都删了,因此要想用SimpleFOC做电流闭环,不能将网上或者视频里的代码直接移植使用,还要注意Ud和Uq电压在核心代码中是怎么处理的,也就是以下几句:

	% U_alpha=Ud*cos(angle_el)-Uq*sin(angle_el);            
	% U_beta=Ud*sin(angle_el)+Uq*cos(angle_el);
	if Ud
	    Uref=sqrt(Uq*Uq + Ud*Ud) / voltage_power_supply;
        angle_el = mod(angle_el+atan2(Uq,Ud),2*pi);
    else
        Uref=abs(Uq) / voltage_power_supply;
    	if Uq>0 
	    angle_el =mod(angle_el+PI_2,2*pi);
	    else
		angle_el =mod(angle_el-PI_2,2*pi);
        end
    end

        这一部分代码,这是根据Ud和Uq算磁场方向的,网上很多教程包括P站,很多都写错了,将这部分代码写成如下方式:

    U_alpha=Ud*cos(angle_el)-Uq*sin(angle_el);            
    U_beta=Ud*sin(angle_el)+Uq*cos(angle_el);
	Uref=sqrt(U_alpha*U_alpha+ U_beta*U_beta) / voltage_power_supply;
    if Uq>0 
	   angle_el =mod(angle_el+PI_2,2*pi);
    else
		angle_el =mod(angle_el-PI_2,2*pi);

        这种方式如果你只是想用开环做FOC控制的话没有问题,如果要做Id和Iq的闭环就不行了,这种写法Ud电压无论正负都只是给Uref电压增加了幅值,做不到磁场矢量根据Uq和Ud的动态调整,因此无法将Id控成0。这也是我在做电流闭环时候,排查很久的坑,如果你也遇到了给定Ud电压正负都一样的效果,看一下程序是不是也是这样写的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想想叫啥名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值