|
|
@@ -156,16 +156,15 @@ static void uvw_current_and_vbus_get(float* vbus, double* iu, double* iv, double
|
|
|
*/
|
|
|
void motor_run(void)
|
|
|
{
|
|
|
- uvw_current_and_vbus_get(&Vbus, &Ia, &Ib, &Ic);
|
|
|
- //Hall_TypeDef* hall = Hall_Get();
|
|
|
- //MotorParam_t* motor = get_motor();
|
|
|
-
|
|
|
-// Hall_Update_Interpolated_Angle();
|
|
|
+ // 采集三相电流 母线电压
|
|
|
+ uvw_current_and_vbus_get(&Vbus, &Ia, &Ib, &Ic);
|
|
|
+
|
|
|
+ // IF 软起动
|
|
|
if(speed_close_loop_flag==0) //速度环闭环切换控制,电机刚启动时速度环不闭环
|
|
|
{ //并且电流参考值缓慢增加(防冲击),速度达到一定值
|
|
|
if((Iq_ref<MOTOR_STARTUP_CURRENT)) //速度切入闭环
|
|
|
{ //电流环在电机运行过程中全程闭环
|
|
|
- Iq_ref += 0.00003f; //角度在电机刚启动时就闭环运行,无需强拖,得益于卡尔曼滤波做
|
|
|
+ Iq_ref += 0.001f; //角度在电机刚启动时就闭环运行,无需强拖,得益于卡尔曼滤波做
|
|
|
} //状态观测器低速性能比教好
|
|
|
else
|
|
|
{
|
|
|
@@ -176,7 +175,7 @@ void motor_run(void)
|
|
|
{
|
|
|
if(speed_close_loop_flag==1)
|
|
|
{
|
|
|
- if(Iq_ref>(MOTOR_STARTUP_CURRENT/2.0f))
|
|
|
+ if(Iq_ref>(MOTOR_STARTUP_CURRENT)/2.0f)
|
|
|
{
|
|
|
Iq_ref -= 0.001f;
|
|
|
}
|
|
|
@@ -187,62 +186,47 @@ void motor_run(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// if(FOC_Output.EKF[2]>SPEED_LOOP_CLOSE_RAD_S) //无感方式运行,状态观测器得到角度和速度信息
|
|
|
-// {
|
|
|
-// FOC_Input.Id_ref = 0.0f;
|
|
|
-// Speed_Fdk = FOC_Output.EKF[2];
|
|
|
-// FOC_Input.Iq_ref = Speed_Pid_Out;
|
|
|
-// }
|
|
|
-// else
|
|
|
-// {
|
|
|
-// FOC_Input.Id_ref = 0.0f;
|
|
|
-// FOC_Input.Iq_ref = Iq_ref;
|
|
|
-// Speed_Pid.I_Sum = Iq_ref;
|
|
|
-// }
|
|
|
-// FOC_Input.theta = FOC_Output.EKF[3];
|
|
|
-// FOC_Input.speed_fdk = FOC_Output.EKF[2];
|
|
|
-// EKF_Hz = FOC_Output.EKF[2]/(2.0f*PI);
|
|
|
-// FOC_Input.Id_ref = 0.0f;
|
|
|
-// FOC_Input.Tpwm = PWM_TIM_PULSE_TPWM; //FOC运行函数需要用到的输入信息
|
|
|
-// FOC_Input.Udc = Vbus;
|
|
|
-// FOC_Input.Rs = Rs;
|
|
|
-// FOC_Input.Ls = Ls;
|
|
|
-// FOC_Input.flux = flux;
|
|
|
-//
|
|
|
-// FOC_Input.ia = Ia;
|
|
|
-// FOC_Input.ib = Ib;
|
|
|
-// FOC_Input.ic = Ic;
|
|
|
- // foc_algorithm_step(); //整个FOC运行函数(包括无感状态观测器,电流环,SVPWM,坐标变换,电机参数识别)
|
|
|
// ========== FOC参数设置 ==========
|
|
|
FOC_parm_input();
|
|
|
- get_foc_input()->Iq_ref = 1.0f;
|
|
|
- Hall_Update_Interpolated_Angle();
|
|
|
- static uint16_t cnt = 0;
|
|
|
- if(cnt <= 10000)
|
|
|
- {
|
|
|
- cnt++;
|
|
|
- theta += 0.01f;
|
|
|
- if(theta >= 2* PI)
|
|
|
- {
|
|
|
- theta -= 2 * PI;
|
|
|
- }
|
|
|
- if(theta < 0.0f)
|
|
|
- {
|
|
|
- theta += 2 * PI;
|
|
|
- }
|
|
|
- get_foc_input()->theta = theta;
|
|
|
-
|
|
|
- }else
|
|
|
- {
|
|
|
- get_foc_input()->theta = Hall_Get()->angle;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+#ifdef HALL_FOC_SELECT
|
|
|
+
|
|
|
+ Hall_Update_Interpolated_Angle(); // 霍尔角度插值
|
|
|
+
|
|
|
+ if(Hall_Get()->Speed > SPEED_LOOP_CLOSE_RAD_S ) // 速度达到闭环阈值
|
|
|
+ {
|
|
|
+ FOC_Input.Id_ref = 0.0f;
|
|
|
+ Speed_Fdk = Hall_Get()->Speed;
|
|
|
+ FOC_Input.Iq_ref = Speed_Pid_Out;
|
|
|
+ // 切闭环霍尔角度
|
|
|
+ get_foc_input()->theta = Hall_Get()->angle;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ FOC_Input.Id_ref = 0.0f;
|
|
|
+ FOC_Input.Iq_ref = Iq_ref;
|
|
|
+ Speed_Pid.I_Sum = Iq_ref;
|
|
|
+ // 模拟自增电角度
|
|
|
+ theta += 0.005f; // 自增角度大了影响切换?? 给到0.01的时候经常滑丝
|
|
|
+ if(theta >= 2* PI)
|
|
|
+ {
|
|
|
+ theta -= 2 * PI;
|
|
|
+ }
|
|
|
+ if(theta < 0.0f)
|
|
|
+ {
|
|
|
+ theta += 2 * PI;
|
|
|
+ }
|
|
|
+ get_foc_input()->theta = theta;
|
|
|
+ }
|
|
|
+ FOC_Input.speed_fdk = Hall_Get()->Speed; // 可用于参数识别
|
|
|
+#endif
|
|
|
// ========== 执行FOC算法 ==========
|
|
|
- motor_foc_openloop_run();
|
|
|
- //motor_ekf_closeloop_run();
|
|
|
+ motor_foc_alg_run();
|
|
|
+
|
|
|
// ========== PWM输出更新 ==========
|
|
|
- if(motor_start_stop == 1 )//&& motor->ctrl_state != CTRL_STATE_IDLE)
|
|
|
+ if(motor_start_stop == 1 )
|
|
|
{
|
|
|
PWM_TIM->CCR1 = (u16)(FOC_Output.Tcmp1);
|
|
|
PWM_TIM->CCR2 = (u16)(FOC_Output.Tcmp2);
|
|
|
@@ -256,11 +240,7 @@ void motor_run(void)
|
|
|
}
|
|
|
|
|
|
// ========== 停止命令处理 ==========
|
|
|
-// if(motor_start_stop == 0 && motor->ctrl_state != CTRL_STATE_IDLE &&
|
|
|
-// motor->ctrl_state != CTRL_STATE_STOPPING)
|
|
|
-// {
|
|
|
-// motor->ctrl_state = CTRL_STATE_STOPPING;
|
|
|
-// }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -310,20 +290,20 @@ void motor_run(void)
|
|
|
// 根据传感器类型选择FOC控制模式
|
|
|
#ifdef HALL_FOC_SELECT // 使用霍尔传感器的FOC控制
|
|
|
|
|
|
-// if((hall_speed*2.0f*PI)>SPEED_LOOP_CLOSE_RAD_S) // 速度达到闭环阈值
|
|
|
-// {
|
|
|
-// FOC_Input.Id_ref = 0.0f;
|
|
|
-// Speed_Fdk = hall_speed*2.0f*PI;
|
|
|
-// FOC_Input.Iq_ref = Speed_Pid_Out;
|
|
|
-// }
|
|
|
-// else
|
|
|
-// {
|
|
|
-// FOC_Input.Id_ref = 0.0f;
|
|
|
-// FOC_Input.Iq_ref = Iq_ref;
|
|
|
-// Speed_Pid.I_Sum = Iq_ref;
|
|
|
-// }
|
|
|
-// FOC_Input.theta = hall_angle;
|
|
|
-// FOC_Input.speed_fdk = hall_speed*2.0f*PI;
|
|
|
+ if((hall_speed*2.0f*PI)>SPEED_LOOP_CLOSE_RAD_S) // 速度达到闭环阈值
|
|
|
+ {
|
|
|
+ FOC_Input.Id_ref = 0.0f;
|
|
|
+ Speed_Fdk = hall_speed*2.0f*PI;
|
|
|
+ FOC_Input.Iq_ref = Speed_Pid_Out;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ FOC_Input.Id_ref = 0.0f;
|
|
|
+ FOC_Input.Iq_ref = Iq_ref;
|
|
|
+ Speed_Pid.I_Sum = Iq_ref;
|
|
|
+ }
|
|
|
+ FOC_Input.theta = hall_angle;
|
|
|
+ FOC_Input.speed_fdk = hall_speed*2.0f*PI;
|
|
|
|
|
|
#endif
|
|
|
|