RAMPGEN宏解析


typedef struct { _iq  Freq;            // Input: Ramp frequency (pu)     
                 _iq  StepAngleMax;    // Parameter: Maximum step angle (pu)        
                 _iq  Angle;           // Variable: Step angle (pu)                      
                 _iq  Gain;            // Input: Ramp gain (pu)
                 _iq  Out;             // Output: Ramp signal (pu)     
                 _iq  Offset;          // Input: Ramp offset (pu)                  
               } RAMPGEN;

RAMPGEN结构体:

  输入变量:Freq(频率)

       Gain(斜坡增益)

       Offset(斜坡偏置)

  输出变量:Out(斜坡信号)

/*------------------------------------------------------------------------------
Default initalizer for the RAMPGEN object.
------------------------------------------------------------------------------*/                       
#define RAMPGEN_DEFAULTS {0,        \
                          0,        \
                          0,        \
                          _IQ(1),   \
                          0,        \
                          _IQ(1),   \
                         }

RAMPGEN对象的默认初始化

#define RG_MACRO(v)                                    \
                                                       \
/* Compute the angle rate */                           \
    v.Angle += _IQmpy(v.StepAngleMax,v.Freq);          \
                                                       \
/* Saturate the angle rate within (-1,1) */            \
    if (v.Angle>_IQ(1.0))                              \
        v.Angle -= _IQ(1.0);                           \
    else if (v.Angle<_IQ(-1.0))                        \
        v.Angle += _IQ(1.0);                           \
    v.Out=v.Angle;

// Use the code snippet below if gain/offset needed.   \
/* Compute the ramp output */                          \
    v.Out = _IQmpy(v.Angle,v.Gain) + v.Offset;         \
/* Saturate the ramp output within (-1,1) */           \
    if (v.Out>_IQ(1.0))                                \
        v.Out -= _IQ(1.0);                             \
    else if (v.Out<_IQ(-1.0))                          \
        v.Out += _IQ(1.0);

RG_MACRO宏:1.Angle = Angle + StepAngleMax*Freq;

          2.判断Angle是否大于_IQ(1.0)(正转);是否小于_IQ(-1.0)(反转);减去一周的角度

          3.输出计算后的角度值 out = Angle;

          4.如果有增益和偏置的存在,则进行下述操作:

             5.out = Angle*Gain + offset,并同时对输出进行限制。