发 帖  
原厂入驻New
申请华秋企业认证 多层板首单免费打样!
30s提交资料,10分钟通过审核(免费赔付+顺丰包邮)>>立即报名

[经验] 电机FOC中的CLARK变换和PARK变换(公式推导+仿真+C语言实现)

2019-10-29 10:27:06  1127 电机 FOC 电机控制 PID
分享
5
今天获知了,电机FOC包含了SVPWM、坐标转换、信号采集反馈、PID闭环控制等,这个控制策略,统称为FOC控制。一般SVPWM算法的实现是在静止的αβ坐标系上实现。而PID控制器由于是对直流参考信号的跟踪效果较好,因此三相交流电会经过坐标变换,在旋转的dq坐标轴上,可以用直流量描述电枢绕组的合成矢量。

FOC控制中,有两种坐标转换需要注意的,分别是clark变换,和park变换。clark变换将abc坐标系转换为αβ坐标系,而park变换将静止的αβ坐标系转换为旋转的dq坐标系。

1 clark变换
8.png
其实直接可以把转换公式列出。
9.png
写成转换矩阵,就是:
10.png
clark变换的逆变换:
11.png
写成转换矩阵,就是:
12.png
将两个转换矩阵相乘,应该是一个单位矩阵,系数K的作用是可以将转换变为等幅值转换或者等功率转换。
当、 13.png ,是等幅值转换;当、 14.png ,是等功率转换。
1.1 matlab仿真
在matlab/simulink中搭建仿真模型:
15.png
abcToAlphabeta中的代码:
  1. function y = fcn(a,b,c)
  2. %#eml


  3. alpha = a - b/2 - c/2;
  4. beta = sqrt(3)/2 * (b - c);
  5. y = (2/3)*[alpha;beta];
复制代码
alphabetaToABC中的代码:
  1. function y = fcn(alpha,beta)
  2. %#eml

  3. a = alpha;
  4. b = -1/2 * alpha + sqrt(3)/2 * beta;
  5. c = -1/2 * alpha - sqrt(3)/2 * beta;

  6. y = [a;b;c];
复制代码
仿真波形:
16.png
我在这里使用的是等幅值变换。因为这里调制系数为1,各个正弦波的幅值都是1。假如使用等功率变换,alphabeta坐标系上的幅值会超过1,此时若直接经过SVPWM算法,会变成过调制。

2 park变换 17.png
通过几何变换,可以直接得到、
QQ图片20191010105308.png
图中就是d轴和α轴之间的夹角。我们也可以用q轴和α轴之间的夹角进行转换,但是会影响矩阵的参数。故还是采用d轴和α轴之间的夹角。因为我参考了wikipedia的alphabeta transformation和TI的controlSuite里面的资料,都是使用这个夹角去推转换矩阵的。因此不转牛角尖了。


写成矩阵的形式:
QQ图片20191010105331.png

那么逆变换就是:
QQ图片20191010105508.png
2.1 仿真搭建仿真模型:
QQ图片20191010105522.png
alphabetaToDQ代码:
  1. function y = fcn(alpha,beta, c)
  2. %#eml
  3. d = cos(c)* alpha + sin(c)*beta;
  4. q = -sin(c)* alpha + cos(c)*beta;

  5. y=[d;q];
复制代码
DQToAlphabeta代码:
  1. function y = fcn(d,q, c)
  2. %#eml
  3. alpha = cos(c) * d - sin(c)*q;
  4. beta =  sin(c) * d + cos(c)*q;

  5. y=[alpha;beta];
复制代码
波形:
QQ图片20191011111433.png
此时注意到:

现在三相abc的波形函数是:
QQ图片20191011111453.png
假如需要反转,那么把输入改为:
QQ图片20191011111514.png
同时把仿真模型中的constant改为 -2*pi*10

可以得到:
QQ图片20191029102305.png
3 C语言以下代码来自TI的controlSUITE。在此特别鸣谢TI。

3.1 clarke.h
  1. /* =================================================================================
  2. File name:       CLARKE.H  
  3. ===================================================================================*/


  4. #IFndef __CLARKE_H__
  5. #define __CLARKE_H__

  6. typedef struct {  _iq  As;                  // Input: phase-a stator variable
  7.                                   _iq  Bs;                        // Input: phase-b stator variable
  8.                                   _iq  Cs;                        // Input: phase-c stator variable  
  9.                                   _iq  Alpha;                // Output: stationary d-axis stator variable
  10.                                   _iq  Beta;                // Output: stationary q-axis stator variable
  11.                                   } CLARKE;                   

  12. /*-----------------------------------------------------------------------------
  13.         Default initalizer for the CLARKE object.
  14. -----------------------------------------------------------------------------*/                     
  15. #define CLARKE_DEFAULTS { 0, \
  16.                           0, \
  17.                           0, \
  18.                           0, \
  19.                           0, \
  20.                                       }

  21. /*------------------------------------------------------------------------------
  22.         CLARKE Transformation Macro Definition
  23. ------------------------------------------------------------------------------*/

  24. //  1/sqrt(3) = 0.57735026918963
  25. #define  ONEbySQRT3   0.57735026918963    /* 1/sqrt(3) */
  26.        

  27. // Clarke transform macro (with 2 currents)
  28. //==========================================
  29. #define CLARKE_MACRO(v)                                                                                \
  30. v.Alpha = v.As;                                                                                                \
  31. v.Beta = _IQmpy((v.As +_IQmpy2(v.Bs)),_IQ(ONEbySQRT3));


  32. // Clarke transform macro (with 3 currents)
  33. //==========================================
  34. #define CLARKE1_MACRO(v)                                                                        \
  35. v.Alpha = v.As;                                                                                            \
  36. v.Beta  = _IQmpy((v.Bs - v.Cs),_IQ(ONEbySQRT3));

  37. #endif // __CLARKE_H__
