|
|
@@ -2,7 +2,7 @@
|
|
|
#include "foc_type.h"
|
|
|
|
|
|
#define NB_OFFSET_SAMPLES 32
|
|
|
-static float __inline adc_to_current(u32 adc){
|
|
|
+static float __inline adc_to_current(int adc){
|
|
|
int i_adc = (int)adc;
|
|
|
if (i_adc > INT16_MAX){
|
|
|
i_adc = INT16_MAX;
|
|
|
@@ -21,19 +21,22 @@ void phase_current_init(current_samp_t *cs) {
|
|
|
void phase_current_offset(current_samp_t *cs) {
|
|
|
u32 phase_current1, phase_current2;
|
|
|
HAL_ADC1_Inject_Read(cs->sector, &phase_current1, &phase_current2);
|
|
|
- cs->offset_sample_count--;
|
|
|
- if (cs->sector == SECTOR_5 && 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_a = cs->adc_offset_a / NB_OFFSET_SAMPLES;
|
|
|
- cs->adc_offset_b = cs->adc_offset_b / NB_OFFSET_SAMPLES;
|
|
|
+
|
|
|
+ if (cs->offset_sample_count > 0) {
|
|
|
+ cs->offset_sample_count--;
|
|
|
+ if (cs->sector == SECTOR_5 && 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_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) {
|
|
|
- cs->adc_offset_c += phase_current2;
|
|
|
- if (cs->offset_sample_count == 0) {
|
|
|
- cs->adc_offset_c = cs->adc_offset_c / NB_OFFSET_SAMPLES;
|
|
|
+ if (cs->sector == SECTOR_1 && 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;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -44,25 +47,25 @@ void phase_current_sample(current_samp_t *cs){
|
|
|
if (cs->sector == SECTOR_4 || cs->sector == SECTOR_5) {
|
|
|
/* Current on Phase C is not accessible */
|
|
|
/* Ia = PhaseAOffset - ADC converted value) */
|
|
|
- cs->ia = adc_to_current(phase_current1 - cs->adc_offset_a);
|
|
|
- cs->ib = adc_to_current(phase_current2 - cs->adc_offset_b);
|
|
|
+ cs->ia = -adc_to_current((int)phase_current1 - (int)cs->adc_offset_a);
|
|
|
+ cs->ib = -adc_to_current((int)phase_current2 - (int)cs->adc_offset_b);
|
|
|
cs->ic = -(cs->ia + cs->ib);
|
|
|
}else if (cs->sector == SECTOR_1 || cs->sector == SECTOR_6) {
|
|
|
/* Current on Phase A is not accessible */
|
|
|
/* Ib = PhaseBOffset - ADC converted value) */
|
|
|
- cs->ib = adc_to_current(phase_current1 - cs->adc_offset_b);
|
|
|
- cs->ic = adc_to_current(phase_current2 - cs->adc_offset_c);
|
|
|
+ cs->ib = -adc_to_current((int)phase_current1 - (int)cs->adc_offset_b);
|
|
|
+ cs->ic = -adc_to_current((int)phase_current2 - (int)cs->adc_offset_c);
|
|
|
cs->ia = -(cs->ib + cs->ic);
|
|
|
}else if (cs->sector == SECTOR_2 || cs->sector == SECTOR_3) {
|
|
|
/* Current on Phase B is not accessible */
|
|
|
/* Ia = PhaseAOffset - ADC converted value) */
|
|
|
- cs->ia = adc_to_current(phase_current1 - cs->adc_offset_a);
|
|
|
- cs->ic = adc_to_current(phase_current2 - cs->adc_offset_c);
|
|
|
+ cs->ia = -adc_to_current((int)phase_current1 - (int)cs->adc_offset_a);
|
|
|
+ cs->ic = -adc_to_current((int)phase_current2 - (int)cs->adc_offset_c);
|
|
|
cs->ib = -(cs->ia + cs->ic);
|
|
|
}
|
|
|
static int tet_p = 0;
|
|
|
- if (tet_p++ % 20 == 0) {
|
|
|
- printf("$%d %d %d;", (int)(cs->ia * 1000), (int)(cs->ib*1000), -(int)(cs->ic*1000));
|
|
|
+ if (tet_p++ % 5 == 0) {
|
|
|
+ printf("$%d %d %d;", (int)(cs->ia * 1000), (int)(cs->ib*1000), (int)(cs->ic*1000));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -75,7 +78,7 @@ u32 get_phase_sample_point(current_samp_t *cs, phase_time_t *time, u8 sector){
|
|
|
cs->sector = SECTOR_5;
|
|
|
return FOC_PWM_Half_Period - 1;
|
|
|
}else {
|
|
|
- u32 low_side_mid_duty = FOC_PWM_period/2 - time->midle;
|
|
|
+ u32 low_side_mid_duty = FOC_PWM_Half_Period - time->midle;
|
|
|
u32 delta_duty = low_side_mid_duty - low_side_low_duty;
|
|
|
if (delta_duty > low_side_low_duty * 2) {
|
|
|
return time->low - TADC;
|