TI的controlSUITE套件问题;
本帖最后由 breeze_one 于 2012-5-5 15:53 编辑TI的这个controlSUITE套件中的C:\TI\controlSUITE\development_kits\HVMotorCtrl+PfcKit_v1.6\HVACI_Scalar这个交流异步电机的spwm控制,关于这个步进角度StepAngle怎么算的,有人知道嘛?v.Freq假设是IQ24(0.3),v.FreqMax是IQ24(1.0),一下函数是PWM中断时调用;pwm频率为10k;
StepAngle = _IQmpy(v.Freq,v.FreqMax); \
/* Calculate new angle alpha */ \
EntryOld = v.NewEntry; (这两个值的初始值都为0) \
v.Alpha = v.Alpha + StepAngle; \
if (v.Alpha >= _IQ(1.0)) \
v.Alpha = v.Alpha-_IQ(1.0); \
v.NewEntry = v.Alpha; \
dy = _IQsin(_IQmpy(v.NewEntry,PI_THIRD)); /* dy = sin(NewEntry)PI_THIRD = 3.1415926/3 */ \
dx = _IQsin(PI_THIRD-_IQmpy(v.NewEntry,PI_THIRD)); /* dx = sin(60-NewEntry) */ \
/* Determine which sector */ \
if (v.NewEntry-EntryOld<0) \
{ \
if (v.SectorPointer==5) \
v.SectorPointer = 0; \
else \
v.SectorPointer = v.SectorPointer + 1; \
} \
if (v.SectorPointer==0)/* Sector 1 calculations - a,b,c -. a,b,c*/ \
{ \
v.Ta = (TP-dx-dy)>>1; \
v.Tb = v.Ta + dx; \
v.Tc = TP - v.Ta; \
} \
else if (v.SectorPointer==1)/* Sector 2 calculations - a,b,c -. b,a,c&dx <-. dy */ \
{ \
v.Tb = (TP-dx-dy)>>1; \
v.Ta = v.Tb + dy; \
v.Tc = TP - v.Tb; \
} \
else if (v.SectorPointer==2)/* Sector 3 calculations - a,b,c -. b,c,a */ \
{ \
v.Tb = (TP-dx-dy)>>1; \
v.Tc = v.Tb + dx; \
v.Ta = TP - v.Tb; \
} \
else if (v.SectorPointer==3)/* Sector 4 calculations - a,b,c -. c,b,a&dx <-. dy */ \
{ \
v.Tc = (TP-dx-dy)>>1; \
v.Tb = v.Tc + dy; \
v.Ta = TP - v.Tc; \
} \
else if (v.SectorPointer==4)/* Sector 5 calculations - a,b,c -. c,a,b */ \
{ \
v.Tc = (TP-dx-dy)>>1; \
v.Ta = v.Tc + dx; \
v.Tb = TP - v.Tc; \
} \
else if (v.SectorPointer==5)/* Sector 6 calculations - a,b,c -. a,c,b&dx <-. dy */ \
{ \
v.Ta = (TP-dx-dy)>>1; \
v.Tc = v.Ta + dy; \
v.Tb = TP - v.Ta; \
} \
/* Convert the unsigned GLOBAL_Q format (ranged (0,1)) . signed GLOBAL_Q format (ranged (-1,1)) */ \
/* Then, multiply with a gain and add an offset. */ \
v.Ta = (v.Ta-_IQ(0.5))<<1; \
v.Ta = _IQmpy(v.Gain,v.Ta) + v.Offset; v.Gain是对应的最高电压U \
\
v.Tb = (v.Tb-_IQ(0.5))<<1; \
v.Tb = _IQmpy(v.Gain,v.Tb) + v.Offset; \
\
v.Tc = (v.Tc-_IQ(0.5))<<1; \
v.Tc = _IQmpy(v.Gain,v.Tc) + v.Offset; 难道没人在研究啊,不太可能吧?? 终于弄懂了一部分了v.Freq==_IQ(1)的时候;因为v.FreqMax=_IQ(6*BASE_FREQ*T);BASE_FREQ = 120;20hz时候的,采集5000个点,10k频率,所以一个周期一圈360°;360/5000=stepangle刚好_IQ(0.0719999671);但是后面又看不懂了,每走1°就得换个v.SectorPointer;按理说应该每走60°才换的,还需探索 搞错搞错!应该是按照以下理解的:v.Freq=_IQ(1),v.FreqMax=_IQ(6*BASE_FREQ*T);(BASE_FREQ=120,T=0.001/10(10KPWM的周期);
StepAngle = _IQmpy(v.Freq,v.FreqMax)=_IQ(0.0719999671),IQ(1)=60°;360°对应的应该是IQ(6);所以360°内应该是6/0.0719999671=83.3333714个PWM中断;每个中断100us;360°总共耗时83.3333714*100us;对应的频率是120HZ;同理v.Freq=_IQ(0.3)的时候就是40HZ.120HZ的时候才采样80几个点够了嘛?为什么会是120HZ呢?一般不都是50hz最高的嘛??? 采样点不够的话只能增加PWM的频率,受IGBT开关频率的影响又不能太高,所以也就只能这样了;
The base frequency may be specified at 2 times of rated frequency (60 Hz) in order to run the motor at speed higher than rated speed (in the field weakening).为了使跑的比额定速度快,所以要设成120hz 来的太晚了。
页:
[1]