|
|
@@ -13,13 +13,13 @@
|
|
|
|
|
|
//#define USE_DETECTED_ANGLE 1
|
|
|
|
|
|
-#define HALL_READ_TIMES 3
|
|
|
+#define HALL_READ_TIMES 9
|
|
|
|
|
|
static u32 _hall_detect_task(void *args);
|
|
|
static void _hall_init_el_angle(void);
|
|
|
|
|
|
|
|
|
-#define HALL_PLACE_OFFSET (315 << 19) //(345) //315
|
|
|
+#define HALL_PLACE_OFFSET (230 << 19) //(345) //315
|
|
|
/*
|
|
|
4,5,1,3,2,6,4
|
|
|
*/
|
|
|
@@ -77,7 +77,7 @@ static bool __inline _hall_data_empty(void) {
|
|
|
|
|
|
static void hall_sensor_default(void) {
|
|
|
memset(&_sensor_hander, 0, sizeof(_sensor_hander));
|
|
|
- _sensor_hander.phase_offset = 0;//HALL_PLACE_OFFSET;//mc_config_get()->hall_offset;
|
|
|
+ _sensor_hander.phase_offset = HALL_PLACE_OFFSET;//mc_config_get()->hall_offset;
|
|
|
memcpy((char *)_sensor_hander.angle_table, (char *)mc_config_get()->hall_table, sizeof(_sensor_hander.angle_table));
|
|
|
_hall_init_el_angle();
|
|
|
hall_debug_log();
|
|
|
@@ -112,16 +112,19 @@ s16q5_t hall_sensor_get_theta(void){
|
|
|
_sensor_hander.estimate_time_ticks = us_now;
|
|
|
s32q19_t angle_step = _sensor_hander.estimate_el_speed * us_2_s(us_delta);
|
|
|
_sensor_hander.estimate_delta_angle += angle_step;
|
|
|
-
|
|
|
+ if (_sensor_hander.estimate_delta_angle >= _sensor_hander.next_delta_angle) {
|
|
|
+ _sensor_hander.estimate_delta_angle = _sensor_hander.next_delta_angle;
|
|
|
+ }
|
|
|
+ s32q19_t el_angle = 0;
|
|
|
if (_sensor_hander.direction == POSITIVE) {
|
|
|
- _sensor_hander.estimate_el_angle += angle_step;
|
|
|
+ el_angle = _sensor_hander.estimate_el_angle + _sensor_hander.estimate_delta_angle;
|
|
|
}else {
|
|
|
- _sensor_hander.estimate_el_angle -= angle_step;
|
|
|
+ el_angle = _sensor_hander.estimate_el_angle - _sensor_hander.estimate_delta_angle;
|
|
|
}
|
|
|
|
|
|
- rand_angle(_sensor_hander.estimate_el_angle);
|
|
|
+ rand_angle(el_angle);
|
|
|
|
|
|
- return (_sensor_hander.estimate_el_angle >> 14);
|
|
|
+ return (el_angle >> 14);
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -257,7 +260,9 @@ static s32 _hall_position(u8 state_now, u8 state_prev) {
|
|
|
_sensor_hander.sensor_error ++;
|
|
|
return 0xFFFFFFFF;
|
|
|
}
|
|
|
- rand_angle(theta_now);
|
|
|
+ if (theta_now != 0xFFFFFFFF) {
|
|
|
+ rand_angle(theta_now);
|
|
|
+ }
|
|
|
return theta_now;
|
|
|
}
|
|
|
|
|
|
@@ -303,7 +308,6 @@ static __inline u8 _next_hall(u8 hall_now) {
|
|
|
default: //not reached here
|
|
|
return STATE_1;
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -330,8 +334,6 @@ void HALL_IRQHandler(void) {
|
|
|
u8 hall_stat_prev = _sensor_hander.hall_stat;
|
|
|
u32 hall_ticks_now = timer_count32_get();
|
|
|
|
|
|
- //plot_2data16(hall_stat_now*50, _g_hall_angle);
|
|
|
-
|
|
|
/*获取当前转子角度*/
|
|
|
s32 theta_now = _hall_position(hall_stat_now, hall_stat_prev);
|
|
|
if (theta_now == 0xFFFFFFFF) {
|
|
|
@@ -351,7 +353,7 @@ void HALL_IRQHandler(void) {
|
|
|
s32 next_delta_angle = delta_angle;
|
|
|
#endif
|
|
|
s32 delta_time = us_2_s(delta_us);
|
|
|
- s32 prev_imme_el_speed = _sensor_hander.immediately_el_speed;
|
|
|
+ s32 prev_imme_el_speed = _sensor_hander.immediately_el_speed + 1;
|
|
|
_sensor_hander.immediately_el_speed = delta_angle/delta_time; //s32q5
|
|
|
s32 delta_el_speed = abs(_sensor_hander.immediately_el_speed - prev_imme_el_speed);
|
|
|
if (delta_el_speed*100/prev_imme_el_speed >= 20) { //即时速度增加10%,认为不稳定,需要使用即时速度估计转子位置
|
|
|
@@ -362,21 +364,35 @@ void HALL_IRQHandler(void) {
|
|
|
_hall_put_sample(delta_us, delta_angle);
|
|
|
os_disable_irq();
|
|
|
_sensor_hander.el_speed = _hall_angle_speed(); //s32q5
|
|
|
- _sensor_hander.estimate_delta_angle = _sensor_hander.estimate_delta_angle - delta_angle;
|
|
|
- /*通过上次预估的转子位置,对当前的预估速度进行补偿*/
|
|
|
- s32q14_t est_el_speed = ((next_delta_angle - _sensor_hander.estimate_delta_angle)<<9)/delta_angle * _sensor_hander.el_speed;
|
|
|
- if (_sensor_hander.trns_detect) { //s32q14
|
|
|
- est_el_speed = ((next_delta_angle - _sensor_hander.estimate_delta_angle)<<9)/delta_angle * _sensor_hander.immediately_el_speed;
|
|
|
+ s32q14_t est_el_speed = 0;
|
|
|
+#if 0
|
|
|
+
|
|
|
+ if (_sensor_hander.samples.full) {
|
|
|
+ s32 estimate_delta_angle = _sensor_hander.estimate_delta_angle - _sensor_hander.next_delta_angle;
|
|
|
+ //plot_1data16(estimate_delta_angle>>19);
|
|
|
+ /*通过上次预估的转子位置,对当前的预估速度进行补偿*/
|
|
|
+ s32 delta_ration = estimate_delta_angle/(_sensor_hander.next_delta_angle >> 5); //q5
|
|
|
+ est_el_speed = (delta_ration * _sensor_hander.el_speed)>>5 + _sensor_hander.el_speed;
|
|
|
+ if (_sensor_hander.trns_detect) { //s32q14
|
|
|
+ est_el_speed = (delta_ration * _sensor_hander.immediately_el_speed)>>5 + _sensor_hander.immediately_el_speed;
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ est_el_speed = _sensor_hander.el_speed;
|
|
|
}
|
|
|
+#else
|
|
|
+ est_el_speed = _sensor_hander.el_speed;
|
|
|
+#endif
|
|
|
//s32q5
|
|
|
- _sensor_hander.estimate_el_speed = est_el_speed >> 9;
|
|
|
+ _sensor_hander.estimate_el_speed = est_el_speed;
|
|
|
_sensor_hander.next_delta_angle = next_delta_angle;
|
|
|
- //_sensor_hander.measured_el_angle = theta_now;
|
|
|
+ _sensor_hander.measured_el_angle = theta_now;
|
|
|
+ _sensor_hander.estimate_el_angle = theta_now;
|
|
|
+ _sensor_hander.estimate_delta_angle = 0;
|
|
|
os_enable_irq();
|
|
|
_sensor_hander.hall_stat = hall_stat_now;
|
|
|
_sensor_hander.hall_ticks = hall_ticks_now;
|
|
|
_sensor_hander.rpm = _sensor_hander.el_speed / 360 * 60; //s32q5
|
|
|
-
|
|
|
+ //plot_3data16(_sensor_hander.rpm >> 5, (_sensor_hander.immediately_el_speed/6) >> 5, (_sensor_hander.estimate_el_speed/6)>>5);
|
|
|
time_measure_end(&g_meas_hall);
|
|
|
}
|
|
|
|