This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
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;
/*------------------------------------------------------------------------------
Object Initializers
------------------------------------------------------------------------------*/
#define RAMPGEN_DEFAULTS {0, \
0, \
0, \
_IQ(1), \
0, \
_IQ(1), \
}
/*------------------------------------------------------------------------------
RAMP(Sawtooh) Generator Macro Definition
------------------------------------------------------------------------------*/
#define RG_MACRO(v) \
\
/* Compute the angle rate */ \
v.Angle += _IQmpy(v.StepAngleMax,v.Freq); \
\
/* Saturate the angle rate within (-1,1) */ \ 为什么限定在-1到1? _IQ(1.0)表示什么意思?
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) */ \为什么限定在-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);
#endif // __RAMPGEN_H__
RAMPGEN的作用就是根据当前要求的输出频率生成步进角度。步进角度就是v.Angle。
看程序本身,v.Angle+=v.StepAngleMax * v.Freq。也就是说,v.Angle与v.StepAngleMax和v.Freq相关。v.Freq是当前要求输出的频率与某个参数的比值(这样,所有变量都能限制在1之内,方便IQ计算),而StepAngleMax肯定是个定值。而我们要生成的步进角度实际上是v.Angle+=v.Freq/开关频率,从这里来推的话,StepAngleMax显然是指的最大步进量,即Fmax/开关频率。而v.Freq=当前频率/Fmax(在IQ计算中,我们时常用当前值/最大值以控制参数在1以内)。这样明白了吧?v.Angle就是实际要求输出频率(例如50Hz)在开关频率下的一个增进量了。
为什么要把Angle限制在-1~1.有两点需要注意的:1. 为方便IQ查表计算正弦值,Angle必须是一个-1~1的变量并转化为IQ值(代表-2PI~2PI)。2.如果你用的是CLA模块,里面的Angle直接就是-1~1的浮点,这样的话,在这个模块输出后,Angle是必须乘2PI后才能进下一个浮点模块。