在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)。