|
@@ -8,9 +8,9 @@
|
|
|
|
|
|
|
|
#define Rvbus 0.0005f
|
|
#define Rvbus 0.0005f
|
|
|
#define Gvbus (13.1f) //母线电流的运放
|
|
#define Gvbus (13.1f) //母线电流的运放
|
|
|
-#define Rds_Defualt 0.0025f//欧
|
|
|
|
|
|
|
+#define Rds_Defualt 0.005f//欧
|
|
|
#define Gmos (1.7f)//mos 电流的运放
|
|
#define Gmos (1.7f)//mos 电流的运放
|
|
|
-#define Sample_R Rvbus
|
|
|
|
|
|
|
+#define Sample_R Rds_Defualt
|
|
|
#define Lower_Pass_p 0.2f
|
|
#define Lower_Pass_p 0.2f
|
|
|
|
|
|
|
|
#define VBUS_VOL(adc) (((float)(adc)) * 3.3f / 4096.0f / Gvbus)
|
|
#define VBUS_VOL(adc) (((float)(adc)) * 3.3f / 4096.0f / Gvbus)
|
|
@@ -19,7 +19,10 @@
|
|
|
#define current_i(v, r) ((v)/(r))
|
|
#define current_i(v, r) ((v)/(r))
|
|
|
|
|
|
|
|
void phase_current_init(current_samp_t *cs) {
|
|
void phase_current_init(current_samp_t *cs) {
|
|
|
- cs->offset_sample_count = NB_OFFSET_SAMPLES;
|
|
|
|
|
|
|
+ cs->offset_sample_count = NB_OFFSET_SAMPLES + 1;
|
|
|
|
|
+ cs->Ia = 0.0f;
|
|
|
|
|
+ cs->Ib = 0.0f;
|
|
|
|
|
+ cs->Ic = 0.0f;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -27,51 +30,70 @@ void phase_current_init(current_samp_t *cs) {
|
|
|
void phase_current_offset(current_samp_t *cs) {
|
|
void phase_current_offset(current_samp_t *cs) {
|
|
|
s32 phase_current1, phase_current2;
|
|
s32 phase_current1, phase_current2;
|
|
|
adc_phase_current_read(cs->sector, &phase_current1, &phase_current2);
|
|
adc_phase_current_read(cs->sector, &phase_current1, &phase_current2);
|
|
|
|
|
+ if (cs->offset_sample_count == (NB_OFFSET_SAMPLES + 1)) {
|
|
|
|
|
+ cs->offset_sample_count --;
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
if (cs->offset_sample_count > 0) {
|
|
if (cs->offset_sample_count > 0) {
|
|
|
cs->offset_sample_count--;
|
|
cs->offset_sample_count--;
|
|
|
if (cs->sector == SECTOR_5 && cs->offset_sample_count >= 0) {
|
|
if (cs->sector == SECTOR_5 && cs->offset_sample_count >= 0) {
|
|
|
- cs->adc_offset_a += phase_current1;
|
|
|
|
|
- cs->adc_offset_c += phase_current2;
|
|
|
|
|
|
|
+ cs->adc_offset_b += phase_current1;
|
|
|
|
|
+ cs->adc_offset_a += phase_current2;
|
|
|
if (cs->offset_sample_count == 0) {
|
|
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_a = cs->adc_offset_a / NB_OFFSET_SAMPLES;
|
|
|
- cs->adc_offset_c = cs->adc_offset_c / NB_OFFSET_SAMPLES;
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
if (cs->sector == SECTOR_1 && cs->offset_sample_count >= 0) {
|
|
if (cs->sector == SECTOR_1 && cs->offset_sample_count >= 0) {
|
|
|
- cs->adc_offset_b += phase_current1;
|
|
|
|
|
|
|
+ cs->adc_offset_c += phase_current2;
|
|
|
if (cs->offset_sample_count == 0) {
|
|
if (cs->offset_sample_count == 0) {
|
|
|
- cs->adc_offset_b = cs->adc_offset_b / NB_OFFSET_SAMPLES;
|
|
|
|
|
|
|
+ cs->adc_offset_c = cs->adc_offset_c / NB_OFFSET_SAMPLES;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+#define LowPass_filter 1.0f
|
|
|
void phase_current_sample(current_samp_t *cs){
|
|
void phase_current_sample(current_samp_t *cs){
|
|
|
s32 phase_current1, phase_current2;
|
|
s32 phase_current1, phase_current2;
|
|
|
|
|
+ float Ia, Ib, Ic;
|
|
|
|
|
+ phase_time_t *time = &cs->time;
|
|
|
adc_phase_current_read(cs->sector, &phase_current1, &phase_current2);
|
|
adc_phase_current_read(cs->sector, &phase_current1, &phase_current2);
|
|
|
|
|
+ if (time->three_shunts_flags == 1) {
|
|
|
|
|
+ time->three_shunts_flags = 0;
|
|
|
|
|
+ return; //use old current;
|
|
|
|
|
+ }
|
|
|
if (cs->sector == SECTOR_4 || cs->sector == SECTOR_5) {
|
|
if (cs->sector == SECTOR_4 || cs->sector == SECTOR_5) {
|
|
|
/* Current on Phase C is not accessible */
|
|
/* Current on Phase C is not accessible */
|
|
|
/* Ia = PhaseAOffset - ADC converted value) */
|
|
/* Ia = PhaseAOffset - ADC converted value) */
|
|
|
- cs->Ib = current_i(MOSds_VOL(phase_current1 - cs->adc_offset_b), Rds_Defualt);
|
|
|
|
|
- cs->Ia = current_i(MOSds_VOL(phase_current2 - cs->adc_offset_a), Rds_Defualt);
|
|
|
|
|
|
|
+ Ib = current_i(MOSds_VOL(phase_current1 - cs->adc_offset_b), Rds_Defualt);
|
|
|
|
|
+ LowPass_Filter(cs->Ib, Ib, LowPass_filter);
|
|
|
|
|
+ Ia = current_i(MOSds_VOL(phase_current2 - cs->adc_offset_a), Rds_Defualt);
|
|
|
|
|
+ LowPass_Filter(cs->Ia, Ia, LowPass_filter);
|
|
|
cs->Ic = -(cs->Ia + cs->Ib);
|
|
cs->Ic = -(cs->Ia + cs->Ib);
|
|
|
}else if (cs->sector == SECTOR_1 || cs->sector == SECTOR_6) {
|
|
}else if (cs->sector == SECTOR_1 || cs->sector == SECTOR_6) {
|
|
|
/* Current on Phase A is not accessible */
|
|
/* Current on Phase A is not accessible */
|
|
|
/* Ib = PhaseBOffset - ADC converted value) */
|
|
/* Ib = PhaseBOffset - ADC converted value) */
|
|
|
- cs->Ib = current_i(MOSds_VOL(phase_current1 - cs->adc_offset_b), Rds_Defualt);
|
|
|
|
|
- cs->Ic = current_i(MOSds_VOL(phase_current2 - cs->adc_offset_c), Rds_Defualt);
|
|
|
|
|
|
|
+ Ib = current_i(MOSds_VOL(phase_current1 - cs->adc_offset_b), Rds_Defualt);
|
|
|
|
|
+ LowPass_Filter(cs->Ib, Ib, LowPass_filter);
|
|
|
|
|
+ Ic = current_i(MOSds_VOL(phase_current2 - cs->adc_offset_c), Rds_Defualt);
|
|
|
|
|
+ LowPass_Filter(cs->Ic, Ic, LowPass_filter);
|
|
|
cs->Ia = -(cs->Ib + cs->Ic);
|
|
cs->Ia = -(cs->Ib + cs->Ic);
|
|
|
}else if (cs->sector == SECTOR_2 || cs->sector == SECTOR_3) {
|
|
}else if (cs->sector == SECTOR_2 || cs->sector == SECTOR_3) {
|
|
|
/* Current on Phase B is not accessible */
|
|
/* Current on Phase B is not accessible */
|
|
|
/* Ia = PhaseAOffset - ADC converted value) */
|
|
/* Ia = PhaseAOffset - ADC converted value) */
|
|
|
- cs->Ia = current_i(MOSds_VOL(phase_current1 - cs->adc_offset_a), Rds_Defualt);
|
|
|
|
|
- cs->Ic = current_i(MOSds_VOL(phase_current2 - cs->adc_offset_c), Rds_Defualt);
|
|
|
|
|
|
|
+ Ia = current_i(MOSds_VOL(phase_current1 - cs->adc_offset_a), Rds_Defualt);
|
|
|
|
|
+ LowPass_Filter(cs->Ia, Ia, LowPass_filter);
|
|
|
|
|
+ Ic = current_i(MOSds_VOL(phase_current2 - cs->adc_offset_c), Rds_Defualt);
|
|
|
|
|
+ LowPass_Filter(cs->Ic, Ic, LowPass_filter);
|
|
|
cs->Ib = -(cs->Ia + cs->Ic);
|
|
cs->Ib = -(cs->Ia + cs->Ic);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
{
|
|
{
|
|
|
static int count = 0;
|
|
static int count = 0;
|
|
|
- if (count++ % 3 == 0) {
|
|
|
|
|
- log_chan_value(1, (int)(cs->Ia * 1000));
|
|
|
|
|
|
|
+ if (count++ % 2 == 0) {
|
|
|
|
|
+ //log_chan_value(1, (int)(cs->Ia * 1000));
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -81,21 +103,23 @@ void phase_current_sample(current_samp_t *cs){
|
|
|
void get_phase_sample_point(current_samp_t *cs, u8 sector){
|
|
void get_phase_sample_point(current_samp_t *cs, u8 sector){
|
|
|
phase_time_t *time = &cs->time;
|
|
phase_time_t *time = &cs->time;
|
|
|
u32 low_side_low_duty = FOC_PWM_Half_Period - time->low;
|
|
u32 low_side_low_duty = FOC_PWM_Half_Period - time->low;
|
|
|
-#if 0
|
|
|
|
|
u32 low_side_mid_duty = FOC_PWM_Half_Period - time->midle;
|
|
u32 low_side_mid_duty = FOC_PWM_Half_Period - time->midle;
|
|
|
cs->sector = sector;
|
|
cs->sector = sector;
|
|
|
time->Samp_p1 = FOC_PWM_Half_Period + 1;
|
|
time->Samp_p1 = FOC_PWM_Half_Period + 1;
|
|
|
- time->Samp_p2 = FOC_PWM_Half_Period + 1;
|
|
|
|
|
|
|
+ time->Samp_p2 = FOC_PWM_Half_Period + 1;
|
|
|
/*底边开mos的时间是2倍的 low_side_low_duty(一个周期)*/
|
|
/*底边开mos的时间是2倍的 low_side_low_duty(一个周期)*/
|
|
|
if (low_side_low_duty * 2 >= TSampleMIN) { //可以采样
|
|
if (low_side_low_duty * 2 >= TSampleMIN) { //可以采样
|
|
|
if (low_side_low_duty >= (TADC + TDead)) {//可以在pwm的中心点采样
|
|
if (low_side_low_duty >= (TADC + TDead)) {//可以在pwm的中心点采样
|
|
|
time->Samp_p1 = FOC_PWM_Half_Period - 1;
|
|
time->Samp_p1 = FOC_PWM_Half_Period - 1;
|
|
|
|
|
+ cs->sector = SECTOR_1;
|
|
|
}else {
|
|
}else {
|
|
|
u32 Samp_p = time->low + TSampleBefore;
|
|
u32 Samp_p = time->low + TSampleBefore;
|
|
|
if (Samp_p >= FOC_PWM_Half_Period) { //需要在pwm中心点过后采样,需要配置PWM0模式
|
|
if (Samp_p >= FOC_PWM_Half_Period) { //需要在pwm中心点过后采样,需要配置PWM0模式
|
|
|
time->Samp_p2 = ( 2u * FOC_PWM_Half_Period ) - Samp_p - (uint16_t) 1;
|
|
time->Samp_p2 = ( 2u * FOC_PWM_Half_Period ) - Samp_p - (uint16_t) 1;
|
|
|
|
|
+ //log_chan_value(2, time->Samp_p2);
|
|
|
}else {
|
|
}else {
|
|
|
time->Samp_p1 = Samp_p;
|
|
time->Samp_p1 = Samp_p;
|
|
|
|
|
+ //log_chan_value(4, time->Samp_p1);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}else if (low_side_mid_duty * 2 >= TSampleMIN){
|
|
}else if (low_side_mid_duty * 2 >= TSampleMIN){
|
|
@@ -104,34 +128,17 @@ void get_phase_sample_point(current_samp_t *cs, u8 sector){
|
|
|
}else {
|
|
}else {
|
|
|
u32 Samp_p = time->midle + TSampleBefore;
|
|
u32 Samp_p = time->midle + TSampleBefore;
|
|
|
if (Samp_p >= FOC_PWM_Half_Period) { //需要在pwm中心点过后采样,需要配置PWM0模式
|
|
if (Samp_p >= FOC_PWM_Half_Period) { //需要在pwm中心点过后采样,需要配置PWM0模式
|
|
|
- time->Samp_p2 = ( 2u * FOC_PWM_Half_Period ) - Samp_p - (uint16_t) 1;
|
|
|
|
|
|
|
+ time->Samp_p2 = ( 2u * FOC_PWM_Half_Period ) - Samp_p - (uint16_t) 1;
|
|
|
|
|
+ //log_chan_value(3, time->Samp_p2);
|
|
|
}else {
|
|
}else {
|
|
|
time->Samp_p1 = Samp_p;
|
|
time->Samp_p1 = Samp_p;
|
|
|
|
|
+ //log_chan_value(5, time->Samp_p1);
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
- }else {
|
|
|
|
|
- //not reached there
|
|
|
|
|
- sys_debug("ERROR!!!!!\n");
|
|
|
|
|
- }
|
|
|
|
|
-#else
|
|
|
|
|
- if (low_side_low_duty > (TDead + MAX(TRise, TNoise))) {
|
|
|
|
|
- cs->sector = SECTOR_1;
|
|
|
|
|
- time->Samp_p1 = time->low + MAX(TRise, TNoise);
|
|
|
|
|
- }else {
|
|
|
|
|
- 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) {
|
|
|
|
|
- time->Samp_p1 = time->low - TADC;
|
|
|
|
|
- }else {
|
|
|
|
|
- u32 sample_point = time->low + (TDead + MAX(TRise, TNoise));
|
|
|
|
|
- if (sample_point >= FOC_PWM_Half_Period) {
|
|
|
|
|
- //这里需要修改触发方式,GD不支持adc设置上升或下降沿触发,考虑切换pwm模式???
|
|
|
|
|
- sample_point = ( 2u * FOC_PWM_Half_Period ) - sample_point - (uint16_t) 1;
|
|
|
|
|
- }
|
|
|
|
|
- time->Samp_p1 = sample_point;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
+ }else {
|
|
|
|
|
+ time->three_shunts_flags = 1; //means do'nt use the sample current
|
|
|
|
|
+ time->Samp_p1 = FOC_PWM_Half_Period - 1;//dumy trigger
|
|
|
}
|
|
}
|
|
|
-#endif
|
|
|
|
|
}
|
|
}
|
|
|
#else
|
|
#else
|
|
|
|
|
|
|
@@ -632,7 +639,6 @@ void get_phase_sample_point(current_samp_t *cs, u8 sector){
|
|
|
|
|
|
|
|
#endif
|
|
#endif
|
|
|
void phase_current_adc_triger(current_samp_t *cs){
|
|
void phase_current_adc_triger(current_samp_t *cs){
|
|
|
-
|
|
|
|
|
- //adc_enable_ext_trigger();
|
|
|
|
|
|
|
+ adc_enable_ext_trigger();
|
|
|
}
|
|
}
|
|
|
|
|
|