六、永磁同步电机矢量控制(FOC)—电流环及速度环PI参数整定

       前面几节的内容中对FOC框架中的主要模块进行了讲解,接下来这一节将对矢量控制中电流环PI参数、速度环PI参数整定进行讲解。

在重新解释一下矢量控制的基本思想,是在普通的三相交流电动机上设法模拟直流电动机转矩控制的规律,在磁场定向坐标上,将电流矢量分解成为产生磁通的励磁电流分量和产生转矩的转矩电流分量,并使得两个分量互相垂直彼此独立,然后分别进行调节。

       传统矢量控制常用方法包括id=0控制和最大转矩电流比(MTPA)控制,对于表贴式PMSM,两种方法都是等效的,对于内置式三相PMSM,主要用MTPA。

        图像分别为表贴式和内置式,内置式由于永磁体埋入转子中,d轴气隙更大,磁阻也更大,导致直轴电感Ld小于交轴Lq,表贴式由于气隙更加均匀,交直轴电感相同。

1.仿真模型搭建

        下图是采用id=0控制方法的三相PMSM双闭环矢量控制框图,从图中可以看出三相PMSM矢量控制主要包括3个部分:转速环PI调节器、电流环PI调节器和SVPWM模块。按照该框图搭建Simulink仿真模型。

        坐标变化和SVPWM模块在《五、永磁同步电机矢量控制(FOC)—坐标变换及SVPWM Simulink仿真》中已经讲解,在这里主要讲解一下电机模型的选择,选择“Permanent Magnet Synchronous Machine”永磁同步电机模块

        首先进入“configuration”初始化界面进行设置:

       其次进入“Parameters”参数设置界面:

        模型参数设置如下,见demo02_Initfun.m文件,这些参数根据实际永磁同步电机参数获取:

       将各模块建立完毕后,根据矢量控制框架将各模块搭积木组合。注意电机模型输出的转速和转角分别是rad/s和rad,输出转角为机械角度,电角度=磁电机对数p*机械角度。转速参考值单位为rpm,输出转角*30/π后单位就变成rpm,在与参考值进行比较。

                             
模型位置,下文用到的模型都在该链接中,点击下载。
首先运行demo02_Initfun文件,初始化部分变量参数,再运行Simulink文件。

      

        该仿真模型是在FOC控制的基础上加入的前馈解耦环节,在接下来的讲解中,将进一步解释为什么要加入前馈解耦。由于模型PI参数没有调整合理,导致转速环还存在一定稳态误差无法被消除,接下来将进一步讲解转速环和电流环的PI参数整定方法。

2.电流内环调节器设计

       闭环系统中电流环属于内环,作用是使电机电流跟随参考电流变化,对系统响应速度和准确性有重要影响。闭环控制系统设计顺序是先内环后外环,电流内环性能效果影响整个系统性能。本小节的工作是根据永磁同步电机在dq坐标系下的数学模型,忽略交直轴耦合和反电动势影响,设计电流环PI控制器。

        dq坐标系下PMSM的数学模型如下:

       电流环传递函数如下图,系统包括PI控制传递函数、延迟环节(由于系统中感性元件充放电有延迟效果,故引入延迟环节)、PWM惯性环节和电机电压模型:

        电流环的输入为电流信号的误差值,输出信号是参考电压,是对电机电磁方程的近似模型的模拟,忽略掉电压方程中的动态项 ωeψf 和耦合项ωeLdid也是进行了前馈解耦

        下面仅分析q轴电流PI调节器的参数整定方法,d轴电流PI调节器的参数整定和q轴类似。进行解耦后的q轴电压方程变化如下。

       进一步,电机q轴传递函数可以看成:

       开关频率设为 10KHz,可以把延时环节和 PWM 环节这样的小惯性环节合并处理,记延时时间常数为 td=Ts(从不同的电流环PI参数整定文章中发现,各文章的主要差别在于延迟环节时间常数和惯性环节时间常数的处理,有的是将td=Ts,有的是将Tsf=Ts+td),将 KPWM看成 1 来处理可以得到:

        Ts为电流环采样周期。Ts足够小时,Ts*s²可以忽略。

       忽略扰动后,电流环传递函数简化为下图形式:

        常用的PI调节传递函数为:

       系统开环传递函数如下:

       Lq为交轴电感,Ts为电流环采样周期,R为相电阻。

