Browse Source

采集相端电压,然后转换为alphabeta电压

Signed-off-by: kevin <huhui@sharkgulf.com>
kevin 2 years ago
parent
commit
bd7aa38ee1

+ 9 - 1
Applications/bsp/gd32/board_mc105_v3.h

@@ -222,7 +222,15 @@
 #define W_VOL_ADC_PIN 	GPIO_PIN_2
 #define W_VOL_ADC_RCU 	RCU_GPIOA
 #define W_VOL_ADC_MODE 	GPIO_MODE_AIN
-#define UVW_VOL_CEOF (ADC_REFERENCE_VOLTAGE*(41.0f)/ADC_FULL_MAX)
+
+#define PHASE_VOL_R (40*1000.0f)
+#define PHASE_VOL_R1 (1*1000.0f)
+#define PHASE_VOL_C1 (100e-9f) //100nF
+#define PHASE_VOL_Gain  ((PHASE_VOL_R + PHASE_VOL_R1)/PHASE_VOL_R1)
+#define Phase_Vol_LPF_R  ((PHASE_VOL_R * PHASE_VOL_R1)/(PHASE_VOL_R + PHASE_VOL_R1))
+#define PHASE_VOL_LPF_BAND  (1/(2*3.14F*Phase_Vol_LPF_R*PHASE_VOL_C1))
+#define UVW_VOL_CEOF (ADC_REFERENCE_VOLTAGE*PHASE_VOL_Gain/ADC_FULL_MAX)
+
 
 /* 模拟5v电压采集 */
 #define DC5V_ADC_CHAN     ADC_CHANNEL_3 //adc012

+ 31 - 1
Applications/foc/core/controller.c

@@ -213,11 +213,41 @@ static __INLINE void phase_curr_unbal_check(mot_contrl_t *ctrl) {
 		a_max = b_max = c_max = 0;
 	}
 }
-
+#define norm_rad(a) {while (a >= M_PI*2) a-=M_PI*2;while (a < 0) a +=M_PI*2;};
+
+static __INLINE void mot_contrl_update_phase_vol(mot_contrl_t *ctrl) {
+	float phase_vol[3];
+	get_uvw_phases_raw(phase_vol);
+	/* 三相端电压转到alpha-beta轴的相电压 */
+	ctrl->phase_v_ab.a = (2 * phase_vol[0] - phase_vol[1] - phase_vol[2])/3.0f;
+	ctrl->phase_v_ab.b = (phase_vol[1] - phase_vol[2]) * ONE_BY_SQRT3;
+	/* 当前电气频率   除于相电压低通滤波器截止频率 */
+	float We_hz = (ctrl->foc.in.mot_velocity / 60.0f * mc_conf()->m.poles);
+	float w_r_wc = We_hz / PHASE_VOL_LPF_BAND;
+	/* 计算低通滤波器的幅度补偿系数*/
+	float mag_mul = sqrtf(1 + SQ(w_r_wc));
+	ctrl->phase_v_ab.a *= mag_mul;
+	ctrl->phase_v_ab.b *= mag_mul;
+	/* 计算低通相位延时 */
+	float angle_rad = fast_atan_2(We_hz, PHASE_VOL_LPF_BAND);
+	/* 延时半周期*/
+	angle_rad += (We_hz * 2 * M_PI * ctrl->foc.ts / 2);
+	norm_rad(angle_rad);
+	/* 补偿 alpha-beta的相位 */
+	float sin,cos;
+	arm_sin_cos(-pi_2_degree(angle_rad), &sin, &cos);
+	float alpha = ctrl->phase_v_ab.a * cos + ctrl->phase_v_ab.b * sin;
+	float beta  = ctrl->phase_v_ab.b * cos - ctrl->phase_v_ab.a * sin;
+
+	ctrl->phase_v_ab.a = alpha;
+	ctrl->phase_v_ab.b = beta;
+}
 
 bool mot_contrl_update(mot_contrl_t *ctrl) {
 	foc_t *foc = &ctrl->foc;
 
+	mot_contrl_update_phase_vol(ctrl);
+
 	phase_current_get(foc->in.curr_abc);
 	clark(foc->in.curr_abc[0], foc->in.curr_abc[1], foc->in.curr_abc[2], &foc->in.curr_ab);
 

+ 1 - 0
Applications/foc/core/controller.h

@@ -129,6 +129,7 @@ typedef struct{
 	float           target_torque_raw; //扭矩过零点处理前的扭矩
 	dq_t			target_idq;
 	dq_t            out_idq_filterd;
+	albt_t			phase_v_ab; //sampled
 	float 			out_current_vec;
 	u32				ebrk_ramp_time;
 	u32				torque_acc_time;