1.电机控制原理及其技术背景
1.1三相同步电机电磁转距
如下图是三相隐极同步电机结构图。电机学理论表明,空间对称分布的三相绕组通入三相对称交流电后便能产生旋转磁场。若在如图通入A,B,C三相对称正弦电流,就会在气隙中产生正弦分布且幅值恒定的旋转磁场, 称为圆形旋转磁场, 其在电机气隙内形成了 N 极和 S 极。于是形成定子磁场轴向s,转子磁场轴向r。
如下图是三相隐极同步电机等效模型。此时将转子励磁(永磁同步电机则由永磁体励磁)磁场轴线定义为 d 轴, q 轴超前 d 轴 90°电角度, dq 轴系与转子一道旋转。 A 轴为 A相绕组的轴线, 将 A 轴作为空间参考轴, dq 轴系的空间位置由电角度 θr来确定。定子旋转磁场的轴线为 s 轴, 其在 dq 轴系中的空间相位为 β。 设想,在 s 轴上安置一个单轴线圈 s(可设想为铁心中旋转线圈 s),与 s 轴一道旋转,通入正向电流 is 后,产生的正弦分布磁场即为定子旋转磁场。
电磁转矩的公式为:
T e = − i s i f L m s i n β T_e = - i_si_fL_msin\beta Te=−isifLmsinβ
电角度为90°,电磁转矩最大。
由此引出foc的控制策略。规定转子方向为d轴方向,(通过获取编码器位置即可获得d轴角度,可规定A轴方向为0°)q轴为超前d轴90°方向。对输入定子绕组的三相电流进行坐标变换,将三相电流转化为d、q轴方向的电流,那么我们只要对d,q轴电流进行控制即可对电磁转矩进行控制,一般我们控制d轴电流为0(有些场合需要电机高速运转,可能需要弱磁处理),那么只需要对q轴流进行精准控制即可获得精准的电磁转矩控制效果,当然这里先不考虑电机参数变化所带来的影响,实际情况三环参数与电机参数是密切相关的。
2.FOC整体框图
如下图也是最为经典,被引用了无数次的FOC控制的框图。如图依次从左往右,从上向下介绍。最左边速度环运算,经过PID运算,速度环输出作为电流环q轴PID运算的参考输入,再经过坐标变换,SVPWM模块输出三相电压控制电机。下面依次介绍各模块的实现。
这里先贴出最核心的电流环代码
/*******************************************************************************
* Function Name :
* Description : 电流环
* Input : float q轴电流设定值
* Output :
*******************************************************************************/
void Current_Loop(float Current_q)
{
Current_Components Current_AlphaBeta;
Current_Components Current_dq;
Voltate_Components Voltate_dq;
Voltate_Components Voltate_AlphaBeta;
float radian ;
//获取三相反馈电流
Current_UVW = Get_Current_UVW();
//获取转子位置
radian = (float)(7 * (ReadRadian() - 0.5819));
//CLARK变换
Current_AlphaBeta = Clark(Current_UVW);
//Park变换
Current_dq = Park(Current_AlphaBeta, (float)(radian);
//d轴Pid运算
Voltate_dq.qV_Component1 = PID_Regulator(Set_Current_d, Current_dq.qI_Component1, &Current_PID_Struct);
//q轴pid运算
Voltate_dq.qV_Component2 = PID_Regulator(Current_q, Current_dq.qI_Component2, &Current_PID_Struct);
//反park变换
Voltate_AlphaBeta = Re_Park(Voltate_dq,radian);
//SVPWM
SVPWM(Voltate_AlphaBeta);
}
2.1 SVPWM实现
本文所实现的方法来自《现代永磁同步电机控制原理及MATLAB仿真》。
如下图也是最最经典的三相电压逆变电路,通过6个开关管的组合即可得到如下的空间电压矢量图。将一个圆形电压空间划分成6个部分。由于开关管组合只有8种状态,但要实现完整的圆形电压。那么就要用到平均值等效原理。即在一个开关周期内通过对基本电压矢量加以组合,使其平均值与给定值电压矢量相等。比如需要得到扇区1内的电压矢量,则将U4和U6给予一定时间加权,便能获得扇区1内任一点的电压矢量。这便是SVPWM算法的合成原理。
这里贴上SVPWM的实现代码
/*******************************************************************************
* Function Name :
* Description : SVPWM,按照《现代永磁同步电机控制原理及其MATLAB仿》编写。载波频率10k
*
* Input :
* Output :
*******************************************************************************/
#define SQRT3DIV2 (float) (0.8660) // √3/2
#define NEGSQRT3DIV2 (float)(-0.8660) //-√3/2
#define DIV2 (float) (0.5000) // 1/2
#define DIV3_2 (float) (1.5000) // 3/2
#define SQRT3 (float) (1.7320) // √3
#define Udc (float) (12) //母线电压
#define Ts (int16_t)(4200) //载波周期;
#define T_SQRT3 7274
#define T 4200
#define SECTOR_1 (u32)1
#define SECTOR_2 (u32)2
#define SECTOR_3 (u32)3
#define SECTOR_4 (u32)4
#define SECTOR_5 (u32)5
#define SECTOR_6 (u32)6
void SVPWM(Voltate_Components Voltate_AlphaBeta)
{
Voltate_Components Voltate_ABC;
uint8_t A,B,C;
uint8_t N;
int16_t X,Y,Z;
uint16_t hTimePhA,hTimePhB,hTimePhC;
Voltate_ABC.qV_Component1 = Voltate_AlphaBeta.qV_Component2; //A
Voltate_ABC.qV_Component2 = SQRT3DIV2 * Voltate_AlphaBeta.qV_Component1 - DIV2 * Voltate_AlphaBeta.qV_Component2; //B
Voltate_ABC.qV_Compo