Temp.c 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. /**
  2. * @file Power.c
  3. * @author Wang, Zhiyu(wangzy49@midea.com)
  4. * @brief Power of ebike
  5. * @version 0.1
  6. * @date 2021-09-29
  7. *
  8. * @copyright Copyright (c) 2021
  9. *
  10. */
  11. /************************************************************************
  12. Beginning of File, do not put anything above here except notes
  13. Compiler Directives:
  14. *************************************************************************/
  15. #include "typedefine.h"
  16. #include "Temp.h"
  17. /******************************
  18. *
  19. * Parameter
  20. *
  21. ******************************/
  22. SWORD tmp_CurCalibCoef[CURCALIBNUM] = {
  23. 1024, // 0-20
  24. 1024, // 20-30
  25. 1024, // 30-40
  26. 1024, // 40-50
  27. 1000, // 50-60
  28. 980, // 60-70
  29. 960, // 70-80
  30. 940, // 80-90
  31. };
  32. static SWORD PCB_swRTempTab[PCB_TEMP_NUM] = {
  33. 0, // 0.01kOnm IPM voltage at 0 C initial
  34. 0, // 0.01kOnm IPM voltage at 10 C
  35. 0, // 0.01kOnm IPM voltage at 20 C
  36. 0, // 0.01kOnm IPM voltage at 30 C
  37. 0, // 0.01kOnm IPM voltage at 40 C
  38. 0, //0.01kOnm IPM voltage at 50 C
  39. 0, // 0.01kOnm IPM voltage at 60 C
  40. 0, // 0.01kOnm IPM voltage at 70 C
  41. 0, // 0.01kOnm IPM voltage at 80 C
  42. 0, // 0.01kOnm IPM voltage at 90 C
  43. 0, // 0.01kOnm IPM voltage at 100 C
  44. 0, // 0.01kOnm IPM voltage at 110 C
  45. 0// 40 // 0.01kOnm IPM voltage at 120 C
  46. };
  47. static SWORD PCB_swRTempTab_CITY[PCB_TEMP_NUM] = {
  48. 3000, // 0.01kOnm IPM voltage at 0 C CITY
  49. 1900, // 0.01kOnm IPM voltage at 10 C
  50. 1200, // 0.01kOnm IPM voltage at 20 C
  51. 718, // 0.01kOnm IPM voltage at 30 C
  52. 436, // 0.01kOnm IPM voltage at 40 C
  53. 302, // 0.01kOnm IPM voltage at 50 C
  54. 211, // 0.01kOnm IPM voltage at 60 C
  55. 149, // 0.01kOnm IPM voltage at 70 C
  56. 107, // 0.01kOnm IPM voltage at 80 C
  57. 79, // 0.01kOnm IPM voltage at 90 C
  58. 59, // 0.01kOnm IPM voltage at 100 C
  59. 43, // 0.01kOnm IPM voltage at 110 C
  60. 33 // 0.01kOnm IPM voltage at 120 C
  61. };
  62. static SWORD PCB_swRTempTab_MTB[PCB_TEMP_NUM] = {
  63. 3000, // 0.01kOnm IPM voltage at 0 C MTB
  64. 1800, // 0.01kOnm IPM voltage at 10 C
  65. 1100, // 0.01kOnm IPM voltage at 20 C
  66. 661, // 0.01kOnm IPM voltage at 30 C
  67. 386, // 0.01kOnm IPM voltage at 40 C
  68. 280, //0.01kOnm IPM voltage at 50 C
  69. 190, // 0.01kOnm IPM voltage at 60 C
  70. 136, // 0.01kOnm IPM voltage at 70 C
  71. 95, // 0.01kOnm IPM voltage at 80 C
  72. 68, // 0.01kOnm IPM voltage at 90 C
  73. 51, // 0.01kOnm IPM voltage at 100 C
  74. 37, // 0.01kOnm IPM voltage at 110 C
  75. 27 // 0.01kOnm IPM voltage at 120 C
  76. };
  77. static SWORD PCB_swRTempCofTab[PCB_TEMP_NUM-1] = {
  78. 0,0,0,0,0,0,0,0,0,0,0,0
  79. };
  80. static volatile SWORD TorqTempReg[TORQ_TEMP_NUM]= {
  81. 3301, //-11 C
  82. 2690, //8 C
  83. 1802, //28 C
  84. 1368, //40 C
  85. 899, //55 C
  86. 580, //69 C
  87. 376 //85 C
  88. };
  89. static volatile SWORD TorqTemp[TORQ_TEMP_NUM]= {
  90. -1083, //unit: 0.01C
  91. 843,
  92. 2830,
  93. 3997,
  94. 5460,
  95. 6930,
  96. 8453
  97. };
  98. static volatile SWORD TorqTempCof[TORQ_TEMP_NUM-1]= {
  99. 0,0,0,0,0,0
  100. };
  101. /***************************************************************
  102. Function: TempInit;
  103. Description: cadence frequency get initialization
  104. Call by: functions in main loop;
  105. Input Variables: N/A
  106. Output/Return Variables: N/A
  107. Subroutine Call: N/A;
  108. Reference: N/A
  109. ****************************************************************/
  110. void TempInit(void)
  111. {
  112. UWORD i = 0;
  113. #if((MOTOR_ID_SEL == MOTOR_WELLING_MTB_36V) || (MOTOR_ID_SEL == MOTOR_WELLING_MTB_48V))
  114. for(i = 0 ; i < PCB_TEMP_NUM ;i ++)
  115. {
  116. PCB_swRTempTab[i] = PCB_swRTempTab_MTB[i] ;
  117. }
  118. #elif((MOTOR_ID_SEL == MOTOR_WELLING_CITY_36V) || (MOTOR_ID_SEL == MOTOR_WELLING_CITY_48V))
  119. for(i = 0 ; i < PCB_TEMP_NUM ;i ++)
  120. {
  121. PCB_swRTempTab[i] = PCB_swRTempTab_CITY[i] ;
  122. }
  123. #endif
  124. for (i = 0; i < (PCB_TEMP_NUM - 1); i++)
  125. {
  126. PCB_swRTempCofTab[i] = (SWORD)(((SLONG)10 << 10) / (PCB_swRTempTab[i] - PCB_swRTempTab[i+ 1])); //Q10
  127. }
  128. // for (i = 0; i < (TORQ_TEMP_NUM - 1); i++)
  129. // {
  130. // TorqTempCof[i] = (((SLONG)TorqTemp[i+1] - (SLONG)TorqTemp[i]) << 10) / (TorqTempReg[i] - TorqTempReg[i+1]) ; //Q10
  131. // }
  132. }
  133. /***************************************************************
  134. Function: PcbTempCal;
  135. Description: Calculation of Pcb Temp using PcbR
  136. Call by: functions in main loop;
  137. Input Variables: N/A
  138. Output/Return Variables: N/A
  139. Subroutine Call: N/A;
  140. Reference: N/A
  141. ****************************************************************/
  142. SWORD tmp_PcbTemp = 0;
  143. //void PcbTempCal(SWORD PcbR)
  144. //{
  145. // if (PcbR >= PCB_swRTempTab[temp_0])
  146. // {
  147. // tmp_PcbTemp = 0;
  148. // }
  149. // else if (PcbR < PCB_swRTempTab[temp_0] && PcbR >= PCB_swRTempTab[temp_20])
  150. // {
  151. // tmp_PcbTemp = 0 + (((PcbR - PCB_swRTempTab[temp_0]) * PCB_swRTempCofTab[temp_coef_0_20]) >> 10);
  152. // }
  153. // else if (PcbR < PCB_swRTempTab[temp_20] && PcbR >= PCB_swRTempTab[temp_40])
  154. // {
  155. // tmp_PcbTemp = 20 + (((PcbR - PCB_swRTempTab[temp_20]) * PCB_swRTempCofTab[temp_coef_20_40]) >> 10);
  156. // }
  157. // else if (PcbR < PCB_swRTempTab[temp_40] && PcbR >= PCB_swRTempTab[temp_60])
  158. // {
  159. // tmp_PcbTemp = 40 + (((PcbR - PCB_swRTempTab[temp_40]) * PCB_swRTempCofTab[temp_coef_40_60]) >> 10);
  160. // }
  161. // else if (PcbR < PCB_swRTempTab[temp_60] && PcbR >= PCB_swRTempTab[temp_80])
  162. // {
  163. // tmp_PcbTemp = 60 + (((PcbR - PCB_swRTempTab[temp_60]) * PCB_swRTempCofTab[temp_coef_60_80]) >> 10);
  164. // }
  165. // else if (PcbR < PCB_swRTempTab[temp_80] && PcbR >= PCB_swRTempTab[temp_100])
  166. // {
  167. // tmp_PcbTemp = 80 + (((PcbR - PCB_swRTempTab[temp_80]) * PCB_swRTempCofTab[temp_coef_80_100]) >> 10);
  168. // }
  169. // else if (PcbR < PCB_swRTempTab[temp_100])
  170. // {
  171. // tmp_PcbTemp = 100 +(((PcbR - PCB_swRTempTab[temp_100]) * PCB_swRTempCofTab[temp_coef_100_120]) >> 10);
  172. // }
  173. // else
  174. // {}
  175. //}
  176. static SWORD coeftest = 0 ;
  177. void PcbTempCal(SWORD PcbR)
  178. {
  179. if (PcbR >= PCB_swRTempTab[temp_0])
  180. {
  181. tmp_PcbTemp = 0;
  182. coeftest = 2 ;
  183. }
  184. else if (PcbR >= PCB_swRTempTab[temp_10])
  185. {
  186. tmp_PcbTemp = 10 - (((PcbR - PCB_swRTempTab[temp_10]) * PCB_swRTempCofTab[temp_coef_0_10]) >> 10);
  187. coeftest = PCB_swRTempCofTab[temp_coef_0_10] ;
  188. }
  189. else if (PcbR >= PCB_swRTempTab[temp_20])
  190. {
  191. tmp_PcbTemp = 20 - (((PcbR - PCB_swRTempTab[temp_20]) * PCB_swRTempCofTab[temp_coef_10_20]) >> 10);
  192. coeftest = PCB_swRTempCofTab[temp_coef_10_20] ;
  193. }
  194. else if (PcbR >= PCB_swRTempTab[temp_30])
  195. {
  196. tmp_PcbTemp = 30 - (((PcbR - PCB_swRTempTab[temp_30]) * PCB_swRTempCofTab[temp_coef_20_30]) >> 10);
  197. coeftest = PCB_swRTempCofTab[temp_coef_20_30] ;
  198. }
  199. else if (PcbR >= PCB_swRTempTab[temp_40])
  200. {
  201. tmp_PcbTemp = 40 - (((PcbR - PCB_swRTempTab[temp_40]) * PCB_swRTempCofTab[temp_coef_30_40]) >> 10);
  202. coeftest = PCB_swRTempCofTab[temp_coef_30_40] ;
  203. }
  204. else if (PcbR >= PCB_swRTempTab[temp_50])
  205. {
  206. tmp_PcbTemp = 50 - (((PcbR - PCB_swRTempTab[temp_50]) * PCB_swRTempCofTab[temp_coef_40_50]) >> 10);
  207. coeftest = PCB_swRTempCofTab[temp_coef_40_50] ;
  208. }
  209. else if (PcbR >= PCB_swRTempTab[temp_60])
  210. {
  211. tmp_PcbTemp = 60 - (((PcbR - PCB_swRTempTab[temp_60]) * PCB_swRTempCofTab[temp_coef_50_60]) >> 10);
  212. coeftest = PCB_swRTempCofTab[temp_coef_50_60] ;
  213. }
  214. else if (PcbR >= PCB_swRTempTab[temp_70])
  215. {
  216. tmp_PcbTemp = 70 - (((PcbR - PCB_swRTempTab[temp_70]) * PCB_swRTempCofTab[temp_coef_60_70]) >> 10);
  217. coeftest = PCB_swRTempCofTab[temp_coef_60_70] ;
  218. }
  219. else if (PcbR >= PCB_swRTempTab[temp_80])
  220. {
  221. tmp_PcbTemp = 80 - (((PcbR - PCB_swRTempTab[temp_80]) * PCB_swRTempCofTab[temp_coef_70_80]) >> 10);
  222. coeftest = PCB_swRTempCofTab[temp_coef_70_80] ;
  223. }
  224. else if (PcbR >= PCB_swRTempTab[temp_90])
  225. {
  226. tmp_PcbTemp = 90 - (((PcbR - PCB_swRTempTab[temp_90]) * PCB_swRTempCofTab[temp_coef_80_90]) >> 10);
  227. coeftest = PCB_swRTempCofTab[temp_coef_80_90] ;
  228. }
  229. else if (PcbR >= PCB_swRTempTab[temp_100])
  230. {
  231. tmp_PcbTemp = 100 - (((PcbR - PCB_swRTempTab[temp_100]) * PCB_swRTempCofTab[temp_coef_90_100]) >> 10);
  232. coeftest = PCB_swRTempCofTab[temp_coef_90_100] ;
  233. }
  234. else if (PcbR >= PCB_swRTempTab[temp_110])
  235. {
  236. tmp_PcbTemp = 110 - (((PcbR - PCB_swRTempTab[temp_110]) * PCB_swRTempCofTab[temp_coef_100_110]) >> 10);
  237. coeftest = PCB_swRTempCofTab[temp_coef_100_110] ;
  238. }
  239. else if (PcbR >= PCB_swRTempTab[temp_120])
  240. {
  241. tmp_PcbTemp = 120 - (((PcbR - PCB_swRTempTab[temp_120]) * PCB_swRTempCofTab[temp_coef_110_120]) >> 10);
  242. coeftest = PCB_swRTempCofTab[temp_coef_110_120] ;
  243. }
  244. else
  245. {
  246. tmp_PcbTemp = 130 ;
  247. coeftest = 1;
  248. }
  249. }
  250. /***************************************************************
  251. Function:
  252. Description:
  253. Call by:
  254. Input Variables: N/A
  255. Output/Return Variables: N/A
  256. Subroutine Call: N/A
  257. Reference: N/A
  258. ****************************************************************/
  259. //SWORD temp_swTorqTempCal(UWORD Reg)
  260. //{
  261. // SWORD Temp = 0,i = 0;
  262. //
  263. // if(Reg >= TorqTempReg[0])
  264. // {
  265. // Temp = TorqTemp[0];
  266. // }
  267. // else if(Reg < TorqTempReg[TORQ_TEMP_NUM - 1])
  268. // {
  269. // Temp = TorqTemp[TORQ_TEMP_NUM - 1];
  270. // }
  271. // else
  272. // {
  273. // for (i = 0; i < (TORQ_TEMP_NUM - 1); i++)
  274. // {
  275. // if(Reg >= TorqTempReg[i+1] && Reg < TorqTempReg[i])
  276. // {
  277. // Temp = TorqTemp[i] + ((SLONG)TorqTempCof[i] * (TorqTempReg[i] - Reg) >> 10); //Q10
  278. // break;
  279. // }
  280. // }
  281. // }
  282. //
  283. // return Temp;
  284. //}
  285. /*************************************************************************
  286. End of this File (EOF)!
  287. Do not put anything after this part!
  288. *************************************************************************/