torquesensor.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  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. torsensor_stTorSensorCof.uwSensorVolPerTorqDefault = TORQUE_VOLTAGE_PER_NM;
  153. torsensor_stTorSensorCof.ulTorqueReg2PuDefault = (ULONG)((((UQWORD)33 << 24) / 10) / (1 << ADC_RESOLUTION_BIT) / TORQUE_VOLTAGE_SEN2MCUGAIN * 100 * 1000 /
  154. torsensor_stTorSensorCof.uwSensorVolPerTorqDefault / TORQUEBASE *
  155. 10); // 3.3/4096/harwaregain/VolPerNm/TorqueBase;
  156. torsensor_stTorSensorCof.ulTorqueReg2Pu1 = (ULONG)(((UQWORD)(torsensor_stTorSensorCof.uwBikeTorStep1RealNm - 0) << 24) /
  157. (torsensor_stTorSensorCof.uwBikeTorStep1ADC - torsensor_stTorSensorCof.uwTorqueOffset) /TORQUEBASE);
  158. torsensor_stTorSensorCof.ulTorqueReg2Pu2 = (ULONG)(((UQWORD)(torsensor_stTorSensorCof.uwBikeTorStep2RealNm - torsensor_stTorSensorCof.uwBikeTorStep1RealNm) << 24) /
  159. (torsensor_stTorSensorCof.uwBikeTorStep2ADC - torsensor_stTorSensorCof.uwBikeTorStep1ADC) /TORQUEBASE);
  160. torsensor_stTorSensorCof.ulTorqueReg2Pu3 = (ULONG)(((UQWORD)(torsensor_stTorSensorCof.uwBikeTorStep3RealNm - torsensor_stTorSensorCof.uwBikeTorStep2RealNm) << 24) /
  161. (torsensor_stTorSensorCof.uwBikeTorStep3ADC - torsensor_stTorSensorCof.uwBikeTorStep2ADC) /TORQUEBASE);
  162. torsensor_stTorSensorCof.ulTorqueReg2Pu4 = (ULONG)(((UQWORD)(torsensor_stTorSensorCof.uwBikeTorStep4RealNm - torsensor_stTorSensorCof.uwBikeTorStep3RealNm) << 24) /
  163. (torsensor_stTorSensorCof.uwBikeTorStep4ADC - torsensor_stTorSensorCof.uwBikeTorStep3ADC) /TORQUEBASE);
  164. torsensor_stTorSensorCof.uwBikeTorStep1NmPu = (UWORD)(((ULONG)torsensor_stTorSensorCof.uwBikeTorStep1RealNm << 14)/TORQUEBASE);
  165. torsensor_stTorSensorCof.uwBikeTorStep2NmPu = (UWORD)(((ULONG)torsensor_stTorSensorCof.uwBikeTorStep2RealNm << 14)/TORQUEBASE);
  166. torsensor_stTorSensorCof.uwBikeTorStep3NmPu = (UWORD)(((ULONG)torsensor_stTorSensorCof.uwBikeTorStep3RealNm << 14)/TORQUEBASE);
  167. torsensor_stTorSensorCof.uwBikeTorStep4NmPu = (UWORD)(((ULONG)torsensor_stTorSensorCof.uwBikeTorStep4RealNm << 14)/TORQUEBASE);
  168. /* Torque Sensor limit coef */
  169. ulLpfTm = 1000000 / torsensor_stTorSensorCof.uwTorSensorLPFFrq;
  170. mth_voLPFilterCoef(ulLpfTm, torsensor_stTorSensorCof.uwTorVolLPFDisFrq, &torq_pvt_stTorSensorLpf.uwKx);
  171. /* Torque Offset Correction Coef */
  172. // for (i = 0; i < (TORQ_OFFSET_NUM - 1); i++)
  173. // {
  174. // TorqOffsetCof[i] = (((SLONG)TorqOffsetReg[i+1] - (SLONG)TorqOffsetReg[i]) << 12) /(TorqOffsetTemp[i+1] - TorqOffsetTemp[i]); //Q12
  175. // }
  176. //
  177. // for (i = 0; i < (TORQ_OFFSET_NUM - 1); i++)
  178. // {
  179. // TorqSencitiveCof[i] = (((SLONG)TorqSencitiveReg[i+1] - (SLONG)TorqSencitiveReg[i]) << 10) /(TorqSencitiveTemp[i+1] - TorqSencitiveTemp[i]); //Q10
  180. // }
  181. }
  182. /*************************************************************************
  183. Local Functions (N/A)
  184. *************************************************************************/
  185. //static BOOL tstDynCalibflg= TRUE;
  186. //static UWORD tstTorqOffset,tstSensitiveset,TorqValue,TorqValuePu, TorqReg;
  187. //static SWORD tstTorqTemp,tstTorqTemp111,tstSencitiveOrig;
  188. //void torsensor_voCadenceCnt(void)
  189. //{
  190. // if (((cadence_stFreGetCof.uwNumbersPulses>>1)-1) != tsttorqCadCnt)
  191. // {
  192. // tsttorqCadCnt++;
  193. // }
  194. // else
  195. // {
  196. // tsttorqCadCnt = 0;
  197. // tsttorqMin = 4096;
  198. // }
  199. //}
  200. //void torsensor_voDynamicOffset(void)
  201. //{
  202. // if(cadence_stFreGetOut.uwLPFFrequencyPu != 0)
  203. // {
  204. // tstDynCalibflg = TRUE;
  205. // if(tsttorqMin > iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH])
  206. // {
  207. // tsttorqMin = iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH];
  208. // }
  209. // if(tsttorqCadCnt == ((cadence_stFreGetCof.uwNumbersPulses>>1) -1))
  210. // {
  211. // tstdynOffset = tsttorqMin;
  212. // }
  213. // }
  214. // else
  215. // {
  216. // if( tstDynCalibflg == TRUE && TorqValuePu <= 500)
  217. // {
  218. // tstdynOffset = iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH];
  219. // tstDynCalibflg = FALSE;
  220. // }
  221. // }
  222. // mth_voLPFilter((SWORD)tstdynOffset, &tst_dynOffsetLpf);
  223. //}
  224. //static void torsensor_voTorADCwithTemp(void)
  225. //{
  226. // tstTorqTemp = temp_swTorqTempCal(hw_uwADC0[4]); // 0.1 C
  227. //// tstTorqOffset = torsensor_uwTorqOffsetCal(tstTorqTemp); // Torque AD
  228. // tstTorqOffset= tst_dynOffsetLpf.slY.sw.hi;// 1478; //tstdynOffset;
  229. // tstSensitiveset = torsensor_uwTorqSencitiveCal(tstTorqTemp/10, 250); //Q12
  230. //
  231. // torsensor_stTorSensorOut.uwTorqueReg = hw_uwADC0[7];
  232. //
  233. // if(((SLONG)torsensor_stTorSensorOut.uwTorqueReg - tstTorqOffset) < 0)
  234. // {
  235. // TorqReg = torsensor_stTorSensorCof.uwTorqueOffset;
  236. // }
  237. // else
  238. // {
  239. // TorqReg = (((SLONG)torsensor_stTorSensorOut.uwTorqueReg - tstTorqOffset) *10000) / tstSensitiveset + torsensor_stTorSensorCof.uwTorqueOffset;
  240. // }
  241. //
  242. //
  243. // if (TorqReg <= torsensor_stTorSensorCof.uwTorqueOffset)
  244. // {
  245. // TorqValuePu = 0;
  246. // }
  247. // else if (TorqReg <= torsensor_stTorSensorCof.uwBikeTorStep1ADC)
  248. // {
  249. // TorqValuePu = 0 +
  250. // ((((SQWORD)ABS((SWORD)(TorqReg) - torsensor_stTorSensorCof.uwTorqueOffset)) *
  251. // torsensor_stTorSensorCof.ulTorqueReg2Pu1) >>
  252. // 10); // Q14
  253. // }
  254. // else if (TorqReg <= torsensor_stTorSensorCof.uwBikeTorStep2ADC)
  255. // {
  256. // TorqValuePu = torsensor_stTorSensorCof.uwBikeTorStep1NmPu +
  257. // ((((SQWORD)ABS((SWORD)(TorqReg) - torsensor_stTorSensorCof.uwBikeTorStep1ADC)) *
  258. // torsensor_stTorSensorCof.ulTorqueReg2Pu2) >>
  259. // 10); // Q14
  260. // }
  261. // else if (TorqReg <= torsensor_stTorSensorCof.uwBikeTorStep3ADC)
  262. // {
  263. // TorqValuePu = torsensor_stTorSensorCof.uwBikeTorStep2NmPu +
  264. // ((((SQWORD)ABS((SWORD)(TorqReg) - torsensor_stTorSensorCof.uwBikeTorStep2ADC)) *
  265. // torsensor_stTorSensorCof.ulTorqueReg2Pu3) >>
  266. // 10); // Q14
  267. // }
  268. // else if (TorqReg<= torsensor_stTorSensorCof.uwBikeTorStep4ADC)
  269. // {
  270. // TorqValuePu = torsensor_stTorSensorCof.uwBikeTorStep3NmPu +
  271. // ((((SQWORD)ABS((SWORD)(TorqReg) - torsensor_stTorSensorCof.uwBikeTorStep3ADC)) *
  272. // torsensor_stTorSensorCof.ulTorqueReg2Pu4) >>
  273. // 10); // Q14
  274. // }
  275. // else
  276. // {
  277. // TorqValuePu = torsensor_stTorSensorCof.uwBikeTorStep4NmPu;
  278. // }
  279. // torsensor_stTorSensorOut.uwTorquePu=TorqValuePu;
  280. // mth_voLPFilter(torsensor_stTorSensorOut.uwTorquePu, &torq_pvt_stTorSensorLpf);
  281. // torsensor_stTorSensorOut.uwTorqueLPFPu = torq_pvt_stTorSensorLpf.slY.sw.hi;
  282. // TorqValue = (ULONG)TorqValuePu * TORQUEBASE >> 14;
  283. //
  284. // //TorqValue = ((torsensor_stTorSensorOut.uwTorqueReg - tstTorqOffset) << 12 )/tstSencitiveset;
  285. //}
  286. /***************************************************************
  287. Function:
  288. Description:
  289. Call by:
  290. Input Variables: N/A
  291. Output/Return Variables: N/A
  292. Subroutine Call: N/A
  293. Reference: N/A
  294. ****************************************************************/
  295. static UWORD tor_pvt_uwOffsetTarget = 0;
  296. static UWORD tor_pvt_uwOffsetMax = 0,tor_pvt_uwOffsetMin = 4096;
  297. static ULONG tor_pvt_ulCnt = 0, tor_pvt_ulCnt2 = 0;
  298. void torsensor_voOffsetUpdate(void)
  299. {
  300. SWORD swTorDelta;
  301. ++tor_pvt_ulCnt;
  302. if(0 == (tor_pvt_ulCnt % TORQUE_1S_1MSCNT))
  303. {
  304. swTorDelta = (SWORD)tor_pvt_uwOffsetMax - (SWORD)tor_pvt_uwOffsetMin;
  305. if(swTorDelta > 40)
  306. {
  307. tor_pvt_ulCnt = 0;
  308. tor_pvt_uwOffsetTarget = torsensor_stTorSensorCof.uwTorqueOffset;
  309. }
  310. else
  311. {
  312. tor_pvt_uwOffsetTarget = (tor_pvt_uwOffsetMax + tor_pvt_uwOffsetMin) >> 1;
  313. }
  314. tor_pvt_uwOffsetMax = 0;
  315. tor_pvt_uwOffsetMin = 4096;
  316. }
  317. else
  318. {
  319. if(tor_pvt_uwOffsetMin > torsensor_stTorSensorOut.uwTorqueReg)
  320. {
  321. tor_pvt_uwOffsetMin = torsensor_stTorSensorOut.uwTorqueReg;
  322. }
  323. if(tor_pvt_uwOffsetMax < torsensor_stTorSensorOut.uwTorqueReg)
  324. {
  325. tor_pvt_uwOffsetMax = torsensor_stTorSensorOut.uwTorqueReg;
  326. }
  327. }
  328. if(tor_pvt_ulCnt > TORQUE_90S_1MSCNT)
  329. {
  330. if(tor_pvt_uwOffsetTarget != torsensor_stTorSensorCof.uwTorqueOffset)
  331. {
  332. if(torsensor_stTorSensorCof.uwTorqueOffset < tor_pvt_uwOffsetTarget - 20)
  333. {
  334. torsensor_stTorSensorCof.uwTorqueOffset += 20;
  335. }
  336. else if (torsensor_stTorSensorCof.uwTorqueOffset > tor_pvt_uwOffsetTarget + 20)
  337. {
  338. torsensor_stTorSensorCof.uwTorqueOffset -= 20;
  339. }
  340. else
  341. {
  342. torsensor_stTorSensorCof.uwTorqueOffset = tor_pvt_uwOffsetTarget;
  343. }
  344. torsensor_stTorSensorCof.ulTorqueReg2Pu1 = (ULONG)(((UQWORD)(torsensor_stTorSensorCof.uwBikeTorStep1RealNm - 0) << 24) /
  345. (torsensor_stTorSensorCof.uwBikeTorStep1ADC - torsensor_stTorSensorCof.uwTorqueOffset) /TORQUEBASE);
  346. }
  347. tor_pvt_ulCnt = 0;
  348. }
  349. }
  350. /***************************************************************
  351. Function:
  352. Description:
  353. Call by:
  354. Input Variables: N/A
  355. Output/Return Variables: N/A
  356. Subroutine Call: N/A
  357. Reference: N/A
  358. ****************************************************************/
  359. void torsensor_voTorADC(void) // need to match ADC_StartConversion(ADC1);
  360. {
  361. torsensor_stTorSensorOut.uwTorqueReg = iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH];
  362. #if (TORSENSOR_USEMOL == TORSENSOR_USEDEFAULT)
  363. torsensor_stTorSensorOut.uwTorquePu =
  364. (((SQWORD)ABS((SWORD)(torsensor_stTorSensorOut.uwTorqueReg) - torsensor_stTorSensorCof.uwTorqueOffset)) *
  365. torsensor_stTorSensorCof.ulTorqueReg2PuDefault) >>
  366. 10; // Q14
  367. #elif (TORSENSOR_USEMOL == TORSENSOR_USEEE)
  368. if (torsensor_stTorSensorOut.uwTorqueReg <= torsensor_stTorSensorCof.uwTorqueOffset)
  369. {
  370. torsensor_stTorSensorOut.uwTorquePu = 0;
  371. }
  372. else if (torsensor_stTorSensorOut.uwTorqueReg <= torsensor_stTorSensorCof.uwBikeTorStep1ADC)
  373. {
  374. torsensor_stTorSensorOut.uwTorquePu = (UWORD)(0 +
  375. ((((UQWORD)ABS((SWORD)torsensor_stTorSensorOut.uwTorqueReg - torsensor_stTorSensorCof.uwTorqueOffset)) *
  376. torsensor_stTorSensorCof.ulTorqueReg2Pu1) >> 10)); // Q14
  377. }
  378. else if (torsensor_stTorSensorOut.uwTorqueReg <= torsensor_stTorSensorCof.uwBikeTorStep2ADC)
  379. {
  380. torsensor_stTorSensorOut.uwTorquePu = (UWORD)(torsensor_stTorSensorCof.uwBikeTorStep1NmPu +
  381. ((((UQWORD)ABS((SWORD)torsensor_stTorSensorOut.uwTorqueReg - torsensor_stTorSensorCof.uwBikeTorStep1ADC)) *
  382. torsensor_stTorSensorCof.ulTorqueReg2Pu2) >> 10)); // Q14
  383. }
  384. else if (torsensor_stTorSensorOut.uwTorqueReg <= torsensor_stTorSensorCof.uwBikeTorStep3ADC)
  385. {
  386. torsensor_stTorSensorOut.uwTorquePu = (UWORD)(torsensor_stTorSensorCof.uwBikeTorStep2NmPu +
  387. ((((UQWORD)ABS((SWORD)torsensor_stTorSensorOut.uwTorqueReg - torsensor_stTorSensorCof.uwBikeTorStep2ADC)) *
  388. torsensor_stTorSensorCof.ulTorqueReg2Pu3) >> 10)); // Q14
  389. }
  390. else if (torsensor_stTorSensorOut.uwTorqueReg <= torsensor_stTorSensorCof.uwBikeTorStep4ADC)
  391. {
  392. torsensor_stTorSensorOut.uwTorquePu = (UWORD)(torsensor_stTorSensorCof.uwBikeTorStep3NmPu +
  393. ((((UQWORD)ABS((SWORD)torsensor_stTorSensorOut.uwTorqueReg - torsensor_stTorSensorCof.uwBikeTorStep3ADC)) *
  394. torsensor_stTorSensorCof.ulTorqueReg2Pu4) >> 10)); // Q14
  395. }
  396. else
  397. {
  398. torsensor_stTorSensorOut.uwTorquePu = torsensor_stTorSensorCof.uwBikeTorStep4NmPu;
  399. }
  400. #endif
  401. mth_voLPFilter((SWORD)torsensor_stTorSensorOut.uwTorquePu, &torq_pvt_stTorSensorLpf);
  402. torsensor_stTorSensorOut.uwTorqueLPFPu = (UWORD)torq_pvt_stTorSensorLpf.slY.sw.hi;
  403. torsensor_stTorSensorOut.uwTorquePercent = (UWORD)(((ULONG)torsensor_stTorSensorOut.uwTorqueLPFPu << 14) /
  404. (torsensor_stTorSensorCof.uwMaxSensorTorquePu - torsensor_stTorSensorCof.uwMinSensorTorquePu)); // Q15
  405. }
  406. /***************************************************************
  407. Function:
  408. Description:
  409. Call by:
  410. Input Variables: N/A
  411. Output/Return Variables: N/A
  412. Subroutine Call: N/A
  413. Reference: N/A
  414. ****************************************************************/
  415. //UWORD torsensor_uwTorqOffsetCal(SWORD Temp)
  416. //{
  417. // UWORD Offset = 0, i = 0;
  418. //
  419. // if(Temp < TorqOffsetTemp[0])
  420. // {
  421. // Offset = TorqOffsetReg[0];
  422. // }
  423. // else if(Temp >= TorqOffsetTemp[TORQ_OFFSET_NUM - 1])
  424. // {
  425. // Offset = TorqOffsetReg[TORQ_OFFSET_NUM - 1];
  426. // }
  427. // else
  428. // {
  429. // for (i = 0; i < (TORQ_OFFSET_NUM - 1); i++)
  430. // {
  431. // if(Temp >= TorqOffsetTemp[i] && Temp < TorqOffsetTemp[i+1])
  432. // {
  433. // Offset = TorqOffsetReg[i] + (TorqOffsetCof[i] * (Temp - TorqOffsetTemp[i]) >> 12);
  434. // break;
  435. // }
  436. // }
  437. // }
  438. //
  439. // return Offset;
  440. //}
  441. //UWORD torsensor_uwTorqSencitiveCal(SWORD Temp, SWORD T0)
  442. //{
  443. //// UWORD Sencitive = 0, i = 0;
  444. ////
  445. //// if(Temp < TorqSencitiveTemp[0])
  446. //// {
  447. //// Sencitive = TorqSencitiveReg[0];
  448. //// }
  449. //// else if(Temp >= TorqSencitiveTemp[TORQ_OFFSET_NUM - 1])
  450. //// {
  451. //// Sencitive = TorqSencitiveReg[TORQ_OFFSET_NUM - 1];
  452. //// }
  453. //// else
  454. //// {
  455. //// for (i = 0; i < (TORQ_OFFSET_NUM - 1); i++)
  456. //// {
  457. //// if(Temp >= TorqSencitiveTemp[i] && Temp < TorqSencitiveTemp[i+1])
  458. //// {
  459. //// Sencitive = TorqSencitiveReg[i] + (TorqSencitiveCof[i] * (Temp - TorqSencitiveTemp[i]) >> 10); // Q10
  460. //// break;
  461. //// }
  462. //// }
  463. //// }
  464. ////
  465. //// return Sencitive;
  466. //
  467. // UWORD a = 108, b = 939, sensitive = 0; //a=0.00010846, b= 0.93899723
  468. // SWORD DeltaTemp = 0;
  469. // SLONG g = 0;
  470. //
  471. // DeltaTemp = Temp - T0; //unit: 0.1 C
  472. //
  473. // g =(SLONG)b * DeltaTemp + (SLONG)a * DeltaTemp * DeltaTemp / 1000;
  474. //
  475. // sensitive = 10000 + g / 100;
  476. //
  477. // return sensitive;
  478. //
  479. //}
  480. /***************************************************************
  481. Function: torsensor_voTorSensorInit;
  482. Description: Torque initialization
  483. Call by: functions in main loop;
  484. Input Variables: N/A
  485. Output/Return Variables: N/A
  486. Subroutine Call: N/A;
  487. Reference: N/A
  488. ****************************************************************/
  489. static LPF_OUT tst_dynOffsetLpf;
  490. static UWORD tsttorqCadCnt,tsttorqMin=4096,tstdynOffset;
  491. void torsensor_voTorSensorInit(void)
  492. {
  493. torsensor_stTorSensorOut.uwTorqueReg = 0;
  494. torsensor_stTorSensorOut.uwTorquePu = 0;
  495. torsensor_stTorSensorOut.uwTorqueLPFPu = 0;
  496. torsensor_stTorSensorOut.uwTorqueErrorCnt = 0;
  497. torsensor_stTorSensorOut.blTorqueCaliFlg = FALSE;
  498. torsensor_stTorSensorOut.blTorqueErrorFlg = FALSE;
  499. mth_voLPFilterCoef(1000000 / 1, EVENT_1MS_HZ, &tst_dynOffsetLpf.uwKx); //25Hz
  500. tstdynOffset= iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH];
  501. tst_dynOffsetLpf.slY.sw.hi = (SWORD)iAdc_GetResultPointer(0)[HW_ADC_TORQ_CH];
  502. tor_pvt_uwOffsetTarget = 0;
  503. tor_pvt_uwOffsetMax = 0;
  504. tor_pvt_uwOffsetMin = 4096;
  505. tor_pvt_ulCnt = 0;
  506. tor_pvt_ulCnt2 = 0;
  507. }
  508. /*************************************************************************
  509. Local Functions (N/A)
  510. *************************************************************************/
  511. /*************************************************************************
  512. End of this File (EOF)!
  513. Do not put anything after this part!
  514. *************************************************************************/