torquesensor.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565
  1. /**
  2. * @file Bikethrottle.c
  3. * @author Wang, Zhiyu(wangzy49@midea.com)
  4. * @brief throttle 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 "torquesensor.h"
  16. #include "syspar.h"
  17. #include "mathtool.h"
  18. #include "CodePara.h"
  19. #include "canAppl.h"
  20. #include "api.h"
  21. #include "board_config.h"
  22. /******************************
  23. *
  24. * static Parameter
  25. *
  26. ******************************/
  27. static LPF_OUT torq_pvt_stTorSensorLpf;
  28. static volatile SWORD TorqOffsetReg[TORQ_OFFSET_NUM]= {
  29. 640, //-11 C
  30. 718, //8 C
  31. 919, //28 C
  32. 957, //40 C
  33. 1051, //55 C
  34. 1196, //69 C
  35. 1352 //85 C
  36. };
  37. static volatile SWORD TorqOffsetTemp[TORQ_OFFSET_NUM]= {
  38. -1083, //unit: 0.01C
  39. 843,
  40. 2830,
  41. 3997,
  42. 5460,
  43. 6930,
  44. 8453
  45. };
  46. static volatile SWORD TorqOffsetCof[TORQ_OFFSET_NUM-1]= {
  47. 0,0,0,0,0,0
  48. };
  49. static volatile SWORD TorqSencitiveReg[TORQ_OFFSET_NUM]= {
  50. 4423, //-20 C
  51. 6021, //0 C
  52. 7048, //20 C
  53. 7663, //40 C
  54. 8008, //60 C
  55. 8226, //80 C
  56. 8459 //100 C
  57. };
  58. static volatile SWORD TorqSencitiveTemp[TORQ_OFFSET_NUM]= {
  59. -200, //unit: 0.1C
  60. 0,
  61. 200,
  62. 400,
  63. 600,
  64. 800,
  65. 1000
  66. };
  67. static volatile SLONG TorqSencitiveCof[TORQ_OFFSET_NUM-1]= {
  68. 0,0,0,0,0,0
  69. };
  70. static UWORD TorSensor_uwDMAReg = 0;
  71. /******************************
  72. *
  73. * Extern Parameter
  74. *
  75. ******************************/
  76. TORQUESENSOR_COF torsensor_stTorSensorCof = TORQUESENSOR_COF_DEFAULT;
  77. TORQUESENSOR_OUT torsensor_stTorSensorOut = TORQUESENSOR_OUT_DEFAULT;
  78. /***************************************************************
  79. Function: cadence_voFreGet;
  80. Description: cadence frequency get
  81. Call by: functions in main loop;
  82. Input Variables: N/A
  83. Output/Return Variables: N/A
  84. Subroutine Call: N/A;
  85. Reference: N/A
  86. ****************************************************************/
  87. void torsensor_voTorSensorCof(void)
  88. {
  89. ULONG ulLpfTm = 0;
  90. UWORD i = 0, uwAverageOffset = 0;
  91. // torsensor_stTorSensorCof.uwMaxSensorTorquePu = ((ULONG)TORQUE_MAX_RANGE << 14) / TORQUEBASE; // Q14
  92. torsensor_stTorSensorCof.uwMinSensorTorquePu = ((ULONG)TORQUE_MIN_RANGE << 14) / TORQUEBASE; // Q14
  93. torsensor_stTorSensorCof.uwMaxSensorVolOutputPu = (ULONG)TORQUE_VOLTAGE_MAX_RANGE << 14 / VBASE;
  94. torsensor_stTorSensorCof.uwMinSensorVolOutputPu = (ULONG)TORQUE_VOLTAGE_MIN_RANGE << 14 / VBASE;
  95. torsensor_stTorSensorCof.uwTorSensorLPFFrq = TORQUE_SENSOR_LPF_FRQ;
  96. torsensor_stTorSensorCof.uwTorVolLPFDisFrq = TORQUE_LPF_DISCRETEHZ;
  97. if(torsensor_stTorSensorCof.uwTorqueOffsetConfirmFlg == FALSE)
  98. {
  99. #if (TORSENSOR_USEMOL == TORSENSOR_USEDEFAULT)
  100. torsensor_stTorSensorCof.uwTorqueOffset = TORQUE_VOLTAGE_MIN_RANGE * 4096 / 3300;
  101. #elif (TORSENSOR_USEMOL == TORSENSOR_USEEE)
  102. torsensor_stTorSensorCof.uwTorqueOffsetPowerUp = iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH];
  103. //torsensor_stTorSensorCof.uwTorqueOffsetPowerUp = PowerUpOffset;
  104. if(torsensor_stTorSensorCof.uwTorqueOffsetNow1 != 0 && torsensor_stTorSensorCof.uwTorqueOffsetNow2 != 0
  105. && torsensor_stTorSensorCof.uwTorqueOffsetNow3 != 0 && torsensor_stTorSensorCof.uwTorqueOffsetNow4 != 0)
  106. {
  107. torsensor_stTorSensorCof.uwTorqueNowAllHasValueFlg = TRUE;
  108. }
  109. if(torsensor_stTorSensorCof.uwTorqueOffsetOrign == 0 && torsensor_stTorSensorCof.uwTorqueNowAllHasValueFlg == 0)
  110. {
  111. torsensor_stTorSensorCof.uwTorqueOffset = torsensor_stTorSensorCof.uwTorqueOffsetPowerUp;
  112. torsensor_stTorSensorCof.uwTorqueOffsetOrign = torsensor_stTorSensorCof.uwTorqueOffsetPowerUp;
  113. cp_stFlg.ParaSaveEEFlg = TRUE;
  114. cp_stFlg.ParaUpdateFlg = TRUE;
  115. //cp_stFlg.ParaSensorInfoUpdateFlg = TRUE;
  116. //cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
  117. MC_UpcInfo.stSensorInfo.uwSaveFlg = 1;
  118. }
  119. else
  120. {
  121. /* Compare with AvgOffset */
  122. if(torsensor_stTorSensorCof.uwTorqueNowAllHasValueFlg == TRUE)
  123. {
  124. uwAverageOffset = (UWORD)(((ULONG)torsensor_stTorSensorCof.uwTorqueOffsetNow1 + torsensor_stTorSensorCof.uwTorqueOffsetNow2 +
  125. torsensor_stTorSensorCof.uwTorqueOffsetNow3 + torsensor_stTorSensorCof.uwTorqueOffsetNow4)>>2);
  126. }
  127. else
  128. {
  129. uwAverageOffset = torsensor_stTorSensorCof.uwTorqueOffsetOrign;
  130. }
  131. if(ABS((SWORD)torsensor_stTorSensorCof.uwTorqueOffsetPowerUp - (SWORD)uwAverageOffset) > 200)
  132. {
  133. torsensor_stTorSensorCof.uwTorqueOffset = uwAverageOffset;
  134. }
  135. else
  136. {
  137. torsensor_stTorSensorCof.uwTorqueOffsetNow1 = torsensor_stTorSensorCof.uwTorqueOffsetNow2;
  138. torsensor_stTorSensorCof.uwTorqueOffsetNow2 = torsensor_stTorSensorCof.uwTorqueOffsetNow3;
  139. torsensor_stTorSensorCof.uwTorqueOffsetNow3 = torsensor_stTorSensorCof.uwTorqueOffsetNow4;
  140. torsensor_stTorSensorCof.uwTorqueOffsetNow4 = torsensor_stTorSensorCof.uwTorqueOffsetPowerUp;
  141. cp_stFlg.ParaSaveEEFlg = TRUE;
  142. cp_stFlg.ParaUpdateFlg = TRUE;
  143. //cp_stFlg.ParaSensorInfoUpdateFlg = TRUE;
  144. //cp_stFlg.ParaAssistUpdateFinishFlg = TRUE;
  145. MC_UpcInfo.stSensorInfo.uwSaveFlg = 1;
  146. torsensor_stTorSensorCof.uwTorqueOffset = torsensor_stTorSensorCof.uwTorqueOffsetPowerUp;
  147. }
  148. }
  149. #endif
  150. torsensor_stTorSensorCof.uwTorqueOffsetConfirmFlg = TRUE;
  151. }
  152. #ifdef RUN_ARCH_SIM_2
  153. torsensor_stTorSensorCof.uwTorqueOffset = 868;
  154. torsensor_stTorSensorCof.uwBikeTorStep1ADC = 1427;
  155. torsensor_stTorSensorCof.uwBikeTorStep1RealNm = 250;
  156. torsensor_stTorSensorCof.uwBikeTorStep2ADC = 1985;
  157. torsensor_stTorSensorCof.uwBikeTorStep2RealNm = 500;
  158. torsensor_stTorSensorCof.uwBikeTorStep3ADC = 2544;
  159. torsensor_stTorSensorCof.uwBikeTorStep3RealNm = 750;
  160. torsensor_stTorSensorCof.uwBikeTorStep4ADC = 3103;
  161. torsensor_stTorSensorCof.uwBikeTorStep4RealNm = 1000;
  162. #endif
  163. torsensor_stTorSensorCof.uwSensorVolPerTorqDefault = TORQUE_VOLTAGE_PER_NM;
  164. torsensor_stTorSensorCof.ulTorqueReg2PuDefault = (ULONG)((((UQWORD)33 << 24) / 10) / (1 << ADC_RESOLUTION_BIT) / TORQUE_VOLTAGE_SEN2MCUGAIN * 100 * 1000 /
  165. torsensor_stTorSensorCof.uwSensorVolPerTorqDefault / TORQUEBASE *
  166. 10); // 3.3/4096/harwaregain/VolPerNm/TorqueBase;
  167. torsensor_stTorSensorCof.ulTorqueReg2Pu1 = (ULONG)(((UQWORD)(torsensor_stTorSensorCof.uwBikeTorStep1RealNm - 0) << 24) /
  168. (torsensor_stTorSensorCof.uwBikeTorStep1ADC - torsensor_stTorSensorCof.uwTorqueOffset) /TORQUEBASE);
  169. torsensor_stTorSensorCof.ulTorqueReg2Pu2 = (ULONG)(((UQWORD)(torsensor_stTorSensorCof.uwBikeTorStep2RealNm - torsensor_stTorSensorCof.uwBikeTorStep1RealNm) << 24) /
  170. (torsensor_stTorSensorCof.uwBikeTorStep2ADC - torsensor_stTorSensorCof.uwBikeTorStep1ADC) /TORQUEBASE);
  171. torsensor_stTorSensorCof.ulTorqueReg2Pu3 = (ULONG)(((UQWORD)(torsensor_stTorSensorCof.uwBikeTorStep3RealNm - torsensor_stTorSensorCof.uwBikeTorStep2RealNm) << 24) /
  172. (torsensor_stTorSensorCof.uwBikeTorStep3ADC - torsensor_stTorSensorCof.uwBikeTorStep2ADC) /TORQUEBASE);
  173. torsensor_stTorSensorCof.ulTorqueReg2Pu4 = (ULONG)(((UQWORD)(torsensor_stTorSensorCof.uwBikeTorStep4RealNm - torsensor_stTorSensorCof.uwBikeTorStep3RealNm) << 24) /
  174. (torsensor_stTorSensorCof.uwBikeTorStep4ADC - torsensor_stTorSensorCof.uwBikeTorStep3ADC) /TORQUEBASE);
  175. torsensor_stTorSensorCof.uwBikeTorStep1NmPu = (UWORD)(((ULONG)torsensor_stTorSensorCof.uwBikeTorStep1RealNm << 14)/TORQUEBASE);
  176. torsensor_stTorSensorCof.uwBikeTorStep2NmPu = (UWORD)(((ULONG)torsensor_stTorSensorCof.uwBikeTorStep2RealNm << 14)/TORQUEBASE);
  177. torsensor_stTorSensorCof.uwBikeTorStep3NmPu = (UWORD)(((ULONG)torsensor_stTorSensorCof.uwBikeTorStep3RealNm << 14)/TORQUEBASE);
  178. torsensor_stTorSensorCof.uwBikeTorStep4NmPu = (UWORD)(((ULONG)torsensor_stTorSensorCof.uwBikeTorStep4RealNm << 14)/TORQUEBASE);
  179. /* Torque Sensor limit coef */
  180. ulLpfTm = 1000000 / torsensor_stTorSensorCof.uwTorSensorLPFFrq;
  181. mth_voLPFilterCoef(ulLpfTm, torsensor_stTorSensorCof.uwTorVolLPFDisFrq, &torq_pvt_stTorSensorLpf.uwKx);
  182. /* Torque Offset Correction Coef */
  183. // for (i = 0; i < (TORQ_OFFSET_NUM - 1); i++)
  184. // {
  185. // TorqOffsetCof[i] = (((SLONG)TorqOffsetReg[i+1] - (SLONG)TorqOffsetReg[i]) << 12) /(TorqOffsetTemp[i+1] - TorqOffsetTemp[i]); //Q12
  186. // }
  187. //
  188. // for (i = 0; i < (TORQ_OFFSET_NUM - 1); i++)
  189. // {
  190. // TorqSencitiveCof[i] = (((SLONG)TorqSencitiveReg[i+1] - (SLONG)TorqSencitiveReg[i]) << 10) /(TorqSencitiveTemp[i+1] - TorqSencitiveTemp[i]); //Q10
  191. // }
  192. }
  193. /*************************************************************************
  194. Local Functions (N/A)
  195. *************************************************************************/
  196. //static BOOL tstDynCalibflg= TRUE;
  197. //static UWORD tstTorqOffset,tstSensitiveset,TorqValue,TorqValuePu, TorqReg;
  198. //static SWORD tstTorqTemp,tstTorqTemp111,tstSencitiveOrig;
  199. //void torsensor_voCadenceCnt(void)
  200. //{
  201. // if (((cadence_stFreGetCof.uwNumbersPulses>>1)-1) != tsttorqCadCnt)
  202. // {
  203. // tsttorqCadCnt++;
  204. // }
  205. // else
  206. // {
  207. // tsttorqCadCnt = 0;
  208. // tsttorqMin = 4096;
  209. // }
  210. //}
  211. //void torsensor_voDynamicOffset(void)
  212. //{
  213. // if(cadence_stFreGetOut.uwLPFFrequencyPu != 0)
  214. // {
  215. // tstDynCalibflg = TRUE;
  216. // if(tsttorqMin > iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH])
  217. // {
  218. // tsttorqMin = iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH];
  219. // }
  220. // if(tsttorqCadCnt == ((cadence_stFreGetCof.uwNumbersPulses>>1) -1))
  221. // {
  222. // tstdynOffset = tsttorqMin;
  223. // }
  224. // }
  225. // else
  226. // {
  227. // if( tstDynCalibflg == TRUE && TorqValuePu <= 500)
  228. // {
  229. // tstdynOffset = iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH];
  230. // tstDynCalibflg = FALSE;
  231. // }
  232. // }
  233. // mth_voLPFilter((SWORD)tstdynOffset, &tst_dynOffsetLpf);
  234. //}
  235. //static void torsensor_voTorADCwithTemp(void)
  236. //{
  237. // tstTorqTemp = temp_swTorqTempCal(hw_uwADC0[4]); // 0.1 C
  238. //// tstTorqOffset = torsensor_uwTorqOffsetCal(tstTorqTemp); // Torque AD
  239. // tstTorqOffset= tst_dynOffsetLpf.slY.sw.hi;// 1478; //tstdynOffset;
  240. // tstSensitiveset = torsensor_uwTorqSencitiveCal(tstTorqTemp/10, 250); //Q12
  241. //
  242. // torsensor_stTorSensorOut.uwTorqueReg = hw_uwADC0[7];
  243. //
  244. // if(((SLONG)torsensor_stTorSensorOut.uwTorqueReg - tstTorqOffset) < 0)
  245. // {
  246. // TorqReg = torsensor_stTorSensorCof.uwTorqueOffset;
  247. // }
  248. // else
  249. // {
  250. // TorqReg = (((SLONG)torsensor_stTorSensorOut.uwTorqueReg - tstTorqOffset) *10000) / tstSensitiveset + torsensor_stTorSensorCof.uwTorqueOffset;
  251. // }
  252. //
  253. //
  254. // if (TorqReg <= torsensor_stTorSensorCof.uwTorqueOffset)
  255. // {
  256. // TorqValuePu = 0;
  257. // }
  258. // else if (TorqReg <= torsensor_stTorSensorCof.uwBikeTorStep1ADC)
  259. // {
  260. // TorqValuePu = 0 +
  261. // ((((SQWORD)ABS((SWORD)(TorqReg) - torsensor_stTorSensorCof.uwTorqueOffset)) *
  262. // torsensor_stTorSensorCof.ulTorqueReg2Pu1) >>
  263. // 10); // Q14
  264. // }
  265. // else if (TorqReg <= torsensor_stTorSensorCof.uwBikeTorStep2ADC)
  266. // {
  267. // TorqValuePu = torsensor_stTorSensorCof.uwBikeTorStep1NmPu +
  268. // ((((SQWORD)ABS((SWORD)(TorqReg) - torsensor_stTorSensorCof.uwBikeTorStep1ADC)) *
  269. // torsensor_stTorSensorCof.ulTorqueReg2Pu2) >>
  270. // 10); // Q14
  271. // }
  272. // else if (TorqReg <= torsensor_stTorSensorCof.uwBikeTorStep3ADC)
  273. // {
  274. // TorqValuePu = torsensor_stTorSensorCof.uwBikeTorStep2NmPu +
  275. // ((((SQWORD)ABS((SWORD)(TorqReg) - torsensor_stTorSensorCof.uwBikeTorStep2ADC)) *
  276. // torsensor_stTorSensorCof.ulTorqueReg2Pu3) >>
  277. // 10); // Q14
  278. // }
  279. // else if (TorqReg<= torsensor_stTorSensorCof.uwBikeTorStep4ADC)
  280. // {
  281. // TorqValuePu = torsensor_stTorSensorCof.uwBikeTorStep3NmPu +
  282. // ((((SQWORD)ABS((SWORD)(TorqReg) - torsensor_stTorSensorCof.uwBikeTorStep3ADC)) *
  283. // torsensor_stTorSensorCof.ulTorqueReg2Pu4) >>
  284. // 10); // Q14
  285. // }
  286. // else
  287. // {
  288. // TorqValuePu = torsensor_stTorSensorCof.uwBikeTorStep4NmPu;
  289. // }
  290. // torsensor_stTorSensorOut.uwTorquePu=TorqValuePu;
  291. // mth_voLPFilter(torsensor_stTorSensorOut.uwTorquePu, &torq_pvt_stTorSensorLpf);
  292. // torsensor_stTorSensorOut.uwTorqueLPFPu = torq_pvt_stTorSensorLpf.slY.sw.hi;
  293. // TorqValue = (ULONG)TorqValuePu * TORQUEBASE >> 14;
  294. //
  295. // //TorqValue = ((torsensor_stTorSensorOut.uwTorqueReg - tstTorqOffset) << 12 )/tstSencitiveset;
  296. //}
  297. /***************************************************************
  298. Function:
  299. Description:
  300. Call by:
  301. Input Variables: N/A
  302. Output/Return Variables: N/A
  303. Subroutine Call: N/A
  304. Reference: N/A
  305. ****************************************************************/
  306. static UWORD tor_pvt_uwOffsetTarget = 0;
  307. static UWORD tor_pvt_uwOffsetMax = 0,tor_pvt_uwOffsetMin = 4096;
  308. static ULONG tor_pvt_ulCnt = 0, tor_pvt_ulCnt2 = 0;
  309. void torsensor_voOffsetUpdate(void)
  310. {
  311. SWORD swTorDelta;
  312. ++tor_pvt_ulCnt;
  313. if(0 == (tor_pvt_ulCnt % TORQUE_1S_1MSCNT))
  314. {
  315. swTorDelta = (SWORD)tor_pvt_uwOffsetMax - (SWORD)tor_pvt_uwOffsetMin;
  316. if(swTorDelta > 40)
  317. {
  318. tor_pvt_ulCnt = 0;
  319. tor_pvt_uwOffsetTarget = torsensor_stTorSensorCof.uwTorqueOffset;
  320. }
  321. else
  322. {
  323. tor_pvt_uwOffsetTarget = (tor_pvt_uwOffsetMax + tor_pvt_uwOffsetMin) >> 1;
  324. }
  325. tor_pvt_uwOffsetMax = 0;
  326. tor_pvt_uwOffsetMin = 4096;
  327. }
  328. else
  329. {
  330. if(tor_pvt_uwOffsetMin > torsensor_stTorSensorOut.uwTorqueReg)
  331. {
  332. tor_pvt_uwOffsetMin = torsensor_stTorSensorOut.uwTorqueReg;
  333. }
  334. if(tor_pvt_uwOffsetMax < torsensor_stTorSensorOut.uwTorqueReg)
  335. {
  336. tor_pvt_uwOffsetMax = torsensor_stTorSensorOut.uwTorqueReg;
  337. }
  338. }
  339. if(tor_pvt_ulCnt > TORQUE_90S_1MSCNT)
  340. {
  341. if(tor_pvt_uwOffsetTarget != torsensor_stTorSensorCof.uwTorqueOffset)
  342. {
  343. if(torsensor_stTorSensorCof.uwTorqueOffset < tor_pvt_uwOffsetTarget - 20)
  344. {
  345. torsensor_stTorSensorCof.uwTorqueOffset += 20;
  346. }
  347. else if (torsensor_stTorSensorCof.uwTorqueOffset > tor_pvt_uwOffsetTarget + 20)
  348. {
  349. torsensor_stTorSensorCof.uwTorqueOffset -= 20;
  350. }
  351. else
  352. {
  353. torsensor_stTorSensorCof.uwTorqueOffset = tor_pvt_uwOffsetTarget;
  354. }
  355. torsensor_stTorSensorCof.ulTorqueReg2Pu1 = (ULONG)(((UQWORD)(torsensor_stTorSensorCof.uwBikeTorStep1RealNm - 0) << 24) /
  356. (torsensor_stTorSensorCof.uwBikeTorStep1ADC - torsensor_stTorSensorCof.uwTorqueOffset) /TORQUEBASE);
  357. }
  358. tor_pvt_ulCnt = 0;
  359. }
  360. }
  361. /***************************************************************
  362. Function:
  363. Description:
  364. Call by:
  365. Input Variables: N/A
  366. Output/Return Variables: N/A
  367. Subroutine Call: N/A
  368. Reference: N/A
  369. ****************************************************************/
  370. void torsensor_voTorADC(void) // need to match ADC_StartConversion(ADC1);
  371. {
  372. torsensor_stTorSensorOut.uwTorqueReg = iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH];
  373. #if (TORSENSOR_USEMOL == TORSENSOR_USEDEFAULT)
  374. torsensor_stTorSensorOut.uwTorquePu =
  375. (((SQWORD)ABS((SWORD)(torsensor_stTorSensorOut.uwTorqueReg) - torsensor_stTorSensorCof.uwTorqueOffset)) *
  376. torsensor_stTorSensorCof.ulTorqueReg2PuDefault) >>
  377. 10; // Q14
  378. #elif (TORSENSOR_USEMOL == TORSENSOR_USEEE)
  379. if (torsensor_stTorSensorOut.uwTorqueReg <= torsensor_stTorSensorCof.uwTorqueOffset)
  380. {
  381. torsensor_stTorSensorOut.uwTorquePu = 0;
  382. }
  383. else if (torsensor_stTorSensorOut.uwTorqueReg <= torsensor_stTorSensorCof.uwBikeTorStep1ADC)
  384. {
  385. torsensor_stTorSensorOut.uwTorquePu = (UWORD)(0 +
  386. ((((UQWORD)ABS((SWORD)torsensor_stTorSensorOut.uwTorqueReg - torsensor_stTorSensorCof.uwTorqueOffset)) *
  387. torsensor_stTorSensorCof.ulTorqueReg2Pu1) >> 10)); // Q14
  388. }
  389. else if (torsensor_stTorSensorOut.uwTorqueReg <= torsensor_stTorSensorCof.uwBikeTorStep2ADC)
  390. {
  391. torsensor_stTorSensorOut.uwTorquePu = (UWORD)(torsensor_stTorSensorCof.uwBikeTorStep1NmPu +
  392. ((((UQWORD)ABS((SWORD)torsensor_stTorSensorOut.uwTorqueReg - torsensor_stTorSensorCof.uwBikeTorStep1ADC)) *
  393. torsensor_stTorSensorCof.ulTorqueReg2Pu2) >> 10)); // Q14
  394. }
  395. else if (torsensor_stTorSensorOut.uwTorqueReg <= torsensor_stTorSensorCof.uwBikeTorStep3ADC)
  396. {
  397. torsensor_stTorSensorOut.uwTorquePu = (UWORD)(torsensor_stTorSensorCof.uwBikeTorStep2NmPu +
  398. ((((UQWORD)ABS((SWORD)torsensor_stTorSensorOut.uwTorqueReg - torsensor_stTorSensorCof.uwBikeTorStep2ADC)) *
  399. torsensor_stTorSensorCof.ulTorqueReg2Pu3) >> 10)); // Q14
  400. }
  401. else if (torsensor_stTorSensorOut.uwTorqueReg <= torsensor_stTorSensorCof.uwBikeTorStep4ADC)
  402. {
  403. torsensor_stTorSensorOut.uwTorquePu = (UWORD)(torsensor_stTorSensorCof.uwBikeTorStep3NmPu +
  404. ((((UQWORD)ABS((SWORD)torsensor_stTorSensorOut.uwTorqueReg - torsensor_stTorSensorCof.uwBikeTorStep3ADC)) *
  405. torsensor_stTorSensorCof.ulTorqueReg2Pu4) >> 10)); // Q14
  406. }
  407. else
  408. {
  409. torsensor_stTorSensorOut.uwTorquePu = torsensor_stTorSensorCof.uwBikeTorStep4NmPu;
  410. }
  411. #endif
  412. mth_voLPFilter((SWORD)torsensor_stTorSensorOut.uwTorquePu, &torq_pvt_stTorSensorLpf);
  413. torsensor_stTorSensorOut.uwTorqueLPFPu = (UWORD)torq_pvt_stTorSensorLpf.slY.sw.hi;
  414. torsensor_stTorSensorOut.uwTorquePercent = (UWORD)(((ULONG)torsensor_stTorSensorOut.uwTorqueLPFPu << 14) /
  415. (torsensor_stTorSensorCof.uwMaxSensorTorquePu - torsensor_stTorSensorCof.uwMinSensorTorquePu)); // Q15
  416. }
  417. /***************************************************************
  418. Function:
  419. Description:
  420. Call by:
  421. Input Variables: N/A
  422. Output/Return Variables: N/A
  423. Subroutine Call: N/A
  424. Reference: N/A
  425. ****************************************************************/
  426. //UWORD torsensor_uwTorqOffsetCal(SWORD Temp)
  427. //{
  428. // UWORD Offset = 0, i = 0;
  429. //
  430. // if(Temp < TorqOffsetTemp[0])
  431. // {
  432. // Offset = TorqOffsetReg[0];
  433. // }
  434. // else if(Temp >= TorqOffsetTemp[TORQ_OFFSET_NUM - 1])
  435. // {
  436. // Offset = TorqOffsetReg[TORQ_OFFSET_NUM - 1];
  437. // }
  438. // else
  439. // {
  440. // for (i = 0; i < (TORQ_OFFSET_NUM - 1); i++)
  441. // {
  442. // if(Temp >= TorqOffsetTemp[i] && Temp < TorqOffsetTemp[i+1])
  443. // {
  444. // Offset = TorqOffsetReg[i] + (TorqOffsetCof[i] * (Temp - TorqOffsetTemp[i]) >> 12);
  445. // break;
  446. // }
  447. // }
  448. // }
  449. //
  450. // return Offset;
  451. //}
  452. //UWORD torsensor_uwTorqSencitiveCal(SWORD Temp, SWORD T0)
  453. //{
  454. //// UWORD Sencitive = 0, i = 0;
  455. ////
  456. //// if(Temp < TorqSencitiveTemp[0])
  457. //// {
  458. //// Sencitive = TorqSencitiveReg[0];
  459. //// }
  460. //// else if(Temp >= TorqSencitiveTemp[TORQ_OFFSET_NUM - 1])
  461. //// {
  462. //// Sencitive = TorqSencitiveReg[TORQ_OFFSET_NUM - 1];
  463. //// }
  464. //// else
  465. //// {
  466. //// for (i = 0; i < (TORQ_OFFSET_NUM - 1); i++)
  467. //// {
  468. //// if(Temp >= TorqSencitiveTemp[i] && Temp < TorqSencitiveTemp[i+1])
  469. //// {
  470. //// Sencitive = TorqSencitiveReg[i] + (TorqSencitiveCof[i] * (Temp - TorqSencitiveTemp[i]) >> 10); // Q10
  471. //// break;
  472. //// }
  473. //// }
  474. //// }
  475. ////
  476. //// return Sencitive;
  477. //
  478. // UWORD a = 108, b = 939, sensitive = 0; //a=0.00010846, b= 0.93899723
  479. // SWORD DeltaTemp = 0;
  480. // SLONG g = 0;
  481. //
  482. // DeltaTemp = Temp - T0; //unit: 0.1 C
  483. //
  484. // g =(SLONG)b * DeltaTemp + (SLONG)a * DeltaTemp * DeltaTemp / 1000;
  485. //
  486. // sensitive = 10000 + g / 100;
  487. //
  488. // return sensitive;
  489. //
  490. //}
  491. /***************************************************************
  492. Function: torsensor_voTorSensorInit;
  493. Description: Torque initialization
  494. Call by: functions in main loop;
  495. Input Variables: N/A
  496. Output/Return Variables: N/A
  497. Subroutine Call: N/A;
  498. Reference: N/A
  499. ****************************************************************/
  500. static LPF_OUT tst_dynOffsetLpf;
  501. static UWORD tsttorqCadCnt,tsttorqMin=4096,tstdynOffset;
  502. void torsensor_voTorSensorInit(void)
  503. {
  504. torsensor_stTorSensorOut.uwTorqueReg = 0;
  505. torsensor_stTorSensorOut.uwTorquePu = 0;
  506. torsensor_stTorSensorOut.uwTorqueLPFPu = 0;
  507. torsensor_stTorSensorOut.uwTorqueErrorCnt = 0;
  508. torsensor_stTorSensorOut.blTorqueCaliFlg = FALSE;
  509. torsensor_stTorSensorOut.blTorqueErrorFlg = FALSE;
  510. mth_voLPFilterCoef(1000000 / 1, EVENT_1MS_HZ, &tst_dynOffsetLpf.uwKx); //25Hz
  511. tstdynOffset= iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH];
  512. tst_dynOffsetLpf.slY.sw.hi = (SWORD)iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH];
  513. tor_pvt_uwOffsetTarget = 0;
  514. tor_pvt_uwOffsetMax = 0;
  515. tor_pvt_uwOffsetMin = 4096;
  516. tor_pvt_ulCnt = 0;
  517. tor_pvt_ulCnt2 = 0;
  518. }
  519. /*************************************************************************
  520. Local Functions (N/A)
  521. *************************************************************************/
  522. /*************************************************************************
  523. End of this File (EOF)!
  524. Do not put anything after this part!
  525. *************************************************************************/