Quellcode durchsuchen

风扇检测

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui vor 3 Jahren
Ursprung
Commit
c3e0566660

+ 1 - 0
Applications/app/app.c

@@ -101,6 +101,7 @@ static u32 _app_report_task(void *p) {
 		sys_debug("Fast: %d - %d, err: %d-%d\n", g_meas_foc.intval_time, g_meas_foc.exec_time, g_meas_foc.intval_hi_err, g_meas_foc.intval_low_err);
 		sys_debug("acc vol %d, mos2 %d\n", get_acc_vol(), get_mos_temp2());
 		sys_debug("throttle %f\n", get_throttle_float());
+		sys_debug("fan rpm %d, %d\n", mc_params()->fan[0].det_ts, mc_params()->fan[1].det_ts);
 		//encoder_log();
 		//err_code_log();
 	}

+ 21 - 0
Applications/bsp/board_mc100_v1.h

@@ -228,6 +228,27 @@
 #define FAN_PWM_TIMER TIMER7
 #define FAN_PWM_CHAN  TIMER_CH_2
 #define FAN_TIMER_RCU  RCU_TIMER7
+
+/* 风扇1检测 */
+#define GPIO_FAN1_IN_GROUP 	GPIOC
+#define GPIO_FAN1_IN_PIN 	GPIO_PIN_10
+#define GPIO_FAN1_IN_RCU 	RCU_GPIOC
+#define GPIO_FAN1_IN_MODE 	GPIO_MODE_IN_FLOATING
+#define GPIO_FAN1_IRQ  EXTI10_15_IRQn
+#define GPIO_FAN1_EXTI EXTI_10
+#define GPIO_FAN1_EXIT_SRC_GROUP GPIO_PORT_SOURCE_GPIOC
+#define GPIO_FAN1_EXIT_SRC_PIN GPIO_PIN_SOURCE_10
+
+/* 风扇2检测 */
+#define GPIO_FAN2_IN_GROUP 	GPIOC
+#define GPIO_FAN2_IN_PIN 	GPIO_PIN_11
+#define GPIO_FAN2_IN_RCU 	RCU_GPIOC
+#define GPIO_FAN2_IN_MODE 	GPIO_MODE_IN_FLOATING
+#define GPIO_FAN2_IRQ  EXTI10_15_IRQn
+#define GPIO_FAN2_EXTI EXTI_11
+#define GPIO_FAN2_EXIT_SRC_GROUP GPIO_PORT_SOURCE_GPIOC
+#define GPIO_FAN2_EXIT_SRC_PIN GPIO_PIN_SOURCE_11
+
 /* 是否用编码器 */
 #define USE_ENCODER_ABI
 

+ 1 - 0
Applications/bsp/bsp.h

@@ -42,6 +42,7 @@
 #define ENC_TIMER_IRQ_PRIORITY 2
 #define ENC_PWM_IRQ_PRIORITY 2
 #define ENC_I_EXIT_IRQ_PRIORITY 2
+#define ENC_OTHER_IRQ_PRIORITY 8
 
 #define THREE_SHUNTS_SAMPLE 1
 #define ONE_SHUNT_SAMPLE 2

+ 9 - 0
Applications/bsp/fan_pwm.c

