Procházet zdrojové kódy

加入母线电流的采集

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui před 3 roky
rodič
revize
d0315cac63

+ 17 - 1
Applications/bsp/adc.c

@@ -11,7 +11,7 @@
 #define ADC01_NUM 7
 #define ADC2_NUM 0
 #else
-#define ADC01_NUM (5)
+#define ADC01_NUM (6)
 #define ADC2_NUM 4
 #endif
 #define REG_CHAN_NUM (ADC01_NUM + ADC2_NUM)
@@ -122,6 +122,7 @@ static void adc0_init(void){
 	adc_regular_channel_config(ADC0, 2, U_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
 	adc_regular_channel_config(ADC0, 3, V_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
 	adc_regular_channel_config(ADC0, 4, W_VOL_ADC_CHAN, ADC_REGCHAN_SAMPLE_TIME);
+	adc_regular_channel_config(ADC0, 5, VBUS_I_CHAN, ADC_REGCHAN_SAMPLE_TIME);
 #endif
 #endif
     /* configure ADC regular channel trigger */
@@ -246,6 +247,14 @@ static void adc_gpio_init(void) {
 	/* configure ADC pin, bus voltage sampling -- ADC_IN0(PA0) */
 	gpio_init(VBUS_V_ADC_GROUP, VBUS_V_ADC_MODE, GPIO_OSPEED_50MHZ, VBUS_V_ADC_PIN);
 #endif
+
+#ifdef VBUS_I_ADC_GROUP
+	rcu_periph_clock_enable(VBUS_I_ADC_RCU);
+	/* configure ADC pin, bus voltage sampling -- ADC_IN0(PA0) */
+	gpio_init(VBUS_I_ADC_GROUP, VBUS_I_ADC_MODE, GPIO_OSPEED_50MHZ, VBUS_I_ADC_PIN);
+#endif
+
+
 #ifdef ACC_V_ADC_GROUP
 	rcu_periph_clock_enable(ACC_V_ADC_RCU);
 	/* configure ADC pin, bus voltage sampling -- ADC_IN0(PA0) */
@@ -325,6 +334,13 @@ u16 adc_get_acc(void) {
 #endif
 }
 
+u16 adc_get_ibus(void) {
+#ifdef MC100_HW_V1
+	return adc_buffer[5];
+#else
+	return 0;
+#endif
+}
 
 u16 adc_get_throttle(void) {
 #ifdef MC100_HW_V1

+ 1 - 0
Applications/bsp/adc.h

@@ -131,4 +131,5 @@ void adc_get_uvw_phaseV(u16 *uvw);
 u16 adc_get_mos_temp(void);
 u16 adc_get_mos_temp2(void);
 u16 adc_get_motor_temp(void);
+u16 adc_get_ibus(void);
 #endif /* _ADC_H__ */

+ 4 - 2
Applications/foc/core/PMSM_FOC_Core.c

@@ -380,10 +380,8 @@ void PMSM_FOC_Schedule(void) {
 	pwm_update_duty(gFoc_Ctrl.out.n_Duty[0], gFoc_Ctrl.out.n_Duty[1], gFoc_Ctrl.out.n_Duty[2]);
 	pwm_update_sample(gFoc_Ctrl.out.n_Sample1, gFoc_Ctrl.out.n_Sample2, gFoc_Ctrl.out.n_CPhases);
 
-#ifdef NO_SAMPLE_IDC
 	LowPass_Filter(gFoc_Ctrl.out.s_FilterIdq.d, gFoc_Ctrl.out.s_RealIdq.d, 0.004f);
 	LowPass_Filter(gFoc_Ctrl.out.s_FilterIdq.q, gFoc_Ctrl.out.s_RealIdq.q, 0.004f);
-#endif
 
 	if (gFoc_Ctrl.plot_type != Plot_None) {
 		if (gFoc_Ctrl.ctrl_count % 5 == 0) {
@@ -995,6 +993,7 @@ void PMSM_FOC_Set_PlotType(Plot_t t) {
 }
 //获取母线电流和实际输出电流矢量大小
 void PMSM_FOC_Calc_Current(void) {
+#ifdef NO_SAMPLE_IDC
 	float vd = gFoc_Ctrl.out.s_OutVdq.d;
 	float vq = gFoc_Ctrl.out.s_OutVdq.q;
 
@@ -1010,6 +1009,9 @@ void PMSM_FOC_Calc_Current(void) {
 		id_thr = 100.0f;
 	}
 	float raw_idc = m_pow / get_vbus_float() * (1.0f - 0.2f * id_thr/100.0f);// * 1.5f * 0.66f; //s16q5
+#else
+	float raw_idc = get_vbus_current();
+#endif
 	LowPass_Filter(gFoc_Ctrl.out.s_FilteriDC, raw_idc, 0.1f);
 
 	gFoc_Ctrl.out.s_RealCurrent = sqrtf(SQ(gFoc_Ctrl.out.s_FilterIdq.d) + SQ(gFoc_Ctrl.out.s_FilterIdq.q));

+ 28 - 5
Applications/foc/samples.c

@@ -36,7 +36,9 @@ static samples_t mos_temp1;
 #ifdef ACC_V_CHAN
 static samples_t acc_vol;
 #endif
-
+#ifdef VBUS_I_CHAN
+static samples_t _ibus;
+#endif
 void samples_init(void){
 	_vbus.filted_value = (CONFIG_RATED_DC_VOL);
 	_vbus.value = (CONFIG_RATED_DC_VOL);
@@ -65,20 +67,24 @@ void samples_init(void){
 #endif
 #ifdef MOTOR_TEMP_ADC_CHAN
 	motor_temp.value = motor_temp.filted_value = 0;
-	motor_temp.lowpass = 0.01;
+	motor_temp.lowpass = 0.01f;
 	sample_motor_temp();
 #endif
 #ifdef MOS_TEMP_ADC_CHAN
 	mos_temp.value = mos_temp.filted_value = 0;
-	mos_temp.lowpass = 0.01;
+	mos_temp.lowpass = 0.01f;
 	sample_mos_temp();
 #endif
 #ifdef MOS_TEMP1_ADC_CHAN
 	mos_temp1.value = mos_temp1.filted_value = 0;
-	mos_temp1.lowpass = 0.01;
+	mos_temp1.lowpass = 0.01f;
 	sample_mos_temp();
 #endif
-
+#ifdef VBUS_I_CHAN
+	_ibus.value = _ibus.filted_value = 0;
+	_ibus.lowpass = 0.01f;
+	sample_ibus();
+#endif
 	shark_task_create(sample_task, NULL);
 }
 
@@ -105,6 +111,14 @@ int get_acc_vol(void) {
 #endif
 }
 
+float get_vbus_current(void) {
+#ifdef VBUS_I_CHAN
+	return _ibus.filted_value;
+#else
+	return 0;
+#endif
+}
+
 s16 get_motor_temp(void) {
 	return motor_temp.filted_value;
 }
@@ -129,6 +143,7 @@ float get_throttle_float(void) {
 }
 static u32 sample_task(void *param) {
 	sample_vbus();
+	sample_ibus();
 	sample_throttle();
 	sample_uvw_phase();
 	sample_motor_temp();
@@ -150,6 +165,14 @@ void sample_vbus(void){
 #endif
 }
 
+void sample_ibus(void) {
+#ifdef VBUS_I_CHAN
+	s16 vadc = adc_get_ibus();
+	_ibus.value = (float)vadc * VBUS_I_CEOF;
+	LowPass_Filter(_ibus.filted_value, _ibus.value, _ibus.lowpass);
+#endif
+}
+
 void sample_throttle(void){
 #ifdef THROTTLE_CHAN
 	s16 vadc = adc_get_throttle();

+ 3 - 0
Applications/foc/samples.h

@@ -12,6 +12,7 @@ float get_throttle_float(void);
 void get_phase_vols(float *uvw);
 void sample_uvw_phase(void);
 void sample_vbus(void);
+void sample_ibus(void);
 void sample_throttle(void);
 void sample_motor_temp(void);
 void sample_mos_temp(void);
@@ -19,5 +20,7 @@ s16 get_motor_temp(void);
 s16 get_mos_temp(void);
 int get_acc_vol(void);
 s16 get_mos_temp2(void);
+float get_vbus_current(void);
+
 #endif /* _SAMPLES_H__ */