hello-boy
认证:优质创作者
作者动态
分享一个使用C语言实现锁相环(PLL)以跟踪输入电压(正弦波)的例程代码
10-30 17:18
一文读懂几种永磁同步电机(PMSM)的区别
04-10 16:23
SJ/T 11893-2023《便携式锂离子电池储能电源技术规范》解读
01-29 15:44
#征文#基于DSP的无感FOC驱动嵌入式软件设计
01-17 21:15
电机V/F、开环矢量SVC、闭环矢量FVC控制的区别与应用
01-03 17:22

基于滑模观测器的FOC电机驱动算法实现---源码

永磁同步电机采用FOC算法实现电机控制,FOC算法的控制框图如下:

软件实现,ADC采样触发实现算法的软件流程图如下:

PARK变换模块宏定义代码如下:

typedef struct { 
  _iq  Alpha;  // Input: stationary d-axis stator variable 
  _iq  Beta; // Input: stationary q-axis stator variable 
  _iq  Angle; // Input: rotating angle (pu) 
  _iq  Ds; // Output: rotating d-axis stator variable 
  _iq  Qs; // Output: rotating q-axis stator variable
  _iq  Sine;
  _iq  Cosine;  
} PARK;             
/*-----------------------------------------------------------------------------
Default initalizer for the PARK object.
-----------------------------------------------------------------------------*/                     
#define PARK_DEFAULTS {   
                          0, \
                          0, \
                          0, \
                          0, \
                          0, \
                          0, \
                          0, \
                }
/*------------------------------------------------------------------------------
PARK Transformation Macro Definition
------------------------------------------------------------------------------*/
#define PARK_MACRO(v) \
\
v.Ds = _IQmpy(v.Alpha,v.Cosine) + _IQmpy(v.Beta,v.Sine); \
    v.Qs = _IQmpy(v.Beta,v.Cosine) - _IQmpy(v.Alpha,v.Sine);
#endif // __PARK_H__
CLARKE变换模块宏定义代码如下:
typedef struct { 
  _iq  As;  // Input: phase-a stator variable
  _iq  Bs;// Input: phase-b stator variable
  _iq  Cs;// Input: phase-c stator variable  
  _iq  Alpha;// Output: stationary d-axis stator variable 
  _iq  Beta;// Output: stationary q-axis stator variable
} CLARKE;
/*-----------------------------------------------------------------------------
Default initalizer for the CLARKE object.
-----------------------------------------------------------------------------*/                     
#define CLARKE_DEFAULTS {
                          0, \
                          0, \
                          0, \
                          0, \
                          0, \
              } 
/*------------------------------------------------------------------------------
CLARKE Transformation Macro Definition
------------------------------------------------------------------------------*/
#define CLARKE_MACRO(v)\
\
v.Alpha = v.As;\
v.Beta = _IQmpy((v.As +_IQmpy2(v.Bs)),_IQ(0.57735026918963));\
//  1/sqrt(3) = 0.57735026918963
#endif // __CLARKE_H__

IPARK变换模块宏定义代码如下:

typedef struct { 

   _iq  Alpha;  // Output: stationary d-axis stator variable

  _iq  Beta; // Output: stationary q-axis stator variable
  _iq  Angle; // Input: rotating angle (pu)
  _iq  Ds; // Input: rotating d-axis stator variable
  _iq  Qs; // Input: rotating q-axis stator variable
  _iq  Sine; // Input: Sine term
  _iq  Cosine; // Input: Cosine term
    } IPARK;             
/*-----------------------------------------------------------------------------
Default initalizer for the IPARK object.
-----------------------------------------------------------------------------*/                     
#define IPARK_DEFAULTS { 
                          0, \
                          0, \
                          0, \
                          0, \
                          0, \
                          0, \
                          0, \
                 }


/*------------------------------------------------------------------------------
Inverse PARK Transformation Macro Definition
------------------------------------------------------------------------------*/
#define IPARK_MACRO(v) \
\
v.Alpha = _IQmpy(v.Ds,v.Cosine) - _IQmpy(v.Qs,v.Sine); \
v.Beta  = _IQmpy(v.Qs,v.Cosine) + _IQmpy(v.Ds,v.Sine);
#endif // __IPARK_H__

滑模观测器参考代码如下:

// 定义系统参数

R = 1.0;   // 电机内阻

L = 0.1;   // 电机电感

Ke = 0.01;   // 电机电动势常数

Kt = 0.02 ;   // 电机转矩常数

/ /定义控制器参数

Kp = 0.5 ;   //比例增益

Ki = 0.1 ;   // 积分增益

// 定义变量

theta_hat = 0.0;   // 转子位置估计值

theta_dot_hat = 0.0 ;   // 转子速度估计值

theta_ref = 0.0 ;   //目标转子位置

theta_dot_ref = 0.0 ;   // 目标转子速度

u = 0.0 ;   // 控制输入

e_int = 0.0 ;   // 积分误差

//定义滑模观测器参数

lambda1 = 1.0;

lambda2 = 1.0;

#define SMO_MACRO(v) \
\

Te = Kt * (i_a * sin(theta_hat) - i_b * cos(theta_hat));\    //计算电机电磁转矩

s1 = theta_dot_hat - lambda1 * Te;\    // 计算滑模观测器误差

s2 = theta_hat - theta_ref;\ 

u = -Kp * s1 - Ki * e_int ;\ // 计算控制器输出

theta_dot_hat += (R / L) * i_a - (Ke / L) * sin(theta_hat) * u theta_hat += theta_dot_hat;\ //更新状态估计

e_int += s2;\ //更新积分误差

#endif // __SMO_H__

申明:由于本人水平一般,分享的知识有误,或者采用的方案不够好的,欢迎各路大神指正批评,给大家带来的不便,敬请谅解,本文观点仅供参考。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 2
收藏 3
关注 156
成为作者 赚取收益
全部留言
0/200
  • hello-boy 2023-12-06 17:04
    本文只是对IPARK、PARK、CLARKE变换以及SMO滑模观测器的算法实现进行说明,实际的FOC算法远比这段伪代码复杂,其中还包括了磁场定向、PI控制器等内容,但是电流采样部分,以及控制器的输出量和PWM的占空比如何联系起来的等等。
    回复 1条回复