/** * @file Power.c * @author Wang, Zhiyu(wangzy49@midea.com) * @brief Power of ebike * @version 0.1 * @date 2021-09-29 * * @copyright Copyright (c) 2021 * */ /************************************************************************ Beginning of File, do not put anything above here except notes Compiler Directives: *************************************************************************/ #include "typedefine.h" #include "Temp.h" /****************************** * * Parameter * ******************************/ SWORD tmp_CurCalibCoef[CURCALIBNUM] = { 1024, // 0-20 1024, // 20-30 1024, // 30-40 1024, // 40-50 1000, // 50-60 980, // 60-70 960, // 70-80 940, // 80-90 }; static SWORD PCB_swRTempTab[PCB_TEMP_NUM] = { 0, // 0.01kOnm IPM voltage at 0 C initial 0, // 0.01kOnm IPM voltage at 10 C 0, // 0.01kOnm IPM voltage at 20 C 0, // 0.01kOnm IPM voltage at 30 C 0, // 0.01kOnm IPM voltage at 40 C 0, //0.01kOnm IPM voltage at 50 C 0, // 0.01kOnm IPM voltage at 60 C 0, // 0.01kOnm IPM voltage at 70 C 0, // 0.01kOnm IPM voltage at 80 C 0, // 0.01kOnm IPM voltage at 90 C 0, // 0.01kOnm IPM voltage at 100 C 0, // 0.01kOnm IPM voltage at 110 C 0// 40 // 0.01kOnm IPM voltage at 120 C }; static SWORD PCB_swRTempTab_CITY[PCB_TEMP_NUM] = { 3000, // 0.01kOnm IPM voltage at 0 C CITY 1900, // 0.01kOnm IPM voltage at 10 C 1200, // 0.01kOnm IPM voltage at 20 C 718, // 0.01kOnm IPM voltage at 30 C 436, // 0.01kOnm IPM voltage at 40 C 302, // 0.01kOnm IPM voltage at 50 C 211, // 0.01kOnm IPM voltage at 60 C 149, // 0.01kOnm IPM voltage at 70 C 107, // 0.01kOnm IPM voltage at 80 C 79, // 0.01kOnm IPM voltage at 90 C 59, // 0.01kOnm IPM voltage at 100 C 43, // 0.01kOnm IPM voltage at 110 C 33 // 0.01kOnm IPM voltage at 120 C }; static SWORD PCB_swRTempTab_MTB[PCB_TEMP_NUM] = { 3000, // 0.01kOnm IPM voltage at 0 C MTB 1800, // 0.01kOnm IPM voltage at 10 C 1100, // 0.01kOnm IPM voltage at 20 C 661, // 0.01kOnm IPM voltage at 30 C 386, // 0.01kOnm IPM voltage at 40 C 280, //0.01kOnm IPM voltage at 50 C 190, // 0.01kOnm IPM voltage at 60 C 136, // 0.01kOnm IPM voltage at 70 C 95, // 0.01kOnm IPM voltage at 80 C 68, // 0.01kOnm IPM voltage at 90 C 51, // 0.01kOnm IPM voltage at 100 C 37, // 0.01kOnm IPM voltage at 110 C 27 // 0.01kOnm IPM voltage at 120 C }; static SWORD PCB_swRTempCofTab[PCB_TEMP_NUM-1] = { 0,0,0,0,0,0,0,0,0,0,0,0 }; static volatile SWORD TorqTempReg[TORQ_TEMP_NUM]= { 3301, //-11 C 2690, //8 C 1802, //28 C 1368, //40 C 899, //55 C 580, //69 C 376 //85 C }; static volatile SWORD TorqTemp[TORQ_TEMP_NUM]= { -1083, //unit: 0.01C 843, 2830, 3997, 5460, 6930, 8453 }; static volatile SWORD TorqTempCof[TORQ_TEMP_NUM-1]= { 0,0,0,0,0,0 }; /*************************************************************** Function: TempInit; Description: cadence frequency get initialization Call by: functions in main loop; Input Variables: N/A Output/Return Variables: N/A Subroutine Call: N/A; Reference: N/A ****************************************************************/ void TempInit(void) { UWORD i = 0; #if((MOTOR_ID_SEL == MOTOR_WELLING_MTB_36V) || (MOTOR_ID_SEL == MOTOR_WELLING_MTB_48V)) for(i = 0 ; i < PCB_TEMP_NUM ;i ++) { PCB_swRTempTab[i] = PCB_swRTempTab_MTB[i] ; } #elif((MOTOR_ID_SEL == MOTOR_WELLING_CITY_36V) || (MOTOR_ID_SEL == MOTOR_WELLING_CITY_48V)) for(i = 0 ; i < PCB_TEMP_NUM ;i ++) { PCB_swRTempTab[i] = PCB_swRTempTab_CITY[i] ; } #endif for (i = 0; i < (PCB_TEMP_NUM - 1); i++) { PCB_swRTempCofTab[i] = (SWORD)(((SLONG)10 << 10) / (PCB_swRTempTab[i] - PCB_swRTempTab[i+ 1])); //Q10 } // for (i = 0; i < (TORQ_TEMP_NUM - 1); i++) // { // TorqTempCof[i] = (((SLONG)TorqTemp[i+1] - (SLONG)TorqTemp[i]) << 10) / (TorqTempReg[i] - TorqTempReg[i+1]) ; //Q10 // } } /*************************************************************** Function: PcbTempCal; Description: Calculation of Pcb Temp using PcbR Call by: functions in main loop; Input Variables: N/A Output/Return Variables: N/A Subroutine Call: N/A; Reference: N/A ****************************************************************/ SWORD tmp_PcbTemp = 0; //void PcbTempCal(SWORD PcbR) //{ // if (PcbR >= PCB_swRTempTab[temp_0]) // { // tmp_PcbTemp = 0; // } // else if (PcbR < PCB_swRTempTab[temp_0] && PcbR >= PCB_swRTempTab[temp_20]) // { // tmp_PcbTemp = 0 + (((PcbR - PCB_swRTempTab[temp_0]) * PCB_swRTempCofTab[temp_coef_0_20]) >> 10); // } // else if (PcbR < PCB_swRTempTab[temp_20] && PcbR >= PCB_swRTempTab[temp_40]) // { // tmp_PcbTemp = 20 + (((PcbR - PCB_swRTempTab[temp_20]) * PCB_swRTempCofTab[temp_coef_20_40]) >> 10); // } // else if (PcbR < PCB_swRTempTab[temp_40] && PcbR >= PCB_swRTempTab[temp_60]) // { // tmp_PcbTemp = 40 + (((PcbR - PCB_swRTempTab[temp_40]) * PCB_swRTempCofTab[temp_coef_40_60]) >> 10); // } // else if (PcbR < PCB_swRTempTab[temp_60] && PcbR >= PCB_swRTempTab[temp_80]) // { // tmp_PcbTemp = 60 + (((PcbR - PCB_swRTempTab[temp_60]) * PCB_swRTempCofTab[temp_coef_60_80]) >> 10); // } // else if (PcbR < PCB_swRTempTab[temp_80] && PcbR >= PCB_swRTempTab[temp_100]) // { // tmp_PcbTemp = 80 + (((PcbR - PCB_swRTempTab[temp_80]) * PCB_swRTempCofTab[temp_coef_80_100]) >> 10); // } // else if (PcbR < PCB_swRTempTab[temp_100]) // { // tmp_PcbTemp = 100 +(((PcbR - PCB_swRTempTab[temp_100]) * PCB_swRTempCofTab[temp_coef_100_120]) >> 10); // } // else // {} //} static SWORD coeftest = 0 ; void PcbTempCal(SWORD PcbR) { if (PcbR >= PCB_swRTempTab[temp_0]) { tmp_PcbTemp = 0; coeftest = 2 ; } else if (PcbR >= PCB_swRTempTab[temp_10]) { tmp_PcbTemp = 10 - (((PcbR - PCB_swRTempTab[temp_10]) * PCB_swRTempCofTab[temp_coef_0_10]) >> 10); coeftest = PCB_swRTempCofTab[temp_coef_0_10] ; } else if (PcbR >= PCB_swRTempTab[temp_20]) { tmp_PcbTemp = 20 - (((PcbR - PCB_swRTempTab[temp_20]) * PCB_swRTempCofTab[temp_coef_10_20]) >> 10); coeftest = PCB_swRTempCofTab[temp_coef_10_20] ; } else if (PcbR >= PCB_swRTempTab[temp_30]) { tmp_PcbTemp = 30 - (((PcbR - PCB_swRTempTab[temp_30]) * PCB_swRTempCofTab[temp_coef_20_30]) >> 10); coeftest = PCB_swRTempCofTab[temp_coef_20_30] ; } else if (PcbR >= PCB_swRTempTab[temp_40]) { tmp_PcbTemp = 40 - (((PcbR - PCB_swRTempTab[temp_40]) * PCB_swRTempCofTab[temp_coef_30_40]) >> 10); coeftest = PCB_swRTempCofTab[temp_coef_30_40] ; } else if (PcbR >= PCB_swRTempTab[temp_50]) { tmp_PcbTemp = 50 - (((PcbR - PCB_swRTempTab[temp_50]) * PCB_swRTempCofTab[temp_coef_40_50]) >> 10); coeftest = PCB_swRTempCofTab[temp_coef_40_50] ; } else if (PcbR >= PCB_swRTempTab[temp_60]) { tmp_PcbTemp = 60 - (((PcbR - PCB_swRTempTab[temp_60]) * PCB_swRTempCofTab[temp_coef_50_60]) >> 10); coeftest = PCB_swRTempCofTab[temp_coef_50_60] ; } else if (PcbR >= PCB_swRTempTab[temp_70]) { tmp_PcbTemp = 70 - (((PcbR - PCB_swRTempTab[temp_70]) * PCB_swRTempCofTab[temp_coef_60_70]) >> 10); coeftest = PCB_swRTempCofTab[temp_coef_60_70] ; } else if (PcbR >= PCB_swRTempTab[temp_80]) { tmp_PcbTemp = 80 - (((PcbR - PCB_swRTempTab[temp_80]) * PCB_swRTempCofTab[temp_coef_70_80]) >> 10); coeftest = PCB_swRTempCofTab[temp_coef_70_80] ; } else if (PcbR >= PCB_swRTempTab[temp_90]) { tmp_PcbTemp = 90 - (((PcbR - PCB_swRTempTab[temp_90]) * PCB_swRTempCofTab[temp_coef_80_90]) >> 10); coeftest = PCB_swRTempCofTab[temp_coef_80_90] ; } else if (PcbR >= PCB_swRTempTab[temp_100]) { tmp_PcbTemp = 100 - (((PcbR - PCB_swRTempTab[temp_100]) * PCB_swRTempCofTab[temp_coef_90_100]) >> 10); coeftest = PCB_swRTempCofTab[temp_coef_90_100] ; } else if (PcbR >= PCB_swRTempTab[temp_110]) { tmp_PcbTemp = 110 - (((PcbR - PCB_swRTempTab[temp_110]) * PCB_swRTempCofTab[temp_coef_100_110]) >> 10); coeftest = PCB_swRTempCofTab[temp_coef_100_110] ; } else if (PcbR >= PCB_swRTempTab[temp_120]) { tmp_PcbTemp = 120 - (((PcbR - PCB_swRTempTab[temp_120]) * PCB_swRTempCofTab[temp_coef_110_120]) >> 10); coeftest = PCB_swRTempCofTab[temp_coef_110_120] ; } else { tmp_PcbTemp = 130 ; coeftest = 1; } } /*************************************************************** Function: Description: Call by: Input Variables: N/A Output/Return Variables: N/A Subroutine Call: N/A Reference: N/A ****************************************************************/ //SWORD temp_swTorqTempCal(UWORD Reg) //{ // SWORD Temp = 0,i = 0; // // if(Reg >= TorqTempReg[0]) // { // Temp = TorqTemp[0]; // } // else if(Reg < TorqTempReg[TORQ_TEMP_NUM - 1]) // { // Temp = TorqTemp[TORQ_TEMP_NUM - 1]; // } // else // { // for (i = 0; i < (TORQ_TEMP_NUM - 1); i++) // { // if(Reg >= TorqTempReg[i+1] && Reg < TorqTempReg[i]) // { // Temp = TorqTemp[i] + ((SLONG)TorqTempCof[i] * (TorqTempReg[i] - Reg) >> 10); //Q10 // break; // } // } // } // // return Temp; //} /************************************************************************* End of this File (EOF)! Do not put anything after this part! *************************************************************************/