滑模观测器的学习

首先,先学习一下理论知识

 

 
 
 
 

 附加上TI的smo代码

首先先贴出代码中的变量,以便大家更快的看懂。

typedef struct {  _iq  Valpha;    // Input: Stationary alfa-axis stator voltage _iq  Ealpha;   // Variable: Stationary alfa-axis back EMF _iq  Zalpha;      // Output: Stationary alfa-axis sliding control _iq  Gsmopos;    // Parameter: Motor dependent control gain _iq  EstIalpha;   // Variable: Estimated stationary alfaaxis stator current _iq  Fsmopos;    // Parameter: Motor dependent plant matrix _iq  Vbeta;    // Input: Stationary beta-axis stator voltage _iq  Ebeta;   // Variable: Stationary beta-axis back EMF _iq  Zbeta;      // Output: Stationary beta-axis sliding control _iq  EstIbeta;    // Variable: Estimated stationary beta-axis statorcurrent _iq  Ialpha;   // Input: Stationary alfa-axis stator current _iq  IalphaError; // Variable: Stationary alfaaxis current error                 _iq  Kslide;     // Parameter: Sliding control gain _iq  Ibeta;   // Input: Stationary beta-axis stator current _iq  IbetaError;  // Variable: Stationary betaaxis current error                 _iq  Kslf;       // Parameter: Sliding control filter gain _iq  Theta;     // Output: Compensated rotor angle void  (*calc)(); // Pointer to calculation function  } SMOPOS;             typedef SMOPOS *SMOPOS_handle;/*-----------------------------------------------------------------------------Default initalizer for the SMOPOS object.-----------------------------------------------------------------------------*/                     #define SMOPOS_DEFAULTS {  0,0,0,0,0,0,0,0,0,0,   \0,0,0,0,0,0,0,   \(void (*)(Uint32))smopos_calc }

以下是smo的代码

#include "IQmathLib.h"         // Include header for IQmath library // Don't forget to set a proper GLOBAL_Q in "IQmathLib.h" file #include "dmctype.h"#include "smopos.h"void smopos_calc(SMOPOS *v){_iq E0;E0 = _IQ(0.5);// Sliding mode current observerv->EstIalpha = _IQmpy(v->Fsmopos,v->EstIalpha) + _IQmpy(v->Gsmopos,(v->Valpha - v->Ealpha - v->Zalpha));   //mpy是乘法,就对应上面的公式(3)注意不是完全对应,因为程序里开关量是不能直接写出来的是要用下面的if语句描述出来的,其实这里我有一个疑问,有些书上这个公式等号前面是微分,而有的却不是对i的微分,看TI的意思应该不是微分,v->EstIbeta = _IQmpy(v->Fsmopos,v->EstIbeta) + _IQmpy(v->Gsmopos,(v->Vbeta - v->Ebeta - v->Zbeta));//这个对应公式(4)// Current errorsv->IalphaError = v->EstIalpha - v->Ialpha;  //得出观察与实际的误差v->IbetaError = v->EstIbeta - v->Ibeta;    //同上// Sliding control calculatorif (_IQabs(v->IalphaError) < E0)        //如果小于开关设定值就将滑模增益乘以误差与设定值的比v->Zalpha = _IQmpy(v->Kslide,_IQdiv(v->IalphaError,E0));  else if (v->IalphaError >= E0)   //如果大于开关设定值则将滑模增益赋给zv->Zalpha = v->Kslide;else if (v->IalphaError <= -E0) v->Zalpha = -v->Kslide;if (_IQabs(v->IbetaError) < E0)v->Zbeta = _IQmpy(v->Kslide,_IQdiv(v->IbetaError,E0));  else if (v->IbetaError >= E0) v->Zbeta = v->Kslide;else if (v->IbetaError <= -E0) v->Zbeta = -v->Kslide;// Sliding control filter -> back EMF calculatorv->Ealpha = v->Ealpha + _IQmpy(v->Kslf,(v->Zalpha-v->Ealpha)); //v->Kslf滤波器增益v->Ebeta = v->Ebeta + _IQmpy(v->Kslf,(v->Zbeta-v->Ebeta));// Rotor angle calculator -> Theta = atan(-Ealpha,Ebeta)v->Theta = _IQatan2PU(-v->Ealpha,v->Ebeta);      //得出α与β轴的估算反电势就可以估算出角度了。}

从代码中我们可以很直观的看出smo是怎么写出来的,ps:_iq是一个iq math集里的指令,是用来自己设定一个变量它的小数位和整数位各是多少为(即移动小数点位置)比如这个数是16位的数,我们可以选择让它有9位是整数位,7位是小数位,这种方式能够很大的提高运算速度。

问题:在在上述程序中使用反正切函数时,IQmath库中的输出范围为0-1,对应实际应该是0-2π,但实际上正切周期是π,也就是说也就是对于同一个反正切值而言如果不进行象限判断,都可以在0-π中找到对应的值也就是说IQmath库中反正切函数的实际输出范围是0-0.5

标幺值 英文为 per unit 简写为 pu 一些科学软件中通常写作 p.u. 中文有时也写作 标么值 其中的 么 的读音是yāo 不是me也不是mó

标幺值是相对于某一基准值而言的 同一有名值 当基准值选取不同时 其标幺值也不同 它们的关系如下 标幺值= 有名值/ 基准值

比如在短路电流计算中 选定一个基准容量(Sjz)和基准电压(Ujz) 将短路计算中各个参数都转化为和该参数的基准量的比值(相对于基准量的比值) 称为标幺值 标幺值 =实际值 / 基准值

各物理量基准值的选择必须和其实际值具有相同的量纲 常用下标注B表示基准值 下标注*表示标幺值

假设功率的实际值为 基准值为 则其标幺值为S*=S/SB.

好处:

1 三相电路的计算公式与单相电路的计算公式完全相同 线电压的标幺值与相电压的标幺值相等 三相功率的标幺值和单相功率的标幺值相等

2 只需确定各电压等级的基准值 而后直接在各自的基准值下计算标幺值 不需要进行参数和计算结果的折算

3) 对于低压系统 功率的标幺值远小于1

4 用标幺值后 电力系统的元件参数比较接近 易于进行计算和对结果的分析比较

5 可以省去公式中的比例系数 使计算简化