Temp.c 9.5 KB

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