Temp.c 10.0 KB

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