|
|
@@ -42,8 +42,8 @@ void phase_current_start_cali(void){
|
|
|
|
|
|
phase_current_init();
|
|
|
g_cs.is_calibrating_offset = true;
|
|
|
- g_cs.sector = SECTOR_5;
|
|
|
- adc_current_sample_config(g_cs.sector);
|
|
|
+ g_cs.c_phases = PHASE_AB;
|
|
|
+ adc_current_sample_config(g_cs.c_phases);
|
|
|
}
|
|
|
|
|
|
void phase_current_wait_cali(void) {
|
|
|
@@ -54,36 +54,36 @@ void phase_current_wait_cali(void) {
|
|
|
|
|
|
bool phase_current_offset(void) {
|
|
|
current_samp_t *cs = &g_cs;
|
|
|
- if (!g_cs.is_calibrating_offset) {
|
|
|
+ if (!cs->is_calibrating_offset) {
|
|
|
return false;
|
|
|
}
|
|
|
s32 phase_current1 = 0 , phase_current2 = 0;
|
|
|
- adc_phase_current_read(cs->sector, &phase_current1, &phase_current2);
|
|
|
+ adc_phase_current_read(cs->c_phases, &phase_current1, &phase_current2);
|
|
|
if (cs->offset_sample_count == (NB_OFFSET_SAMPLES + 1)) {
|
|
|
cs->offset_sample_count --;
|
|
|
return true;
|
|
|
}
|
|
|
if (cs->offset_sample_count > 0) {
|
|
|
cs->offset_sample_count--;
|
|
|
- if (cs->sector == SECTOR_5 && cs->offset_sample_count >= 0) {
|
|
|
- cs->adc_offset_b += phase_current1;
|
|
|
- cs->adc_offset_a += phase_current2;
|
|
|
+ if (cs->c_phases == PHASE_AB && cs->offset_sample_count >= 0) {
|
|
|
+ cs->adc_offset_a += phase_current1;
|
|
|
+ cs->adc_offset_b += phase_current2;
|
|
|
if (cs->offset_sample_count == 0) {
|
|
|
- cs->adc_offset_b = cs->adc_offset_b / NB_OFFSET_SAMPLES;
|
|
|
cs->adc_offset_a = cs->adc_offset_a / NB_OFFSET_SAMPLES;
|
|
|
+ cs->adc_offset_b = cs->adc_offset_b / NB_OFFSET_SAMPLES;
|
|
|
}
|
|
|
}
|
|
|
- if (cs->sector == SECTOR_1 && cs->offset_sample_count >= 0) {
|
|
|
+ if (cs->c_phases == PHASE_BC && cs->offset_sample_count >= 0) {
|
|
|
cs->adc_offset_c += phase_current2;
|
|
|
if (cs->offset_sample_count == 0) {
|
|
|
cs->adc_offset_c = cs->adc_offset_c / NB_OFFSET_SAMPLES;
|
|
|
}
|
|
|
}
|
|
|
}else {
|
|
|
- if (cs->sector == SECTOR_5) {
|
|
|
- cs->sector = SECTOR_1;
|
|
|
+ if (cs->c_phases == PHASE_AB) {
|
|
|
+ cs->c_phases = PHASE_BC;
|
|
|
phase_current_init();
|
|
|
- adc_current_sample_config(cs->sector);
|
|
|
+ adc_current_sample_config(cs->c_phases);
|
|
|
}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);
|
|
|
@@ -93,26 +93,26 @@ bool phase_current_offset(void) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-#define LowPass_filter 1.0f
|
|
|
+#define LowPass_filter S16Q14(1)
|
|
|
void phase_current_get(s16 *iABC){
|
|
|
current_samp_t *cs = &g_cs;
|
|
|
s32 phase_current1, phase_current2;
|
|
|
|
|
|
- adc_phase_current_read(cs->sector, &phase_current1, &phase_current2);
|
|
|
+ adc_phase_current_read(cs->c_phases, &phase_current1, &phase_current2);
|
|
|
|
|
|
- if (cs->sector == SECTOR_4 || cs->sector == SECTOR_5) {
|
|
|
+ if (cs->c_phases == PHASE_AB) {
|
|
|
/* Current on Phase C is not accessible */
|
|
|
/* Ia = PhaseAOffset - ADC converted value) */
|
|
|
- cs->adc_ib = (phase_current1 - cs->adc_offset_b);
|
|
|
- cs->adc_ia = (phase_current2 - cs->adc_offset_a);
|
|
|
+ cs->adc_ia = (phase_current1 - cs->adc_offset_a);
|
|
|
+ cs->adc_ib = (phase_current2 - cs->adc_offset_b);
|
|
|
cs->adc_ic = -(cs->adc_ia + cs->adc_ib);
|
|
|
- }else if (cs->sector == SECTOR_1 || cs->sector == SECTOR_6) {
|
|
|
+ }else if (cs->c_phases == PHASE_BC) {
|
|
|
/* Current on Phase A is not accessible */
|
|
|
/* Ib = PhaseBOffset - ADC converted value) */
|
|
|
cs->adc_ib = (phase_current1 - cs->adc_offset_b);
|
|
|
cs->adc_ic = (phase_current2 - cs->adc_offset_c);
|
|
|
cs->adc_ia = -(cs->adc_ib + cs->adc_ic);
|
|
|
- }else if (cs->sector == SECTOR_2 || cs->sector == SECTOR_3) {
|
|
|
+ }else if (cs->c_phases == PHASE_AC) {
|
|
|
/* Current on Phase B is not accessible */
|
|
|
/* Ia = PhaseAOffset - ADC converted value) */
|
|
|
cs->adc_ia = (phase_current1 - cs->adc_offset_a);
|
|
|
@@ -124,7 +124,7 @@ void phase_current_get(s16 *iABC){
|
|
|
iABC[2] = S16_mul(cs->adc_ic, ADC_TO_CURR_ceof, 9);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+#if 0
|
|
|
void phase_current_point(void *p){
|
|
|
FOC_OutP *out = p;
|
|
|
current_samp_t *cs = &g_cs;
|
|
|
@@ -133,34 +133,94 @@ void phase_current_point(void *p){
|
|
|
cs->sector = out->n_Sector;
|
|
|
out->n_Sample1 = FOC_PWM_Half_Period + 1;
|
|
|
out->n_Sample2 = FOC_PWM_Half_Period + 1;
|
|
|
+ s16 potest = 7;
|
|
|
/*底边开mos的时间是2倍的 low_side_low_duty(一个周期)*/
|
|
|
if (low_side_low_duty * 2 >= TSampleMIN) { //可以采样
|
|
|
if (low_side_low_duty >= (TADC + TDead)) {//可以在pwm的中心点采样
|
|
|
out->n_Sample1 = FOC_PWM_Half_Period - 1;
|
|
|
cs->sector = SECTOR_1;
|
|
|
+ potest = 1;
|
|
|
}else {
|
|
|
u32 Samp_p = out->n_lowDuty + TSampleBefore;
|
|
|
if (Samp_p >= FOC_PWM_Half_Period) { //需要在pwm中心点过后采样,需要配置PWM0模式
|
|
|
out->n_Sample2 = ( 2u * FOC_PWM_Half_Period ) - Samp_p - (uint16_t) 1;
|
|
|
+ potest = 2;
|
|
|
}else {
|
|
|
out->n_Sample1 = Samp_p;
|
|
|
+ potest = 3;
|
|
|
}
|
|
|
}
|
|
|
}else if (low_side_mid_duty * 2 >= TSampleMIN){
|
|
|
if (low_side_mid_duty >= (TADC + TDead)) {//可以在pwm的中心点采样
|
|
|
out->n_Sample1 = FOC_PWM_Half_Period - 1;
|
|
|
+ potest = 4;
|
|
|
}else {
|
|
|
u32 Samp_p = out->n_midDuty + TSampleBefore;
|
|
|
if (Samp_p >= FOC_PWM_Half_Period) { //需要在pwm中心点过后采样,需要配置PWM0模式
|
|
|
out->n_Sample2 = ( 2u * FOC_PWM_Half_Period ) - Samp_p - (uint16_t) 1;
|
|
|
+ potest = 5;
|
|
|
}else {
|
|
|
out->n_Sample1 = Samp_p;
|
|
|
+ potest = 6;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ plot_1data16(potest);
|
|
|
out->n_Sector = cs->sector;
|
|
|
}
|
|
|
+#else
|
|
|
+static __inline__ s16 get_mid_duty(u32 max_hi_side, FOC_OutP *out) {
|
|
|
+ u32 min_low_side = FOC_PWM_Half_Period - max_hi_side;
|
|
|
+ if (min_low_side >= MAX(TSampleBefore, TADC)) { //可以采样
|
|
|
+ if ((min_low_side > TSampleBefore) && (min_low_side > TADC)) {
|
|
|
+ out->n_Sample1 = FOC_PWM_Half_Period - 1;
|
|
|
+ return 0;
|
|
|
+ }else {
|
|
|
+ u32 Samp_p = max_hi_side + TSampleBefore;
|
|
|
+ if (Samp_p >= FOC_PWM_Half_Period) { //需要在pwm中心点过后采样,需要配置PWM0模式
|
|
|
+ out->n_Sample2 = ( 2u * FOC_PWM_Half_Period ) - Samp_p - (uint16_t) 1;
|
|
|
+ return 1;
|
|
|
+ }else {
|
|
|
+ out->n_Sample1 = Samp_p;
|
|
|
+ return 2;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+void phase_current_point(void *p){
|
|
|
+ FOC_OutP *out = p;
|
|
|
+ current_samp_t *cs = &g_cs;
|
|
|
+ u32 max_hi_side = MAX(out->n_Duty[0], MAX(out->n_Duty[1], out->n_Duty[2]));
|
|
|
+
|
|
|
+ out->n_Sample1 = FOC_PWM_Half_Period + 1;
|
|
|
+ out->n_Sample2 = FOC_PWM_Half_Period + 1;
|
|
|
+
|
|
|
+ if (get_mid_duty(max_hi_side, out) == -1) {
|
|
|
+ u32 mid_hi_side;
|
|
|
+ out->n_Sample1 = FOC_PWM_Half_Period + 1;
|
|
|
+ out->n_Sample2 = FOC_PWM_Half_Period + 1;
|
|
|
+ if (out->n_Duty[0] == max_hi_side) {
|
|
|
+ //sample B, C
|
|
|
+ mid_hi_side = MAX(out->n_Duty[1], out->n_Duty[2]);
|
|
|
+ cs->c_phases = PHASE_BC;
|
|
|
+ }else if (out->n_Duty[1] == max_hi_side) {
|
|
|
+ //sample A, C
|
|
|
+ mid_hi_side = MAX(out->n_Duty[0], out->n_Duty[2]);
|
|
|
+ cs->c_phases = PHASE_AC;
|
|
|
+ }else {
|
|
|
+ //sample A, B
|
|
|
+ mid_hi_side = MAX(out->n_Duty[0], out->n_Duty[1]);
|
|
|
+ cs->c_phases = PHASE_AB;
|
|
|
+ }
|
|
|
+ get_mid_duty(mid_hi_side, out);
|
|
|
+ }else {
|
|
|
+ cs->c_phases = PHASE_AB;
|
|
|
+ }
|
|
|
+ out->n_CPhases = cs->c_phases;
|
|
|
+}
|
|
|
|
|
|
+#endif
|
|
|
|
|
|
void phase_current_adc_triger(void){
|
|
|
adc_enable_ext_trigger();
|