|
@@ -21,6 +21,9 @@ void smo_observer_init(float pll_bandwith, float lpf_wc, float Ksmo, float Ksta)
|
|
|
smo.motor_ld = nv_get_motor_params()->ld;
|
|
smo.motor_ld = nv_get_motor_params()->ld;
|
|
|
smo.motor_lq = nv_get_motor_params()->lq;
|
|
smo.motor_lq = nv_get_motor_params()->lq;
|
|
|
smo.motor_poles = nv_get_motor_params()->poles;
|
|
smo.motor_poles = nv_get_motor_params()->poles;
|
|
|
|
|
+
|
|
|
|
|
+ smo.ldq_diff_dm = (smo.motor_ld-smo.motor_lq)/smo.motor_lq*smo.motor_ld;
|
|
|
|
|
+ smo.ld_inv = 1.0f / smo.motor_ld;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
float smo_observer_update(float uAlpha, float uBeta, float iAlpha, float iBeta) {
|
|
float smo_observer_update(float uAlpha, float uBeta, float iAlpha, float iBeta) {
|
|
@@ -30,11 +33,15 @@ float smo_observer_update(float uAlpha, float uBeta, float iAlpha, float iBeta)
|
|
|
return pi_2_degree(smo.est_angle_out);
|
|
return pi_2_degree(smo.est_angle_out);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+smo_observer_t *get_smo(void) {
|
|
|
|
|
+ return &smo;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
static void smo_observer(float uAlpha, float uBeta, float iAlpha, float iBeta) {
|
|
static void smo_observer(float uAlpha, float uBeta, float iAlpha, float iBeta) {
|
|
|
- float est_ab = (smo.motor_ld-smo.motor_lq)/smo.motor_lq * smo.est_rad_pers;
|
|
|
|
|
|
|
+ float est_ab = smo.ldq_diff_dm * smo.est_rad_pers;//(smo.motor_ld-smo.motor_lq)/smo.motor_lq * smo.est_rad_pers;
|
|
|
|
|
|
|
|
/* est alpha back emf */
|
|
/* est alpha back emf */
|
|
|
- float calc_alpha = uAlpha/smo.motor_ld - smo.Ialpha_hat*(smo.motor_r/smo.motor_ld) - smo.est_eAlpha / smo.motor_ld - est_ab * smo.IBeta_hat;
|
|
|
|
|
|
|
+ float calc_alpha = (uAlpha - smo.Ialpha_hat*smo.motor_r - smo.est_eAlpha - est_ab * smo.IBeta_hat) * smo.ld_inv;
|
|
|
smo.Ialpha_hat += calc_alpha * smo.ts; //积分
|
|
smo.Ialpha_hat += calc_alpha * smo.ts; //积分
|
|
|
|
|
|
|
|
float err_iAlpha = smo.Ialpha_hat - iAlpha;
|
|
float err_iAlpha = smo.Ialpha_hat - iAlpha;
|
|
@@ -43,7 +50,7 @@ static void smo_observer(float uAlpha, float uBeta, float iAlpha, float iBeta) {
|
|
|
smo.est_eAlpha_Filted = do_lpf(smo.est_eAlpha_Filted, smo.est_eAlpha, smo.lpf_ceof);
|
|
smo.est_eAlpha_Filted = do_lpf(smo.est_eAlpha_Filted, smo.est_eAlpha, smo.lpf_ceof);
|
|
|
|
|
|
|
|
/* est beta back emf */
|
|
/* est beta back emf */
|
|
|
- float calc_beta = uBeta/smo.motor_ld - smo.IBeta_hat*(smo.motor_r/smo.motor_ld) - smo.est_eBeta / smo.motor_ld + est_ab * smo.Ialpha_hat;
|
|
|
|
|
|
|
+ float calc_beta = (uBeta - smo.IBeta_hat*smo.motor_r - smo.est_eBeta + est_ab * smo.Ialpha_hat) * smo.ld_inv;
|
|
|
smo.IBeta_hat += calc_beta * smo.ts; //积分
|
|
smo.IBeta_hat += calc_beta * smo.ts; //积分
|
|
|
|
|
|
|
|
float err_iBeta = smo.IBeta_hat - iBeta;
|
|
float err_iBeta = smo.IBeta_hat - iBeta;
|
|
@@ -54,6 +61,7 @@ static void smo_observer(float uAlpha, float uBeta, float iAlpha, float iBeta) {
|
|
|
}
|
|
}
|
|
|
#define angle_clamp(a) {while (a >= M_PI*2) a-=M_PI*2;while (a < 0) a +=M_PI*2;};
|
|
#define angle_clamp(a) {while (a >= M_PI*2) a-=M_PI*2;while (a < 0) a +=M_PI*2;};
|
|
|
|
|
|
|
|
|
|
+#define ANGLE_COMP_RPM_CEOF (2.44E-4F)
|
|
|
static void smo_pll(void) {
|
|
static void smo_pll(void) {
|
|
|
float eab_sqr = sqrtf(SQ(smo.est_eAlpha_Filted) + SQ(smo.est_eBeta_Filted) + (1e-10f));
|
|
float eab_sqr = sqrtf(SQ(smo.est_eAlpha_Filted) + SQ(smo.est_eBeta_Filted) + (1e-10f));
|
|
|
float ealpha_in = -smo.est_eAlpha_Filted/eab_sqr;
|
|
float ealpha_in = -smo.est_eAlpha_Filted/eab_sqr;
|
|
@@ -71,8 +79,16 @@ static void smo_pll(void) {
|
|
|
smo.est_rad_pers_filted = do_lpf(smo.est_rad_pers_filted, smo.est_rad_pers, smo.lpf_ceof); //对速度低通滤波
|
|
smo.est_rad_pers_filted = do_lpf(smo.est_rad_pers_filted, smo.est_rad_pers, smo.lpf_ceof); //对速度低通滤波
|
|
|
smo.est_angle += smo.ts * smo.est_rad_pers; //角速度积分
|
|
smo.est_angle += smo.ts * smo.est_rad_pers; //角速度积分
|
|
|
angle_clamp(smo.est_angle);
|
|
angle_clamp(smo.est_angle);
|
|
|
|
|
+ smo.est_rpm = (30.0f * smo.est_rad_pers_filted/M_PI/smo.motor_poles);
|
|
|
|
|
+ if (smo.est_rpm > CONFIG_MAX_MOT_RPM) {
|
|
|
|
|
+ smo.est_rpm = CONFIG_MAX_MOT_RPM;
|
|
|
|
|
+ }else if (smo.est_rpm < 0) {
|
|
|
|
|
+ smo.est_rpm = 0;
|
|
|
|
|
+ }
|
|
|
/* 对低通进行角度补偿 */
|
|
/* 对低通进行角度补偿 */
|
|
|
- smo.est_angle_out = smo.est_angle + fast_arctan2(smo.est_rad_pers_filted, smo.lpf_wc*2*M_PI);
|
|
|
|
|
|
|
+ smo.est_angle_out = smo.est_angle;// + fast_arctan2(smo.est_rad_pers_filted, smo.lpf_wc*2*M_PI);
|
|
|
|
|
+ /* 通过速度对角度再次补偿, ANGLE_COMP_RPM_CEOF 这个值通过校准获取 */
|
|
|
|
|
+ smo.est_angle_out += smo.est_rpm * ANGLE_COMP_RPM_CEOF;
|
|
|
angle_clamp(smo.est_angle_out);
|
|
angle_clamp(smo.est_angle_out);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -83,5 +99,5 @@ float smo_observer_est_angle(void) {
|
|
|
|
|
|
|
|
//机械角度 rpm
|
|
//机械角度 rpm
|
|
|
float smo_observer_est_rpm(void) {
|
|
float smo_observer_est_rpm(void) {
|
|
|
- return (30.0f * smo.est_rad_pers_filted/M_PI/smo.motor_poles);
|
|
|
|
|
|
|
+ return smo.est_rpm;
|
|
|
}
|
|
}
|