@@ -61,6 +61,8 @@ void fan_set_duty(u8 duty) {
 	uint16_t chno = FAN_PWM_CHAN;
 	if (duty > 100) {
 		duty = 100;
+	}else if (duty > 0 && duty < 30) {
+		duty = 30;
 	}
 	u32 count = (float)duty * (float)FAN_MAX_DUTY_COUNT / 100.0f;
 	timer_channel_output_pulse_value_config(FAN_PWM_TIMER,chno, count);
@@ -72,3 +74,10 @@ void fan_set_duty(u8 duty) {
 }
 
 
+bool fan_pwm_is_running(void) {
+	if (TIMER_CCHP(FAN_PWM_TIMER) & (uint32_t)TIMER_CCHP_POEN) {
+		return true;
+	}
+	return false;
+}
+

+ 3 - 0
Applications/bsp/fan_pwm.h

@@ -9,10 +9,13 @@
 void fan_pwm_init(void);
 void fan_stop(void);
 void fan_set_duty(u8 duty); //duty 0-100
+bool fan_pwm_is_running(void);
 #else
 static void fan_pwm_init(void) {}
 static void fan_stop(void) {}
 static void fan_set_duty(u8 duty) {}
+bool fan_pwm_is_running(void){return false;}
+
 #endif
 #endif /* _FAN_PWM_H__ */
 

+ 28 - 2
Applications/bsp/gpio.c

@@ -55,7 +55,7 @@ void gpio_beep(u32 ms) {
 #endif
 }
 
-void mc_brk_gpio_init(void) {
+void gpio_mc_brk_init(void) {
 #ifdef GPIO_BRAKE_IN_GROUP
 	rcu_periph_clock_enable(GPIO_BRAKE_IN_RCU);
 	gpio_init(GPIO_BRAKE_IN_GROUP, GPIO_BRAKE_IN_MODE, GPIO_OSPEED_50MHZ, GPIO_BRAKE_IN_PIN);
@@ -85,6 +85,27 @@ void gpio_mlock_init(void) {
 #endif
 }
 
+void gpio_fan_det_init(void) {
+#ifdef GPIO_FAN1_IN_GROUP
+	rcu_periph_clock_enable(GPIO_FAN1_IN_RCU);
+	gpio_init(GPIO_FAN1_IN_GROUP, GPIO_FAN1_IN_MODE, GPIO_OSPEED_50MHZ, GPIO_FAN1_IN_PIN);
+	gpio_exti_source_select(GPIO_FAN1_EXIT_SRC_GROUP, GPIO_FAN1_EXIT_SRC_PIN);
+	exti_init(GPIO_FAN1_EXTI, EXTI_INTERRUPT, EXTI_TRIG_RISING);
+	nvic_irq_enable(GPIO_FAN1_IRQ, ENC_OTHER_IRQ_PRIORITY, 0U);
+	exti_interrupt_flag_clear(GPIO_FAN1_EXTI);
+	exti_interrupt_enable(GPIO_FAN1_EXTI);
+#endif
+#ifdef GPIO_FAN2_IN_GROUP
+	rcu_periph_clock_enable(GPIO_FAN2_IN_RCU);
+	gpio_init(GPIO_FAN2_IN_GROUP, GPIO_FAN2_IN_MODE, GPIO_OSPEED_50MHZ, GPIO_FAN2_IN_PIN);
+	gpio_exti_source_select(GPIO_FAN2_EXIT_SRC_GROUP, GPIO_FAN2_EXIT_SRC_PIN);
+	exti_init(GPIO_FAN2_EXTI, EXTI_INTERRUPT, EXTI_TRIG_RISING);
+	nvic_irq_enable(GPIO_FAN2_IRQ, ENC_OTHER_IRQ_PRIORITY, 0U);
+	exti_interrupt_flag_clear(GPIO_FAN2_EXTI);
+	exti_interrupt_enable(GPIO_FAN2_EXTI);
+#endif
+}
+
 void gpio_phase_u_detect(bool enable) {
 #ifdef GPIO_UDEC_OUT_GROUP
 	if (enable) {
@@ -104,7 +125,8 @@ void gpio_phase_u_detect(bool enable) {
 
 void mc_gpio_init(void) {
 	gpio_mlock_init();
-	mc_brk_gpio_init();
+	gpio_mc_brk_init();
+	gpio_fan_det_init();
 }
 
 bool mc_get_gpio_brake(void) {
@@ -121,7 +143,11 @@ bool mc_get_gpio_brake1(void) {
 
 
 bool gpio_motor_locked(void) {
+#ifdef GPIO_MLOCK_IN_GROUP
 	return gpio_input_bit_get(GPIO_MLOCK_IN_GROUP, GPIO_MLOCK_IN_PIN) == RESET;
+#else
+	return false;
+#endif
 }
 
 void gpio_ir2136_enable(bool enable) {

+ 10 - 0
Applications/bsp/mc_irqs.c

@@ -96,6 +96,10 @@ __weak void ABI_I_IRQHandler(void) {
 
 }
 
+__weak void Fan_IRQHandler(int idx) {
+
+}
+
 void ADC0_1_IRQHandler(void)
 {
 	ADC_IRQHandler();
@@ -186,9 +190,15 @@ void EXTI5_9_IRQHandler(void){
 void EXTI10_15_IRQHandler(void){
 	if(RESET != exti_interrupt_flag_get(EXTI_10)){
 		exti_interrupt_flag_clear(EXTI_10);
+#if (GPIO_FAN1_EXTI==EXTI_10)
+		Fan_IRQHandler(0);
+#endif
 	}
 	if(RESET != exti_interrupt_flag_get(EXTI_11)){
 		exti_interrupt_flag_clear(EXTI_11);
+#if (GPIO_FAN2_EXTI==EXTI_11)
+		Fan_IRQHandler(1);
+#endif
 	}	
 	if(RESET != exti_interrupt_flag_get(EXTI_12)){
 		exti_interrupt_flag_clear(EXTI_12);

+ 14 - 0
Applications/foc/motor/motor.c

@@ -349,6 +349,10 @@ bool mc_start_epm_move(EPM_Dir_t dir, bool is_command) {
 
 void mc_set_fan_duty(u8 duty) {
 	sys_debug("fan duty %d\n", duty);
+	if (!fan_pwm_is_running() && duty > 0) {
+		motor.fan[0].start_ts = get_tick_ms();
+		motor.fan[1].start_ts = get_tick_ms();
+	}
 	fan_set_duty(duty);
 }
 
@@ -599,6 +603,16 @@ static bool mc_is_hwbrake(void) {
 	return false;
 }
 
+void Fan_IRQHandler(int idx) {
+	fan_t *fan = motor.fan + idx;
+	u32 pre_ts = fan->det_ts;
+	u32 delta_ts = get_delta_ms(pre_ts);
+	fan->det_ts = get_tick_ms();
+	float rpm = 60.0f * 1000 / (float)delta_ts;
+
+	LowPass_Filter(fan->rpm, rpm, 0.1f);
+}
+
 void MC_Brake_IRQHandler(void) {
 
 	if (mc_is_hwbrake()) {

+ 9 - 0
Applications/foc/motor/motor.h

@@ -6,6 +6,14 @@
 #include "foc/motor/encoder.h"
 #include "app/nv_storage.h"
 
+typedef struct {
+	bool running;
+	u32  start_ts;
+	u32  det_ts;
+	u32  rpm;
+	bool error;
+}fan_t;
+
 typedef struct {
 	bool   b_start;
 	float  throttle;
@@ -32,6 +40,7 @@ typedef struct {
 	u32    n_autohold_time;
 	bool   b_wait_brk_release;
 	bool   b_updated;
+	fan_t  fan[2];
 }motor_t;
 
 motor_t * mc_params(void);