目录
永磁同步电动机(PMSM)控制系统是基于磁场定向控制(FOC)的一种高性能电机控制方案。这种控制系统能够实现精确的转矩和磁通控制,具有快速响应、高效率、高功率密度等优点,因此在工业自动化、电动汽车、航空航天等领域得到了广泛应用。
一、磁场定向控制(FOC)
在分析PMSM的FOC控制系统之前,我们首先需要建立PMSM的数学模型。PMSM的物理方程可以用下面的公式表示:
Te = p*λ*i*cos(θ)
Tj = p*λ*i*sin(θ)
其中,Te是电磁转矩,Tj是机械转矩,p是极对数,λ是永磁体磁链,i是电流,θ是电机转子与定子电流之间的夹角。
FOC控制系统的主要目标是通过控制电流和电压来控制电机转矩和磁通,因此我们需要建立电流和电压的数学模型。电流和电压的关系可以用下面的公式表示:
V = R*i + d*λ/dt
其中,V是电压,R是电阻,i是电流,d是微分算子,λ是永磁体磁链,dt是时间微分。
二、FOC定向控制实现步骤
基于FOC的PMSM控制系统实现步骤如下:
- 初始化:设置控制系统的参数,包括电机参数、控制器参数、采样周期等。
- 速度估算:根据电机的运行状态,利用速度估算算法估算电机的速度。常用的速度估算算法包括电流法、反电动势法等。
- 电流控制:根据电流控制器输出和电机实际电流的差异,通过PID控制器调整电流,实现电流的精确控制。
- 电压控制:根据电压控制器输出和电机实际电压的差异,通过PID控制器调整电压,实现电压的精确控制。
- 转矩和磁通控制:根据电机的运行状态和控制系统目标,通过FOC算法计算出电机需要的转矩和磁通,然后通过电流和电压控制器实现精确控制。
- 采样和反馈:通过采样电路采集电机的电流、电压、转速等信息,然后反馈给控制系统。
- 保护控制:根据电机的运行状态和安全保护需求,实现过热、过流、过压等保护控制。
三、具体实现
在具体实现FOC控制系统时,我们需要选择合适的硬件和软件平台。硬件平台包括电机、功率器件、采样电路、保护电路等;软件平台包括控制算法、通讯协议、用户界面等。
在硬件平台上,我们通常选择高性能的电机、功率器件和采样电路。例如,我们可以选择具有高功率密度、高效率的永磁同步电机,选择具有快速响应、高开关频率的IGBT或MOSFET功率器件,选择具有高精度、快速响应的电流和电压采样电路。
在软件平台上,我们通常选择具有快速响应、高精度的控制算法。例如,我们可以选择具有快速响应、高稳定性的比例-积分-微分(PID)控制器,选择具有快速傅里叶变换(FFT)的速度估算算法。此外,我们还需要实现通讯协议和用户界面,以便实现远程控制和参数调整。
四、实验验证
为了验证FOC控制系统的性能和稳定性,我们需要进行实验验证。实验验证包括硬件在环实验(HIL)和实际运行实验。HIL实验是在模拟环境下进行的实验,能够模拟电机的实际运行状态,从而验证控制系统的稳定性和性能。实际运行实验是在真实环境下进行的实验,能够验证控制系统的实际运行效果。
在实验中,我们可以通过调整控制系统的参数,如PID控制器的比例、积分、微分系数等,来优化控制系统的性能。此外,我们还可以通过实验来验证控制系统的过热、过流、过压等保护功能的可靠性和有效性。
总之,基于FOC定向控制的永磁同步电动机控制系统是一种高性能、高效率的电机控制系统,具有广泛的应用前景。在实现这种控制系统时,我们需要选择合适的硬件和软件平台,并实现精确的电流、电压、转矩和磁通控制以及保护控制。通过实验验证,我们可以优化控制系统的性能,并验证保护功能的可靠性和有效性。
五、核心程序
PWM_frequency = 30e3; %%Hz//转换器s/w频率
T_pwm = 1/PWM_frequency; %s//PWM开关时间周期
%设置采样时间
Ts = T_pwm; %控制器的采样时间步长
Ts_simulink = T_pwm/2; %模型模拟的模拟时间步长
Ts_motor = T_pwm/2; %模拟采样时间
Ts_inverter = T_pwm/2; %平均值逆变器的模拟时间步长
Ts_speed = 30*Ts; %速度控制器的采样时间
%设置控制器的数据类型和代码生成
dataType = 'single'; %浮点代码生成
%系统参数//硬件参数
%设置目标参数
target.CPU_frequency = 84e6; %时钟频率
target.PWM_frequency = PWM_frequency; %PWM频率
target.PWM_Counter_Period = round(target.CPU_frequency/target.PWM_frequency/2); % 上下计数器的PWM计时器计数
target.ADC_Vref = 3.3; %V ADC参考电压
target.ADC_MaxCount = 4095; %12位ADC的最大计数
%电机参数
pmsm.p = 4; %电机极对数
pmsm.Rs = 0.4; %欧姆//定子电阻器
pmsm.Ld = 0.6e-3; %D轴电感值
pmsm.Lq = 0.6e-3; %Q轴电感值
pmsm.J = 4.8018552467e-06; %惯性
pmsm.B = 9.6037104933e-06; %摩擦系数
pmsm.Ke = 4; %扭矩常数
pmsm.Kt = 0.04103; %额定电流
pmsm.I_rated= 3.5; %最大速度
pmsm.N_max = 10000; %位置偏移
pmsm.PositionOffset = 0.1712; %QEP编码器狭缝
pmsm.QEPSlits = 1250; %根据Ke计算的PM通量
pmsm.FluxPM = (pmsm.Ke)/(sqrt(3)*2*pi*1000*pmsm.p/60); %
pmsm.T_rated = (3/2)*pmsm.p*pmsm.FluxPM*pmsm.I_rated; %从I_rated获取T_rated
pmsm.N_base = 4000; %电机基本速度
pmsm.PositionOffset = 0.1917; % 不需要无传感器
%设置逆变器详细信息
inverter.V_dc = 24; %设置逆变器详细信息(X-NUCLEO-IHM07M)
inverter.I_trip = 3.55; %安培//跳闸的最大电流
inverter.Rds_on = 2e-3; %欧姆//Rds ON(来自电机驱动芯片)
inverter.Rshunt = 0.33; %欧姆
inverter.CtSensAOffset = 1665; %计数//ADC偏移
inverter.CtSensBOffset = 1943; %计数//ADC偏移
inverter.ADCGain = 1; %通过SPI缩放的ADC增益因子(不可能进行板载放大)
inverter.EnableLogic = 1; % X-NUCLEO-IHM07M1使能引脚(EN_GATE)的激活高电
inverter.invertingAmp = -1; % 非反相电流测量放大器
inverter.ISenseVref = 3.3; %V/逆变器电流检测电路的电压参考
inverter.ISenseVoltPerAmp = 0.505; %V每1A电流的电流感应电压输出(Rshunt*iSense运算放大器增益)
inverter.ISenseMax = inverter.ISenseVref/(2*inverter.ISenseVoltPerAmp); %Amp%Amps//可通过逆变器电流感应测量的最大峰值中性点电流
inverter.R_board = inverter.Rds_on + inverter.Rshunt/3; %Ohms
inverter.ADCOffsetCalibEnable = false;
%%PU系统详细信息//设置PU转换的基本值
PU_System.V_base = (inverter.V_dc/sqrt(3));
PU_System.I_base = inverter.ISenseMax;
PU_System.N_base = pmsm.N_base;
PU_System.T_base = (3/2)*pmsm.p*pmsm.FluxPM*PU_System.I_base;
PU_System.P_base = (3/2)*PU_System.V_base*PU_System.I_base;
acceleration = 20000/PU_System.N_base; % P.U/Sec//最大允许加速度
%%开环参考值
T_Ref_openLoop = 1; %开环启动时间
Speed_openLoop_PU = 0.1; %开环启动的单位速度参考
Vd_Ref_openLoop_PU = Speed_openLoop_PU*2; %Dyno设置使用1.2倍,其他设置使用2倍
%控制器设计
PI_params = mcb.internal.SetControllerParameters(pmsm,inverter,PU_System,T_pwm,2*Ts,Ts_speed);
%更新模拟延迟
PI_params.delay_Currents = int32(Ts/Ts_simulink);
PI_params.delay_Position = int32(Ts/Ts_simulink);
PI_params.delay_Speed = int32(Ts_speed/Ts_simulink);
PI_params.delay_Speed1 = (PI_params.delay_IIR + 0.5*Ts)/Ts_speed;
%将数据类型double的所有参数转换为single
disp(pmsm);
disp(inverter);
disp(target);
up3037