
FOC2.0的库里面 关于电机启动时候需要知道转子位置,是不是通过void ENC_Start_Up(void)这个函数实现的,这个函数为什么又是变压器,又是磁通。直接给一个D { 静态u32 wTimebase = 0; if((wGlobal_Flags&FIRST_START)== FIRST_START) { //首次启动电动机,必须使用 wTimebase ++ 进行对齐; if(wTimebase <= T_ALIGNMENT_PWM_STEPS) { hFlux_Reference = I_ALIGNMENT * wTimebase / T_ALIGNMENT_PWM_STEPS; hTorque_Reference = 0; Stat_Curr_a_b = GET_PHASE_CURRENTS(); //在这里增大启动血压电流。 Stat_Curr_alfa_beta = Clarke(Stat_Curr_a_b); Stat_Curr_q_d = Park(Stat_Curr_alfa_beta,ALIGNMENT_ANGLE_S16); / *加载扭矩调节器输出参考电压Vqs * / Stat_Volt_q_d.qV_Component1 = PID_Regulator(hTorque_Reference, Stat_Curr_q_d.qI_Component1,&PID_Torque_InitStructure); / *加载磁通调节器输出参考电压Vds * / Stat_Volt_q_d.qV_Component2 = PID_Regulator(hFlux_Reference, Stat_Curr_q_d.qI_Component2,&PID_Flux_InitStructure); RevPark_Circle_Limitation(); / *执行反向Park转换, 即在 固定参考系上将定子电压Vqs和Vds转换为Valpha和Vbeta * / Stat_Volt_alfa_beta = Rev_Park(Stat_Volt_q_d); / * Valpha和Vbeta最终驱动了功率级* / CALC_SVPWM(Stat_Volt_alfa_beta); //和PARK()函数总是成对使用,所以thea角度不变。 } else { wTimebase = 0; ENC_ResetEncoder(); Stat_Volt_q_d.qV_Component1 = Stat_Volt_q_d.qV_Component2 = 0; hTorque_Reference = PID_TORQUE_REFERENCE; hFlux_Reference = PID_FLUX_REFERENCE; wGlobal_Flags&=〜FIRST_START; //仅进行一次对齐 // //清除对齐阶段的速度获取 ENC_Clear_Speed_Buffer(); #ifdef ENCODER State = RUN; #endif } } else { #ifdef ENCODER State = RUN; #endif } } |