3.转速换PI参数整定

        转速单位为rpm。

        在设计外环的速度环时,可以把电流环作为速度控制系统中的一个环节,电流环是一个二阶振荡环节,由于速度环的截止频率较低,因此可以忽略电流环高次项,也是因为当具有较高的开关频率时,对电流环闭环传递函数进行降阶处理,降阶后电流环的等效传递函数为:

        假设负载转矩Tl=0,同时粘连摩擦系数B在工程中可忽略不计,转速外环变为:

               另一种整定转速换PI参数的方法如下:

       按照典型II系统设计PI控制器,对于典型II型系统的参数按照闭环系统的最小幅值频特性峰值来确定,中频带宽h一般取5为最佳选择。

        通过测试,该方法整定出的PI参数无法使用,存疑。

        总结,不同文章对于参数整定的主要区别在于处理惯性环节和延迟环节的方法,有的是将两者的时间常数看作是相等,有的则保持两者时间常数只是进行加合,本文章的转速换PI参数整定中,延迟环节时间常数是转速环采样周期T2s,该周期远远大于电流环采样周期T1i,因此用T2s代替速度环延迟函数和电流环传递函数合并后的惯性环节,共同点都是将两个环节合并为一个一阶惯性环节,该环节的时间常数为前两个环节时间常数的加合。、

4.电流环和电压环PI参数整定后仿真效果

(1)电流环跟踪效果

        d轴电流PI调节器的参数整定和q轴类似,计算出q轴PI参数,套用到d轴中。

        iq kp=20 ki=1597

        id kp=20 ki=1597

   1)仿真1

       Iq参考值设定为2,Id参考值设定为0,电机负载转矩设置为2牛米,保证电机转速不超过额定转速。观察Park变换模块输出的实际Id Iq值。

        上图为Id曲线,下图为Iq曲线(下文都是),可以看到id震荡情况较为严重,但是也稳定在±0.1以内,iq跟随效果较好,可以稳定跟踪参考值2。如果出现电流跑飞的情况,即电流Iq波动值特别大,是因为当电机转速超过额定转速太远,电机就跑飞,属于正常现象,现在只是再调节电流环,所以会有这种现象。

2)仿真2

       在测试Iq参考值设置为2,负载转矩为0,观察IdIq 跟踪效果。

       Id震荡值变得更严重,Iq可以较好的跟踪。同时观察电机电磁转矩,电机转矩可以保持平稳水平。

        此时电流环调节完毕。

(2)转速环跟踪效果

              Kp=0.1433

              Ki=2.5不通过计算获得,根据电机运行效果调节)。

 1)仿真1

       转速参考值设定为常值800rpm,电机负载转矩为2牛米。观察电机实际转速。

       电机输出转速图如下:

       可以看出转速跟踪效果较好,在电机启动瞬间,会出现较大的转速超调,但是超调量会在0.05s以内消除,即系统能在0.05s左右达到预定转速,后续转速跟踪效果较好,无明显转速波动。观察电磁转矩输出图像,在电机启动瞬间出现转矩峰值,后转矩平稳。

2)仿真2

        保持转速200rpm,给定转矩为梯度值,前0.3s内参考值为10牛米,后0.3s为20牛米,观察转速、转矩、IdIq电流图和三相电流曲线图。

       可以看出转速、转矩跟踪效果良好,转矩波形稳定,突加负载后迅速上升,性能优良。,三相定子电流正弦特性完好,且在给定负载后反映迅速,频率不变幅值增大·。

