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)函数中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)。

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值