foc
#include "foc.h" //https://dengfoc.com /* 1. 3个电流矢量Ia,Ib,Ic(相位差120度的sin波形),转换为2个电流矢量I_alpha,I_beta(相差90度) 2. 公式: I_alpha = Ia- Ib*sin30°- Ic*sin30°即 I_alpha = Ia- Ib/2- Ic/2 I_beta = Ib*cos30°- Ic*cos30°即 I_beta = Ib*sqrt(3)/2- Ic*sqrt(3)/2 3. 等幅值变换:电流需要乘2/3,推导见网页 I_alpha = (Ia- Ib/2- Ic/2) *2/3 I_beta = (Ib*sqrt(3)/2- Ic*sqrt(3)/2) *2/3 又有基尔霍夫电流定律: Ia+Ib+Ic = 0,消去Ic,得公式如下: I_alpha = Ia I_beta = (Ib*2+Ia)/sqrt(3) 实际等幅值变换需额外修正功率系数,不用于实际foc控制 4. 等功率变换:电流需要乘sqrt(2/3),理论依据是瞬间功率相等,Ia*Ua + Ib*Ub + Ic*Uc = I_alpha*U_alpha + I_beta*U_beta,最后推导出系数为sqrt(2/3), 又有基尔霍夫电流定律: Ia+Ib+Ic = 0,消去Ic,得公式如下: I_alpha = Ia*sqrt(2/3) I_beta = (Ib*2+Ia)/sqrt(2) */ void clark(double *Ia, double *Ib, double *I_alpha, double *I_beta) { *I_alpha = (*Ia) * sqrt(2.0 / 3.0); *I_beta = (*Ib * 2 + *Ia) / sqrt(2.0); } void park(double *I_alpha, double *I_beta, double *Id, double *Iq, double theta) { *Id = (*I_alpha) * cos(theta) + (*I_beta) * sin(theta); *Iq = -(*I_alpha) * sin(theta) + (*I_beta) * cos(theta); }
void ipark(double *I_alpha, double *I_beta, double *Id, double *Iq, double theta)
{
*I_alpha = (*Id) * sin(theta) + (*Iq) * cos(theta);
*I_beta = (*Id) * cos(theta) - (*Iq) * sin(theta);
}
#ifndef _FOC_H_ #define _FOC_H_ #include "main.h" void clark(double *Ia, double *Ib, double *I_alpha, double *I_beta); void park(double *I_alpha, double *I_beta, double *Id, double *Iq, double theta);
void ipark(double *I_alpha, double *I_beta, double *Id, double *Iq, double theta);
#endif

浙公网安备 33010602011771号