FOC控制算法中不可避免用使用到数字开方根;
对于没有硬件开方计算的MCU,则需要软件计算开方。
这里提供两种开方计算方式:
移位法和查表法
其中差表法时间快,M0一般1us左右,但是要占用内存。
移位法不占用ROM/RAM,但是速度慢一些。
1、移位法
unsigned int _sqrt(unsigned long value)
{
unsigned long T,B,C = 0;
for (B=0x40000000,T = 0;B != 0;B >>= 2)
{
T = C + B;
C >>= 1;
if (T <= value)
{
value -= T;
C += B;
}
}
C = C & 0xffff;
return(C);
}
2、查表法
signed int Vector_Vq_Limit(signed int *Vd)
{
volatile signed int temp_vq_q15;
signed int ret;
if((*Vd) > FOC.Vs_Max) (*Vd) = FOC.Vs_Max;
if((*Vd) < -FOC.Vs_Max) (*Vd) = -FOC.Vs_Max;
temp_vq_q15 = FRACMPY_Q15(*Vd,*Vd);
temp_vq_q15 = (stru_FOC.Vs_Square_Max - temp_vq_q15)>>6;
ret = (s32)Q15Sqrt_Table[temp_vq_q15];
return(ret);
}