|
|
@@ -6,10 +6,10 @@
|
|
|
#include "libs/utils.h"
|
|
|
#include "libs/logger.h"
|
|
|
#include "math/fast_math.h"
|
|
|
-static current_samp_t g_cs;
|
|
|
+current_samp_t g_cs;
|
|
|
|
|
|
#define NB_OFFSET_SAMPLES 32
|
|
|
-
|
|
|
+#define SENSOR_SAMPLES 10000
|
|
|
#define Rvbus 0.0005f
|
|
|
#define Gvbus (13.1f) //母线电流的运放
|
|
|
#define Rds_Defualt 0.005f//欧
|
|
|
@@ -29,30 +29,80 @@ ia = -(ib+ic)
|
|
|
*/
|
|
|
void phase_current_init(void) {
|
|
|
current_samp_t *cs = &g_cs;
|
|
|
- cs->offset_sample_count = NB_OFFSET_SAMPLES + 1;
|
|
|
+ cs->sample_count = NB_OFFSET_SAMPLES + 1;
|
|
|
cs->adc_ia = 0;
|
|
|
cs->adc_ib = 0;
|
|
|
cs->adc_ic = 0;
|
|
|
}
|
|
|
|
|
|
-void phase_current_start_cali(void){
|
|
|
+void phase_current_offset_calibrate(void){
|
|
|
g_cs.adc_offset_a = 0;
|
|
|
g_cs.adc_offset_b = 0;
|
|
|
g_cs.adc_offset_c = 0;
|
|
|
|
|
|
phase_current_init();
|
|
|
g_cs.is_calibrating_offset = true;
|
|
|
+#ifdef HIGH_SIDE_CURRENT_SENSOR
|
|
|
+ g_cs.c_phases = PHASE_BC;
|
|
|
+#else
|
|
|
g_cs.c_phases = PHASE_AB;
|
|
|
+#endif
|
|
|
g_cs.c_ignore_phase = IGNORE_NONE;
|
|
|
adc_current_sample_config(g_cs.c_phases);
|
|
|
}
|
|
|
|
|
|
-void phase_current_wait_cali(void) {
|
|
|
- while(g_cs.is_calibrating_offset) {
|
|
|
+void phase_current_calibrate_wait(void) {
|
|
|
+ while(g_cs.is_calibrating_offset || g_cs.is_calibrating_sensor) {
|
|
|
wdog_reload();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#ifdef HIGH_SIDE_CURRENT_SENSOR
|
|
|
+void phase_current_sensor_start_calibrate(float calibrate_current) {
|
|
|
+ bool calibrate = false;
|
|
|
+ if (calibrate_current > 0) {
|
|
|
+ calibrate = true;
|
|
|
+ g_cs.sensor_samples_1 = 0;
|
|
|
+ g_cs.sensor_samples_2 = 0;
|
|
|
+ g_cs.sample_count = SENSOR_SAMPLES;
|
|
|
+ g_cs.calibrate_current = calibrate_current;
|
|
|
+ }
|
|
|
+
|
|
|
+ g_cs.is_calibrating_sensor = calibrate;
|
|
|
+}
|
|
|
+
|
|
|
+bool phase_current_sensor_do_calibrate(void) {
|
|
|
+ current_samp_t *cs = &g_cs;
|
|
|
+ if (!cs->is_calibrating_sensor) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ s32 phase_current1, phase_current2;
|
|
|
+ adc_phase_current_read(cs->c_phases, &phase_current1, &phase_current2);
|
|
|
+ if(cs->c_phases == PHASE_BC) {
|
|
|
+ if (cs->sample_count > 0) {
|
|
|
+ cs->sample_count--;
|
|
|
+ cs->sensor_samples_1 += (phase_current1 - cs->adc_offset_b);
|
|
|
+ cs->sensor_samples_2 += (phase_current2 - cs->adc_offset_c);
|
|
|
+ }else {
|
|
|
+ cs->sensor_samples_1 = cs->sensor_samples_1 / (float)SENSOR_SAMPLES;
|
|
|
+ cs->sensor_samples_2 = cs->sensor_samples_2 / (float)SENSOR_SAMPLES;
|
|
|
+ cs->sensor_k1 = g_cs.calibrate_current/cs->sensor_samples_1;
|
|
|
+ cs->sensor_k2 = g_cs.calibrate_current/cs->sensor_samples_2;
|
|
|
+ cs->is_calibrating_sensor = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return cs->is_calibrating_sensor;
|
|
|
+}
|
|
|
+#else
|
|
|
+void phase_current_sensor_start_calibrate(float calibrate_current) {
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+bool phase_current_sensor_do_calibrate(void) {
|
|
|
+ return false;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
bool phase_current_offset(void) {
|
|
|
current_samp_t *cs = &g_cs;
|
|
|
if (!cs->is_calibrating_offset) {
|
|
|
@@ -60,35 +110,37 @@ bool phase_current_offset(void) {
|
|
|
}
|
|
|
s32 phase_current1 = 0 , phase_current2 = 0;
|
|
|
adc_phase_current_read(cs->c_phases, &phase_current1, &phase_current2);
|
|
|
- if (cs->offset_sample_count == (NB_OFFSET_SAMPLES + 1)) {
|
|
|
- cs->offset_sample_count --;
|
|
|
+ if (cs->sample_count == (NB_OFFSET_SAMPLES + 1)) {
|
|
|
+ cs->sample_count --;
|
|
|
return true;
|
|
|
}
|
|
|
- if (cs->offset_sample_count > 0) {
|
|
|
- cs->offset_sample_count--;
|
|
|
- if (cs->c_phases == PHASE_AB && cs->offset_sample_count >= 0) {
|
|
|
+ if (cs->sample_count > 0) {
|
|
|
+ cs->sample_count--;
|
|
|
+ if (cs->c_phases == PHASE_AB && cs->sample_count >= 0) {
|
|
|
cs->adc_offset_a += phase_current1;
|
|
|
cs->adc_offset_b += phase_current2;
|
|
|
- if (cs->offset_sample_count == 0) {
|
|
|
+ if (cs->sample_count == 0) {
|
|
|
cs->adc_offset_a = cs->adc_offset_a / NB_OFFSET_SAMPLES;
|
|
|
cs->adc_offset_b = cs->adc_offset_b / NB_OFFSET_SAMPLES;
|
|
|
}
|
|
|
}
|
|
|
- if (cs->c_phases == PHASE_BC && cs->offset_sample_count >= 0) {
|
|
|
+ if (cs->c_phases == PHASE_BC && cs->sample_count >= 0) {
|
|
|
cs->adc_offset_c += phase_current2;
|
|
|
- if (cs->offset_sample_count == 0) {
|
|
|
+#ifdef HIGH_SIDE_CURRENT_SENSOR
|
|
|
+ cs->adc_offset_b += phase_current1;
|
|
|
+#endif
|
|
|
+ if (cs->sample_count == 0) {
|
|
|
cs->adc_offset_c = cs->adc_offset_c / NB_OFFSET_SAMPLES;
|
|
|
+#ifdef HIGH_SIDE_CURRENT_SENSOR
|
|
|
+ cs->adc_offset_b = cs->adc_offset_b / NB_OFFSET_SAMPLES;
|
|
|
+#endif
|
|
|
}
|
|
|
}
|
|
|
}else {
|
|
|
if (cs->c_phases == PHASE_AB) {
|
|
|
-#ifdef HIGH_SIDE_CURRENT_SENSOR
|
|
|
- cs->is_calibrating_offset = false;
|
|
|
-#else
|
|
|
cs->c_phases = PHASE_BC;
|
|
|
phase_current_init();
|
|
|
adc_current_sample_config(cs->c_phases);
|
|
|
-#endif
|
|
|
}else {
|
|
|
cs->is_calibrating_offset = false;
|
|
|
sys_debug("offset %d, %d, %d\n", g_cs.adc_offset_a, g_cs.adc_offset_b, g_cs.adc_offset_c);
|
|
|
@@ -181,7 +233,7 @@ void phase_current_point(void *p){
|
|
|
out->n_CPhases = cs->c_phases;
|
|
|
}
|
|
|
#else
|
|
|
-#define LOW_FP_COEF 0.5f
|
|
|
+#define LOW_FP_COEF 0.1f
|
|
|
void phase_current_get(float *iABC){
|
|
|
current_samp_t *cs = &g_cs;
|
|
|
s32 phase_current1, phase_current2;
|
|
|
@@ -270,8 +322,8 @@ void phase_current_point(void *p){
|
|
|
|
|
|
cs->c_ignore_phase = IGNORE_NONE;
|
|
|
#ifdef HIGH_SIDE_CURRENT_SENSOR
|
|
|
- cs->c_phases = PHASE_AB;
|
|
|
- out->n_Sample1 = FOC_PWM_Half_Period - 1;
|
|
|
+ cs->c_phases = PHASE_BC;
|
|
|
+ out->n_Sample1 = FOC_PWM_Half_Period/4;
|
|
|
#else
|
|
|
u16 *duty = out->n_Duty;
|
|
|
u16 max_hi_side = MAX(duty[0], MAX(duty[1], duty[2]));
|