复制代码
3.2 park.h
  1. /* =================================================================================
  2. File name:       PARK.H
  3. ===================================================================================*/

  4. #ifndef __PARK_H__
  5. #define __PARK_H__

  6. typedef struct {  _iq  Alpha;                  // Input: stationary d-axis stator variable
  7.                                   _iq  Beta;                 // Input: stationary q-axis stator variable
  8.                                   _iq  Angle;                // Input: rotating angle (pu)
  9.                                   _iq  Ds;                        // Output: rotating d-axis stator variable
  10.                                   _iq  Qs;                        // Output: rotating q-axis stator variable
  11.                                   _iq  Sine;
  12.                                   _iq  Cosine;          
  13.                                   } PARK;                   

  14. /*-----------------------------------------------------------------------------
  15. Default initalizer for the PARK object.
  16. -----------------------------------------------------------------------------*/                     
  17. #define PARK_DEFAULTS {   0, \
  18.                           0, \
  19.                           0, \
  20.                           0, \
  21.                           0, \
  22.                                                   0, \
  23.                           0, \
  24.                                         }

  25. /*------------------------------------------------------------------------------
  26.         PARK Transformation Macro Definition
  27. ------------------------------------------------------------------------------*/


  28. #define PARK_MACRO(v)                                                                                        \
  29.                                                                                                                                 \
  30.         v.Ds = _IQmpy(v.Alpha,v.Cosine) + _IQmpy(v.Beta,v.Sine);        \
  31.     v.Qs = _IQmpy(v.Beta,v.Cosine) - _IQmpy(v.Alpha,v.Sine);

  32. #endif // __PARK_H__
复制代码
3.3 ipark.h
  1. /* =================================================================================
  2. File name:       IPARK.H   
  3. ===================================================================================*/

  4. #ifndef __IPARK_H__
  5. #define __IPARK_H__

  6. typedef struct {  _iq  Alpha;                  // Output: stationary d-axis stator variable
  7.                                   _iq  Beta;                // Output: stationary q-axis stator variable
  8.                                   _iq  Angle;                // Input: rotating angle (pu)
  9.                                   _iq  Ds;                        // Input: rotating d-axis stator variable
  10.                                   _iq  Qs;                        // Input: rotating q-axis stator variable
  11.                                   _iq  Sine;                // Input: Sine term
  12.                                   _iq  Cosine;                // Input: Cosine term
  13.                              } IPARK;                   

  14. /*-----------------------------------------------------------------------------
  15. Default initalizer for the IPARK object.
  16. -----------------------------------------------------------------------------*/                     
  17. #define IPARK_DEFAULTS {  0, \
  18.                           0, \
  19.                           0, \
  20.                           0, \
  21.                           0, \
  22.                                                   0, \
  23.                           0, \
  24.                                  }

  25. /*------------------------------------------------------------------------------
  26.         Inverse PARK Transformation Macro Definition
  27. ------------------------------------------------------------------------------*/


  28. #define IPARK_MACRO(v)                                                                                \
  29.                                                                                                                         \
  30. v.Alpha = _IQmpy(v.Ds,v.Cosine) - _IQmpy(v.Qs,v.Sine);                \
  31. v.Beta  = _IQmpy(v.Qs,v.Cosine) + _IQmpy(v.Ds,v.Sine);

  32. #endif // __IPARK_H__
复制代码
小结
坐标变换在FOC中也是重要的部分。本文介绍了clark变换和park变换。这两种变换其实在网上资料十分丰富了。但在这里还是写了一遍。一方面是贡献自己的能力,另一方面是满足自己的收藏癖。假如需要重新编程,那么我还是会重新找出资料。但是目前TI的资料也很丰富,我往下在实物上实现FOC的话,估计会从现有的代码上修改。


现在干活都做LED了,看维基上面的clarke变换,让我想起了以前的日子。以前没搞懂的坐标公式和PID公式,多推几遍,现在也越来越熟悉了。







combat88 2019-10-29 19:34:02
学习了,研究一下,用帮助,多谢
回复

举报

zgy-chenxin 2019-11-13 18:18:28
讲解的细致,较实用
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

发经验
关闭

站长推荐 上一条 /5 下一条

快速回复 返回顶部 返回列表