3)仿真3

        再尝试将转速降低至300rpm,保持转矩为2牛米,观察转速输出图像。可以看出转速超调量减小,但是稳定时间延迟。

4)仿真4

       观察电机带载特性,电机转速参考值设定为200,负载转矩设定为50牛米,观察电机转速、电磁转矩曲线、idiq电流曲线和三相电流曲线。

        可以看出,由于负载转矩的增加,电机转动惯量增加,转速响应较慢,但是仍然可以在0.6s左右达到预定转速,电磁转矩响应速度较快,且能稳定跟踪到50牛米, idiq电流都能稳定跟踪,三相电流为频率幅值稳定的正弦电流。

5)仿真5

        转速参考值设定为梯度值,前0.3s内参考值为500rpm,后0.3s为900pm,电机负载转矩为2牛米。观察电机实际转速。

        可以看出转速跟踪效果良好,三相电流频率加快。

        观察Id、 Iq电流跟踪效果:

        在电机启动和转速切换时出现较大的峰值,其他时间两者都可以平稳的跟踪,Id震荡的幅值在±0.1之内。

        通过上述仿真结果可以看出,电流环和转速换均具有良好的运行效果。

5.前馈解耦策略

        dq坐标系下PMSM电压方程如下:

       Ud方程中存在的Iq项和Uq方程中存在的Id项都为耦合项。转化为图像显示为:

        Id、Iq是可控的两个输入量,控制时希望Iq只控制q轴电压Uq、Id只控制d轴电压Ud,两个输入量互不影响,但从框图中可以看出,Uq、Ud两者高度耦合,都同时受到Iq、Id两个输入量的控制,两者无法实现独立控制。耦合不仅造成控制难度增加,还会对控制器性能造成较大的危害,从公式里面可以看出转速越大耦合项就越大,这说明电机的速度越高,这个耦合项对电机的控制器性能的影响就越大。矢量控制的核心就是在dq坐标系中实现复杂定子电流的解耦,使之解耦为控制转矩的交轴电流iq与控制励磁的直轴电流id,单独控制d轴的电流就只影响d轴的电压,而不影响q轴的电压

        前馈解耦将电流环中的参数与电机本体的参数进行完全解耦的一种控制方式。通过前馈补偿的方式消除耦合的影响,在d轴控制器和q轴控制器的输出端,分别引入与永磁同步电机dq轴电压方程中耦合项相等的信号作为耦合补偿,即可实现电流控制器的解耦控制。

        由于前馈解耦要求电感参数准确,实际控制中电感值总是会有部分偏差,导致无法做到完全解耦,但仍有较好的解耦效果。

模型下载地址:

链接:https://pan.baidu.com/s/1DKvSdKOl8D0-6o6m6xkX0Q?pwd=0nqt 

提取码:0nqt

参考资料:

1.《现代永磁同步电机控制原理及MATLAB仿真》

2.《现代电机控制技术》

3.《永磁同步电机矢量控制(七)——基于id=0的矢量控制的动态解耦策略》

4.《永磁同步电机矢量控制——电流内环前馈解耦策略》

5.参考文献:《永磁同步电机交直轴电流解耦控制方法综述》付兴贺

