Эх сурвалжийг харах

工厂测试,支持相电流采集开启和关闭

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 3 жил өмнө
parent
commit
cf80407556

+ 39 - 1
Applications/app/factory.c

@@ -3,12 +3,38 @@
 #include "prot/can_message.h"
 #include "prot/can_foc_msg.h"
 #include "foc/samples.h"
+#include "foc/motor/current.h"
 #include "libs/utils.h"
 #include "libs/logger.h"
 #include "os/os_task.h"
 
 static u8 factory_mode = 0;
 
+static void stop_pwm_adc(void);
+
+static bool start_pwm_adc(void) {
+	pwm_turn_on_low_side();
+	delay_ms(10);
+	phase_current_offset_calibrate();
+	pwm_start();
+	delay_us(10); //wait for ebrake error
+	adc_start_convert();
+	phase_current_calibrate_wait();
+	if (phase_curr_offset_check()) {
+		stop_pwm_adc();
+		return false;
+	}
+	return true;
+}
+
+static void stop_pwm_adc(void) {
+	u32 mask = cpu_enter_critical();
+	adc_stop_convert();
+	pwm_stop();
+	pwm_up_enable(true);
+	cpu_exit_critical(mask);
+}
+
 void can_process_factory_message(can_message_t *can_message){
 	uint8_t response[32];
 	uint8_t rsplen;
@@ -28,7 +54,7 @@ void can_process_factory_message(can_message_t *can_message){
 			u8 item = decode_u8(can_message->data);
 			if (item == 1) { //3相驱动测试
 				u8 mask = decode_u8((u8 *)can_message->data + 1);
-				pwm_3phase_sides(mask);
+				pwm_3phase_sides(false, mask);
 			}else if (item == 2) {//获取所有电压的采集值
 				can_response_vols(can_message->src, can_message->key);
 				return;
@@ -61,6 +87,18 @@ void can_process_factory_message(can_message_t *can_message){
 				encode_u16(response + 7, uvw_total[2]/20);
 				gpio_phase_u_detect(false);
 				rsplen += 6;
+			}else if (item == 5) { //phase current test
+				u8 start = decode_u8((u8 *)can_message->data + 1);
+				if (start) {
+					pwm_3phase_sides(true, 0); //use pwm output, disable timer break in
+					if (!start_pwm_adc()) {
+						response[2] = 1;
+						break;
+					}
+				}else {
+					stop_pwm_adc();
+					pwm_3phase_init();
+				}
 			}
 			break;
 		}

+ 6 - 1
Applications/bsp/gd32/pwm.c

@@ -42,8 +42,13 @@ void pwm_3phase_init(void){
     _init_pwm_timer(true);
 }
 
-void pwm_3phase_sides(u8 mask) {
+void pwm_3phase_sides(bool pwm, u8 mask) {
 	timer_deinit(MOS_PWM_TIMER);
+	if (pwm) {
+		_pwm_gpio_config();
+		_init_pwm_timer(false);
+		return;
+	}
 	rcu_periph_clock_enable(_rcu_clk(MOS_PWM_TIMER));
     gpio_init(PWM_U_P_GROUP,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,PWM_U_P_PIN);
     gpio_init(PWM_V_P_GROUP,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,PWM_V_P_PIN);

+ 1 - 1
Applications/bsp/gd32/pwm.h

@@ -90,7 +90,7 @@
 #define PWM_Direction_Down() true
 #endif
 void pwm_3phase_init(void);
-void pwm_3phase_sides(u8 mask);
+void pwm_3phase_sides(bool pwm, u8 mask);
 void pwm_start(void);
 void pwm_stop(void);
 void pwm_turn_on_low_side(void);