Просмотр исходного кода

解决hall模式,轻微给油再慢慢加大油门概率不动的问题

Signed-off-by: kevin <huhui@sharkgulf.com>
kevin 2 лет назад
Родитель
Сommit
82436b45fe
2 измененных файлов с 8 добавлено и 3 удалено
  1. 7 3
      Applications/foc/motor/hall.c
  2. 1 0
      Applications/foc/motor/hall.h

+ 7 - 3
Applications/foc/motor/hall.c

@@ -126,7 +126,7 @@ void hall_init(void) {
 	g_hall.samples.index = 0;
 	g_hall.samples.filled = 0;
 	g_hall.elec_angle_vel = 0;
-	g_hall.prev_dir = g_hall.dir = POSITIVE;
+	g_hall.dir_set = g_hall.prev_dir = g_hall.dir = POSITIVE;
 	g_min_delta = 1000000 * 100;
 	for (int i = 0; i < SAMPLE_MAX_COUNT; i++) {
 		g_hall.samples.ticks[i] = HALL_MAX_TIME;
@@ -141,10 +141,10 @@ void hall_init(void) {
 }
 
 void  hall_set_direction(s8 dir) {
-	if (dir == g_hall.dir) {
+	if (dir == g_hall.dir_set) {
 		return;
 	}
-	g_hall.dir = g_hall.prev_dir = dir;
+	g_hall.dir_set = g_hall.dir = g_hall.prev_dir = dir;
 	hall_init_low_pos();
 }
 
@@ -244,6 +244,10 @@ float hall_update_elec_angle(void) {
 		g_hall.elec_angle_vel = g_hall.elec_angle_vel * 0.95f;
 		if (g_hall.elec_angle_vel < 30) {
 			g_hall.elec_angle_vel = 0;
+			g_hall.samples.filled = 0;
+			g_hall.samples.index = 0;
+			g_hall.dir = g_hall.prev_dir = g_hall.dir_set;
+			hall_init_low_pos();
 		}
 		float velocity_raw = g_hall.elec_angle_vel/PHASE_360_DEGREE/g_hall.mot_poles * 60.0f * g_hall.dir;
 		g_hall.velocity_filted = velocity_raw;

+ 1 - 0
Applications/foc/motor/hall.h

@@ -33,6 +33,7 @@ typedef struct {
 	float			low_res_pos; //每个霍尔中断更新一次,60度
 	s8				dir;
 	s8				prev_dir;
+	s8				dir_set;
 	u32				edge_ticks;
 	u32				last_delta_ticks;
 	float			elec_angle; //经过插值的高分辨率角度