《采用 id=0 的永磁同步电机矢量控制系统MATLAB/Simulink仿真》解小刚

  • 31
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的永磁同步电机FOC控制的转速和电流环的C代码: ```c #include <stdio.h> #include <stdlib.h> #include <math.h> #define PI 3.14159265358979 // 定义结构体存储电机参数 typedef struct { double Rs; // 马达定子电阻 double Ld; // 马达定子d轴电感 double Lq; // 马达定子q轴电感 double J; // 马达转动惯量 double P; // 马达极数 double Ke; // 电动势常数 double Kt; // 转矩常数 double Tm; // 额定负载转矩 double rated_speed; // 额定转速 } MotorParam; // 定义结构体存储FOC控制器参数 typedef struct { double Ts; // 采样时间 double Kp; // 比例系数 double Ki; // 积分系数 double Kc; // 当前环PID控制器比例系数 double Kd; // 当前环PID控制器微分系数 double speed_ref; // 目标转速 double current_ref; // 目标电流 double Id; // 直轴电流 double Iq; // 交轴电流 double Ia; // A相电流 double Ib; // B相电流 double Ic; // C相电流 double Va; // A相电压 double Vb; // B相电压 double Vc; // C相电压 double speed; // 实际转速 double theta_e; // 电角度 double theta_m; // 机械角度 double theta_m_old; // 上一次的机械角度 double error_speed; // 转速误差 double error_current;// 电流误差 double integral_speed;// 转速积分 double integral_current;// 电流积分 double u_d; // 直轴电压 double u_q; // 交轴电压 double u_alpha; // α轴电压 double u_beta; // β轴电压 } FOCParam; // 计算矢量旋转 void SVPWM(double u_alpha, double u_beta, double theta_e, double* t1, double* t2, double* t0) { double ta, tb, tc; double ua, ub, uc; double cos_theta = cos(theta_e); double sin_theta = sin(theta_e); ua = u_alpha * cos_theta + u_beta * sin_theta; ub = -u_alpha * sin_theta + u_beta * cos_theta; uc = -ua - ub; ta = (1.0 / sqrt(3)) * (ua - 0.5 * ub - 0.5 * uc); tb = (1.0 / sqrt(3)) * (ub - 0.5 * ua - 0.5 * uc); tc = (1.0 / sqrt(3)) * (uc - 0.5 * ua - 0.5 * ub); *t1 = 0.5 * (1.0 - ta - tb); *t2 = 0.5 * (1.0 - tb - tc); *t0 = 0.5 * (1.0 - tc - ta); } // FOC控制器 void FOCControl(MotorParam* motor, FOCParam* foc) { double omega_r; // 转子电角速度 double T_r; // 电磁转矩 double T_e; // 机械转矩 double theta_r; // 转子电角度 double theta_m; // 机械角度 double dIq; // 交轴电流变化量 double dId; // 直轴电流变化量 double u_alpha, u_beta; double t1, t2, t0; double u_d_old, u_q_old; double Ta, Tb, Tc; // 计算转矩 omega_r = foc->speed / motor->P; T_r = motor->Ke * (foc->Iq * sin(foc->theta_e) - foc->Id * cos(foc->theta_e)); T_e = T_r - motor->Tm; dIq = foc->Ki * foc->Ts * (foc->current_ref - foc->Iq); dId = foc->Ki * foc->Ts * (0.0 - foc->Id); foc->Iq += dIq; foc->Id += dId; // 计算电角度和机械角度 theta_r = foc->theta_e + motor->P * omega_r * foc->Ts; theta_m = theta_r / motor->P; foc->theta_m = fmod(theta_m, 2.0 * PI); if (foc->theta_m < 0.0) { foc->theta_m += 2.0 * PI; } // 转速控制 foc->error_speed = foc->speed_ref - foc->speed; foc->integral_speed += foc->error_speed * foc->Ts; foc->u_q = foc->Kp * foc->error_speed + foc->Ki * foc->integral_speed; foc->u_q = fmax(fmin(foc->u_q, 10.0), -10.0); // 电流控制 foc->error_current = foc->current_ref - foc->Iq; foc->integral_current += foc->error_current * foc->Ts; foc->u_d = foc->Kp * foc->error_current + foc->Ki * foc->integral_current; foc->u_d = fmax(fmin(foc->u_d, 10.0), -10.0); // 转换到直交坐标系 u_alpha = foc->u_d * cos(foc->theta_e) - foc->u_q * sin(foc->theta_e); u_beta = foc->u_d * sin(foc->theta_e) + foc->u_q * cos(foc->theta_e); // 计算SVPWM波形 SVPWM(u_alpha, u_beta, foc->theta_e, &t1, &t2, &t0); // 更新电压 foc->u_alpha = u_alpha; foc->u_beta = u_beta; // 计算电流 Ta = motor->Kt * (t1 - 0.5 * t2 - 0.5 * t0); Tb = motor->Kt * (t2 - 0.5 * t0 - 0.5 * t1); Tc = motor->Kt * (t0 - 0.5 * t1 - 0.5 * t2); foc->Ia = Ta / motor->Ke; foc->Ib = Tb / motor->Ke; foc->Ic = Tc / motor->Ke; // 计算电角度 foc->theta_e += omega_r * foc->Ts; // 保存直轴电压 u_d_old = foc->u_d; u_q_old = foc->u_q; // 计算直轴电压 foc->u_d = foc->Kp * (foc->Id - (motor->Ld / motor->Rs) * foc->Ia) - foc->Kc * (foc->u_d - u_d_old) / foc->Ts; foc->u_d = fmax(fmin(foc->u_d, 10.0), -10.0); // 计算交轴电压 foc->u_q = foc->Kp * (foc->Iq - (motor->Lq / motor->Rs) * foc->Ib) - foc->Kc * (foc->u_q - u_q_old) / foc->Ts; foc->u_q = fmax(fmin(foc->u_q, 10.0), -10.0); // 更新电流 dIq = foc->Ki * foc->Ts * (foc->current_ref - foc->Iq); dId = foc->Ki * foc->Ts * (foc->u_d - foc->Id); foc->Iq += dIq; foc->Id += dId; } // 主函数 int main() { MotorParam motor; FOCParam foc; // 初始化电机参数 motor.Rs = 1.0; motor.Ld = 0.01; motor.Lq = 0.02; motor.J = 0.1; motor.P = 4; motor.Ke = 0.1; motor.Kt = 0.1; motor.Tm = 0.0; motor.rated_speed = 2000.0; // 初始化FOC控制器参数 foc.Ts = 0.0001; foc.Kp = 0.1; foc.Ki = 50.0; foc.Kc = 0.1; foc.Kd = 0.0; foc.speed_ref = 1000.0; foc.current_ref = 1.0; foc.Id = 0.0; foc.Iq = 0.0; foc.Ia = 0.0; foc.Ib = 0.0; foc.Ic = 0.0; foc.Va = 0.0; foc.Vb = 0.0; foc.Vc = 0.0; foc.speed = 0.0; foc.theta_e = 0.0; foc.theta_m = 0.0; foc.theta_m_old = 0.0; foc.error_speed = 0.0; foc.error_current = 0.0; foc.integral_speed = 0.0; foc.integral_current = 0.0; foc.u_d = 0.0; foc.u_q = 0.0; foc.u_alpha = 0.0; foc.u_beta = 0.0; // 模拟FOC控制 for (int i = 0; i < 10000; i++) { FOCControl(&motor, &foc); foc.speed = motor.rated_speed * motor.P * (foc.theta_m - foc.theta_m_old) / (2.0 * PI * foc.Ts); foc.theta_m_old = foc.theta_m; printf("%lf,%lf,%lf,%lf\n", foc.speed, foc.current_ref, foc.Iq, foc.u_q); } return 0; } ``` 这段代码实现了一个简单的FOC控制器,包括转速和电流环控制。在`FOCControl`函数中,我们首先计算电机转矩和角度,然后进行转速和电流控制,最后计算SVPWM波形,更新电压和电流。在主函数中,我们模拟了10000个采样周期,每个周期的时长为0.0001秒,输出了转速、目标电流、实际电流和交轴电压。 需要注意的是,这段代码仅供参考,实际应用中需要根据具体电机和控制器的参数进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值