|
@@ -13,13 +13,19 @@
|
|
|
//#define USE_DETECTED_ANGLE 1
|
|
//#define USE_DETECTED_ANGLE 1
|
|
|
|
|
|
|
|
#define HALL_READ_TIMES 5
|
|
#define HALL_READ_TIMES 5
|
|
|
-#define SMOOTH_COUNT 10.0F
|
|
|
|
|
|
|
+#define SMOOTH_COUNT 50.0F
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
1,5,4,6,2,3
|
|
1,5,4,6,2,3
|
|
|
0,1,2,3,4,5
|
|
0,1,2,3,4,5
|
|
|
|
|
+//////
|
|
|
|
|
+2,6,4,5,1,3
|
|
|
|
|
+0,1,2,3,4,5
|
|
|
|
|
+////
|
|
|
|
|
+2,3,1,5,4,6
|
|
|
|
|
+0,1,2,3,4,5
|
|
|
*/
|
|
*/
|
|
|
-static s8 hall_2_pos[] = {7,0,4,5,2,1,3,7};
|
|
|
|
|
|
|
+static s8 hall_2_pos[] = {7,2,0,1,4,3,5,7};
|
|
|
static hall_t g_hall;
|
|
static hall_t g_hall;
|
|
|
|
|
|
|
|
measure_time_t g_meas_hall = {.exec_max_time = 6,};
|
|
measure_time_t g_meas_hall = {.exec_max_time = 6,};
|
|
@@ -32,25 +38,19 @@ measure_time_t g_meas_hall = {.exec_max_time = 6,};
|
|
|
static u8 __INLINE hall_read_state(void) {
|
|
static u8 __INLINE hall_read_state(void) {
|
|
|
u8 hall_a = 0, hall_b = 0, hall_c = 0;
|
|
u8 hall_a = 0, hall_b = 0, hall_c = 0;
|
|
|
for (int i = 0; i < HALL_READ_TIMES; i++) {
|
|
for (int i = 0; i < HALL_READ_TIMES; i++) {
|
|
|
- if (gpio_hall_a_value()) {
|
|
|
|
|
- hall_a++;
|
|
|
|
|
- }
|
|
|
|
|
- if (gpio_hall_b_value()) {
|
|
|
|
|
- hall_b++;
|
|
|
|
|
- }
|
|
|
|
|
- if (gpio_hall_c_value()) {
|
|
|
|
|
- hall_c++;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ hall_a += gpio_hall_a_value();
|
|
|
|
|
+ hall_b += gpio_hall_b_value();
|
|
|
|
|
+ hall_c += gpio_hall_c_value();
|
|
|
}
|
|
}
|
|
|
u8 state = 0;
|
|
u8 state = 0;
|
|
|
if (hall_a > (HALL_READ_TIMES/2 + 1)) {
|
|
if (hall_a > (HALL_READ_TIMES/2 + 1)) {
|
|
|
- state = 1<<2;
|
|
|
|
|
|
|
+ state = 1;
|
|
|
}
|
|
}
|
|
|
if (hall_b > (HALL_READ_TIMES/2 + 1)) {
|
|
if (hall_b > (HALL_READ_TIMES/2 + 1)) {
|
|
|
state = state | (1<<1);
|
|
state = state | (1<<1);
|
|
|
}
|
|
}
|
|
|
if (hall_c > (HALL_READ_TIMES/2 + 1)) {
|
|
if (hall_c > (HALL_READ_TIMES/2 + 1)) {
|
|
|
- state = state | 1;
|
|
|
|
|
|
|
+ state = state | (1 << 2);
|
|
|
}
|
|
}
|
|
|
return state;
|
|
return state;
|
|
|
}
|
|
}
|
|
@@ -64,7 +64,7 @@ static void hall_init_low_pos(void) {
|
|
|
}
|
|
}
|
|
|
g_hall.state = state;
|
|
g_hall.state = state;
|
|
|
g_hall.prev_dir = g_hall.dir = POSITIVE;
|
|
g_hall.prev_dir = g_hall.dir = POSITIVE;
|
|
|
- g_hall.low_res_pos = pos + 0.5f - g_hall.phase_offset/PHASE_60_DEGREE;
|
|
|
|
|
|
|
+ g_hall.low_res_pos = pos + 0.5f;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -190,7 +190,7 @@ float hall_update_elec_angle(void) {
|
|
|
float delta_angle = delta_pos * PHASE_60_DEGREE;
|
|
float delta_angle = delta_pos * PHASE_60_DEGREE;
|
|
|
float elec_smooth_angle;
|
|
float elec_smooth_angle;
|
|
|
if (g_hall.angle_smooth_cnt < (SMOOTH_COUNT + 1)) {
|
|
if (g_hall.angle_smooth_cnt < (SMOOTH_COUNT + 1)) {
|
|
|
- elec_smooth_angle = g_hall.delta_angle_edge + g_hall.angle_smooth_step * g_hall.angle_smooth_cnt + delta_angle;
|
|
|
|
|
|
|
+ elec_smooth_angle = g_hall.elec_angle_edge + g_hall.angle_smooth_step * g_hall.angle_smooth_cnt + delta_angle;
|
|
|
g_hall.angle_smooth_cnt++;
|
|
g_hall.angle_smooth_cnt++;
|
|
|
if (g_hall.angle_smooth_step >= 0) {
|
|
if (g_hall.angle_smooth_step >= 0) {
|
|
|
elec_smooth_angle = min(elec_smooth_angle, elec_angle);
|
|
elec_smooth_angle = min(elec_smooth_angle, elec_angle);
|
|
@@ -225,7 +225,7 @@ static void hall_calc_mot_velocity(u32 prev_ticks) {
|
|
|
float elec_vel;
|
|
float elec_vel;
|
|
|
if (g_hall.b_trns_det) {
|
|
if (g_hall.b_trns_det) {
|
|
|
elec_vel = PHASE_60_DEGREE/(us_2_s(delta_cnt));
|
|
elec_vel = PHASE_60_DEGREE/(us_2_s(delta_cnt));
|
|
|
- LowPass_Filter(g_hall.elec_angle_vel, elec_vel, 1.0f);
|
|
|
|
|
|
|
+ LowPass_Filter(g_hall.elec_angle_vel, elec_vel, 0.5f);
|
|
|
}else {
|
|
}else {
|
|
|
g_hall.elec_angle_vel = hall_elec_angle_vel();
|
|
g_hall.elec_angle_vel = hall_elec_angle_vel();
|
|
|
}
|
|
}
|