|
@@ -100,7 +100,7 @@ void RD_RemainDis_Init(uint16_t uwWheelLength, TrueOrFalse_Flag_Struct_t BMS_COM
|
|
|
}
|
|
|
else //电池不含通讯时,根据母线电压估算剩余容量
|
|
|
{
|
|
|
- RD_getQRemainRecord(BusVoltage * 36 / DesignVol); //放电曲线是按照36V,针对48V或24V做等效转换
|
|
|
+// RD_getQRemainRecord(BusVoltage * 36 / DesignVol); //放电曲线是按照36V,针对48V或24V做等效转换
|
|
|
}
|
|
|
|
|
|
RemainDis.start = 0;
|
|
@@ -157,7 +157,6 @@ void RD_CalculateRemainDis(uint32_t WheelTurnCnt, uint16_t RemainCap, uint8_t SO
|
|
|
static int32_t PowerPerKmFltSum=0;
|
|
|
|
|
|
uint8_t i;
|
|
|
- uint8_t flagBatteryFull=0;
|
|
|
int32_t ptmp;
|
|
|
|
|
|
static uint32_t RunTimeCnt = 0;
|
|
@@ -183,11 +182,10 @@ void RD_CalculateRemainDis(uint32_t WheelTurnCnt, uint16_t RemainCap, uint8_t SO
|
|
|
RemainDis.BMS_Com_DelayTimeCnt = HAL_GetTick();
|
|
|
RemainDis.IsBMS_ComOK_Flag = FALSE;
|
|
|
}
|
|
|
-
|
|
|
- /*电流大于最小阈值,累加一次电量*/
|
|
|
- if((RemainDis.I_motor > CURRENT_MIN) && (RemainDis.IsBMS_ComOK_Flag == FALSE) )
|
|
|
+ else
|
|
|
{
|
|
|
- RemainDis.Q_add += RemainDis.I_motor * RemainDis.acc_period;//mA * ms
|
|
|
+ //更新电池剩余容量
|
|
|
+ Battery_Info.Q_remain_real = RemainCap;
|
|
|
}
|
|
|
|
|
|
/*助力档位切换后*/
|
|
@@ -229,104 +227,79 @@ void RD_CalculateRemainDis(uint32_t WheelTurnCnt, uint16_t RemainCap, uint8_t SO
|
|
|
|
|
|
/*充电状态,或由母线电流切换到电量信息计算时,此值会出现负数*/
|
|
|
Q_add_tmp = (Q_add_tmp > 0) ? Q_add_tmp : 0;
|
|
|
-
|
|
|
+ Q_add_tmp = (Q_add_tmp < 30) ? Q_add_tmp : 30;
|
|
|
/*判断电池是否满充*/
|
|
|
if( ( Q_add_tmp == 0 ) && ( Battery_Info.SOC == 100 ) )
|
|
|
{
|
|
|
/*当电池满充时,发出的电量信息会是标称值,
|
|
|
在Battery.SOC==100时不会随电量消耗尔减小*/
|
|
|
/*置标志位,不计算更新*/
|
|
|
- flagBatteryFull = 1;
|
|
|
}
|
|
|
-
|
|
|
- /*切换到母线电流积分计算后,使用最新的剩余电量数据*/
|
|
|
- Battery_Info.Q_remain_record = Battery_Info.Q_remain_real;
|
|
|
- Battery_Info.Q_discharged = 0;
|
|
|
- RemainDis.Q_add = 0;
|
|
|
- }
|
|
|
- }
|
|
|
- else/*消耗的电量信息来自母线电流,进行积分累计计算*/
|
|
|
- {
|
|
|
- /*单位mA*h*/
|
|
|
- Q_add_tmp = RemainDis.Q_add / ( 3600 * 1000 );
|
|
|
- if(Q_add_tmp > 0)
|
|
|
- {
|
|
|
- RemainDis.Q_add = RemainDis.Q_add % ( 3600 * 1000 );//保留余数,下次累加
|
|
|
+ else
|
|
|
+ {
|
|
|
+ /*将一定轮圈数消耗的电量,写入FIFO,FIFO中的数据滑动求平均值*/
|
|
|
+ Q_sum -= Q_FIFO[Q_Index];
|
|
|
+ Q_sum += Q_add_tmp;
|
|
|
+ Q_FIFO[Q_Index++] = Q_add_tmp;
|
|
|
+
|
|
|
+ if(Q_Index>=Q_FIFO_LENGTH)
|
|
|
+ {
|
|
|
+ Q_Index = 0;
|
|
|
+ Q_fifo_full_falg = 1;
|
|
|
+
|
|
|
+ /*250圈,动态功耗刷新一次,置一次eeprom保存标志*/
|
|
|
+ RemainDis.flag_saveInfo = 1;
|
|
|
+ }
|
|
|
+ /*
|
|
|
+ wheelCount x WHEEL_LENGTH(cm)
|
|
|
+ ------------------------------- (km) wheelCount=(Q_FIFO_LENGTH * WHEEL_COUNT_REFRESH_VALUE)
|
|
|
+ 1000 x 100
|
|
|
+
|
|
|
+ Q_sum(mA*h) x 1000 x 100
|
|
|
+ ------------------------------- (mA*h/km)
|
|
|
+ wheelCount x WHEEL_LENGTH
|
|
|
+ */
|
|
|
+ if( Q_sum > 0 )
|
|
|
+ {
|
|
|
+ /*缓存满后,求平均值*/
|
|
|
+ if(Q_fifo_full_falg==1)
|
|
|
+ {
|
|
|
+ RemainDis.Power_per_km = (Q_sum * 1000 * 100 ) / ( Q_FIFO_LENGTH * WHEEL_COUNT_REFRESH_VALUE * RemainDis.wheelLength );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ /*缓存数据未满,以当前有效数据个数求平均值*/
|
|
|
+ RemainDis.Power_per_km = (Q_sum * 1000 * 100 ) / ( Q_Index * WHEEL_COUNT_REFRESH_VALUE * RemainDis.wheelLength );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ RemainDis.Power_per_km = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*电量缓存Q_FIFO计满一次,滑动滤波求平均值*/
|
|
|
+ if(Q_Index==0)
|
|
|
+ {
|
|
|
+ ptmp = RemainDis.Power_per_km;
|
|
|
+ PowerPerKmFltSum += ((ptmp << 8) - PowerPerKmFltSum) / P_FIFO_LENGTH;
|
|
|
+ RemainDis.Power_per_km_average = (uint16_t)(PowerPerKmFltSum >> 8);
|
|
|
+ }
|
|
|
+
|
|
|
+ /*计算剩余续航里程*/
|
|
|
+ if(RemainDis.Power_per_km_average > 0)
|
|
|
+ {
|
|
|
+ RemainDis.remainDistance = Battery_Info.Q_remain_real / RemainDis.Power_per_km_result;//单位km
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ RemainDis.remainDistance = 0xFFFF;//码表显示---km
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
- /*累计总的消耗电量*/
|
|
|
- Battery_Info.Q_discharged += Q_add_tmp ; //mA*h
|
|
|
-
|
|
|
- /*更新电池剩余电量*/
|
|
|
- Battery_Info.Q_remain_real = Battery_Info.Q_remain_record - Battery_Info.Q_discharged ;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/*电量信息来自电池的计算,需要用到此数据*/
|
|
|
Battery_Info.Q_remain_real_last = Battery_Info.Q_remain_real;
|
|
|
-
|
|
|
- /*电池非满充状态*/
|
|
|
- if( flagBatteryFull == 0 )
|
|
|
- {
|
|
|
- /*将一定轮圈数消耗的电量,写入FIFO,FIFO中的数据滑动求平均值*/
|
|
|
- Q_sum -= Q_FIFO[Q_Index];
|
|
|
- Q_sum += Q_add_tmp;
|
|
|
- Q_FIFO[Q_Index++] = Q_add_tmp;
|
|
|
- }
|
|
|
-
|
|
|
- if(Q_Index>=Q_FIFO_LENGTH)
|
|
|
- {
|
|
|
- Q_Index = 0;
|
|
|
- Q_fifo_full_falg = 1;
|
|
|
-
|
|
|
- /*250圈,动态功耗刷新一次,置一次eeprom保存标志*/
|
|
|
- RemainDis.flag_saveInfo = 1;
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
- wheelCount x WHEEL_LENGTH(cm)
|
|
|
- ------------------------------- (km) wheelCount=(Q_FIFO_LENGTH * WHEEL_COUNT_REFRESH_VALUE)
|
|
|
- 1000 x 100
|
|
|
-
|
|
|
- Q_sum(mA*h) x 1000 x 100
|
|
|
- ------------------------------- (mA*h/km)
|
|
|
- wheelCount x WHEEL_LENGTH
|
|
|
- */
|
|
|
-
|
|
|
- if( Q_sum > 0 )
|
|
|
- {
|
|
|
- /*缓存满后,求平均值*/
|
|
|
- if(Q_fifo_full_falg==1)
|
|
|
- {
|
|
|
- RemainDis.Power_per_km = (Q_sum * 1000 * 100 ) / ( Q_FIFO_LENGTH * WHEEL_COUNT_REFRESH_VALUE * RemainDis.wheelLength );
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- /*缓存数据未满,以当前有效数据个数求平均值*/
|
|
|
- RemainDis.Power_per_km = (Q_sum * 1000 * 100 ) / ( Q_Index * WHEEL_COUNT_REFRESH_VALUE * RemainDis.wheelLength );
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- RemainDis.Power_per_km = 0;
|
|
|
- }
|
|
|
-
|
|
|
- /*电量缓存Q_FIFO计满一次,滑动滤波求平均值*/
|
|
|
- if(Q_Index==0)
|
|
|
- {
|
|
|
- ptmp = RemainDis.Power_per_km;
|
|
|
- PowerPerKmFltSum += ((ptmp << 8) - PowerPerKmFltSum) / P_FIFO_LENGTH;
|
|
|
- RemainDis.Power_per_km_average = (uint16_t)(PowerPerKmFltSum >> 8);
|
|
|
- }
|
|
|
-
|
|
|
- /*计算剩余续航里程*/
|
|
|
- if(RemainDis.Power_per_km_average > 0)
|
|
|
- {
|
|
|
- RemainDis.remainDistance = Battery_Info.Q_remain_real / RemainDis.Power_per_km_result;//单位km
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- RemainDis.remainDistance = 0xFFFF;//码表显示---km
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -372,7 +345,7 @@ void RD_SaveAndUpdateInfo(MC_GearSt_Struct_t GearSt, MC_AssistRunMode_Struct_t M
|
|
|
|
|
|
/*各档位关联*/
|
|
|
/*不低于默认值30%*/
|
|
|
- if( sPercent >= -30 )
|
|
|
+ if( (sPercent >= -30)&&(sPercent <= 455) )
|
|
|
{
|
|
|
/*更新平均功耗*/
|
|
|
RemainDis.Power_per_km_result = powerDefaultCurrentMode * ( 100 + sPercent ) / 100;
|