RG_MACRO(v)函数理解

在DSP控制电机中:

开环控制电机时通过以下代码控制,输出的Aout和Bout为给定pwm两相的占空比。

            rg1.Freq = dnSpeedRef;
            RG_MACRO(rg1)
            st1.Angle = (Uint16)(rg1.Out >> (GLOBAL_Q - MICROSTEPS));//给定电角度
            SINCOSTBL_MACRO(st1)
            Aout = _IQmpy(dnIRef,st1.CosOut);
            Bout = _IQmpy(dnIRef,st1.SinOut);

这次先分析函数RG_MACRO(v)

电机速度主要由函数RG_MACRO(v)设定!

RG_MACRO(v)函数:

#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); \

/* 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(v)函数波形如下图所示:

RG_MACRO(v)函数理解_第1张图片

 

 

RG_MACRO(v)函数中v.Angle 为斜波函数每次增加的速率,一个周期的斜波函数为一个电周期,v.Angle的增速越快,斜坡越快到达顶点,即斜波函数的周期越短;

v.Freq为SpeedRef值,rg1.StepAngleMax = _IQ(BASE_FREQ*T);

在宏定义中:

#define BASE_FREQ       200// Base electrical frequency (Hz)

#define T ((float32)0.001/(float32)ISR_FREQUENCY)

程序中设置中断周期为20k,当SpeedRef为1时,可以算出1S内有电周期为200个电周期。已知一个电周期电机能走四步,200个电周期电机能走800步,而电机200步为一圈;所以1秒电机运行了4圈,可知电机此时的转速为240RPM(240圈/min)。

你可能感兴趣的:(嵌入式,攻略)