AppFunc.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820
  1. /*
  2. * @Author : ChenJie
  3. * @Date : 2021-12-15 10:40:06
  4. * @Version : V3.0
  5. * @LastEditors : ChenJie
  6. * @LastEditTime : 2022-01-11 18:14:41
  7. * @Description : AppFunc
  8. * @FilePath : \VehicleControl\VehicleControl\src\System\Vehicle\AppFunc.c
  9. */
  10. #include "string.h"
  11. #include "stdlib.h"
  12. #include "HardwareLib.h"
  13. #include "CanVar.h"
  14. #include "math.h"
  15. #include "AppFunc.h"
  16. #include "Std_Types.h"
  17. #define Lock 0
  18. #define Unlock 1
  19. #define LockCtrl() PSwtDrv_Interface(_PSWT_INDEX_HBAK1_CHAN, Lock)
  20. #define UnlockCtrl() PSwtDrv_Interface(_PSWT_INDEX_HBAK1_CHAN, Unlock)
  21. void LockAndUnlockCtrl()
  22. {
  23. static uint16 LockDelay = 0;
  24. static uint16 UnlockDelay = 0;
  25. static uint8 CtrlFlg = 0;
  26. if (ebcd_flg_ebcManCtrlEn) //手动控制使能
  27. {
  28. if (ebcd_flg_ebcManCtrlMode==1)
  29. {
  30. if(ebcd_st_lockSensor==1)//处于锁紧状态
  31. {
  32. LockDelay = LockDelay + 10;
  33. if(LockDelay>LockDelayTime)//锁紧状态超时就解锁
  34. {
  35. Control_Times++;
  36. LockDelay = 0;
  37. CtrlFlg = Unlock;
  38. }
  39. }
  40. else if(ebcd_st_unlockSensor==1)//处于解锁状态
  41. {
  42. UnlockDelay = UnlockDelay + 10;
  43. if(UnlockDelay>UnlockDelayTime)
  44. {
  45. UnlockDelay = 0;
  46. CtrlFlg = Lock;
  47. }
  48. }
  49. }
  50. else if(ebcd_flg_ebcManCtrlMode==2)
  51. {
  52. CtrlFlg = Lock;
  53. }
  54. else if(ebcd_flg_ebcManCtrlMode==3)
  55. {
  56. CtrlFlg = Unlock;
  57. }
  58. }
  59. else //正常工作模式,暂时为空
  60. {
  61. }
  62. //锁紧解锁执行
  63. if(CtrlFlg)
  64. {
  65. UnlockCtrl();
  66. }
  67. else
  68. {
  69. LockCtrl();
  70. }
  71. }
  72. /**
  73. * @brief : 互锁检测函数
  74. * @param {*}
  75. * @return {*}
  76. */
  77. void GetHVLockState(void)
  78. {
  79. // PWM输出,互锁1检测,频率100HZ,占空比30%
  80. uint16 VehCo_fTestUI = 1000;
  81. uint16 VehCo_rTestUW = 3000;
  82. uint32 PwmFreAcq = 0;
  83. uint16 PwmDutyAcq = 0;
  84. PPWMDrv_Interface(_PPWM_INDEX_HVLOCK2, VehCo_fTestUI, VehCo_rTestUW);
  85. PulseAcqDrv_GetChanFreq(_PULSEACQ_INDEX_HVLOCK2, &PwmFreAcq, &PwmDutyAcq);
  86. if (abs(PwmFreAcq - VehCo_fTestUI) < 100 && abs(PwmDutyAcq - VehCo_rTestUW) < 500)
  87. {
  88. m_flg_HVlock1 = 1;
  89. }
  90. else
  91. {
  92. m_flg_HVlock1 = 0;
  93. }
  94. //互锁2检测,配置高有效,悬空为0则未接入,高电平为1则接入,
  95. // DINDrv_SetChanThres(_DIN_INDEX_PLUGHVLOCK, 0, 4095 * 3);
  96. m_flg_HVlock2 = DINDrv_GetChanState(_DIN_INDEX_PLUGHVLOCK);
  97. }
  98. /**
  99. * @brief : 数字量传感器信号检测函数
  100. * @param {*}
  101. * @return {*}
  102. */
  103. void GetDIOState(void)
  104. {
  105. uint8 temp[4];
  106. //松开传感器检测,配置低有效,底层悬空为1,触发为0,应用层输出悬空为0,触发为1
  107. memset(temp, 0x00, 4);
  108. ebcd_st_unlockSensor = 0;
  109. DINDrv_SetChanThres(_DIN_INDEX_UNLOCKSENSOR1, 1, 4095U);
  110. DINDrv_SetChanThres(_DIN_INDEX_UNLOCKSENSOR2, 1, 4095U);
  111. DINDrv_SetChanThres(_DIN_INDEX_UNLOCKSENSOR3, 1, 4095U);
  112. DINDrv_SetChanThres(_DIN_INDEX_UNLOCKSENSOR4, 1, 4095U);
  113. temp[0] = !DINDrv_GetChanState(_DIN_INDEX_UNLOCKSENSOR1);
  114. temp[1] = !DINDrv_GetChanState(_DIN_INDEX_UNLOCKSENSOR2);
  115. temp[2] = !DINDrv_GetChanState(_DIN_INDEX_UNLOCKSENSOR3);
  116. temp[3] = !DINDrv_GetChanState(_DIN_INDEX_UNLOCKSENSOR4);
  117. ebcd_st_unlockSensor = (getbit(temp[3], 0) << 3) | (getbit(temp[2], 0) << 2) | (getbit(temp[1], 0) << 1) | (getbit(temp[0], 0) << 0);
  118. //夹紧传感器检测,配置低有效,底层悬空为1,触发为0,应用层输出悬空为0,触发为1
  119. memset(temp, 0x00, 4);
  120. ebcd_st_lockSensor = 0;
  121. DINDrv_SetChanThres(_DIN_INDEX_LOCKSENSOR1, 1, 4095U);
  122. DINDrv_SetChanThres(_DIN_INDEX_LOCKSENSOR2, 1, 4095U);
  123. DINDrv_SetChanThres(_DIN_INDEX_LOCKSENSOR3, 1, 4095U);
  124. DINDrv_SetChanThres(_DIN_INDEX_LOCKSENSOR4, 1, 4095U);
  125. temp[0] = !DINDrv_GetChanState(_DIN_INDEX_LOCKSENSOR1);
  126. temp[1] = !DINDrv_GetChanState(_DIN_INDEX_LOCKSENSOR2);
  127. temp[2] = !DINDrv_GetChanState(_DIN_INDEX_LOCKSENSOR3);
  128. temp[3] = !DINDrv_GetChanState(_DIN_INDEX_LOCKSENSOR4);
  129. ebcd_st_lockSensor = (getbit(temp[3], 0) << 3) | (getbit(temp[2], 0) << 2) | (getbit(temp[1], 0) << 1) | (getbit(temp[0], 0) << 0);
  130. //落座传感器检测,高有效,悬空为0则未接入,高电平为1则接入
  131. memset(temp, 0x00, 4);
  132. temp[0] = !DINDrv_GetChanState(_DIN_INDEX_READYSENSOR1);
  133. temp[1] = !DINDrv_GetChanState(_DIN_INDEX_READYSENSOR2);
  134. ebcd_st_pedstSensor = (getbit(temp[1], 0) << 1) | (getbit(temp[0], 0) << 0);
  135. //根据上述量得到,运动状态值
  136. if (ebcd_st_lockSensor == 0x0F)
  137. {
  138. ebcd_st_lockSucJug = 1;
  139. }
  140. else if (ebcd_st_lockSensor == 0x00)
  141. {
  142. ebcd_st_lockSucJug = 0;
  143. }
  144. else
  145. {
  146. ebcd_st_lockSucJug = 2;
  147. }
  148. if (ebcd_st_unlockSensor == 0x0F)
  149. {
  150. ebcd_st_unlockSucJug = 1;
  151. }
  152. else if (ebcd_st_unlockSensor == 0x00)
  153. {
  154. ebcd_st_unlockSucJug = 2;
  155. }
  156. else
  157. {
  158. ebcd_st_unlockSucJug = 0;
  159. }
  160. if (ebcd_st_pedstSucJug == 0x03)
  161. {
  162. ebcd_st_pedstSucJug = 1;
  163. }
  164. else if (ebcd_st_pedstSucJug == 0x00)
  165. {
  166. ebcd_st_pedstSucJug = 0;
  167. }
  168. else
  169. {
  170. ebcd_st_pedstSucJug = 2;
  171. }
  172. }
  173. /**
  174. * @brief : 获取模拟量输入值,并进行转换
  175. * @param {*}
  176. * @return {*}
  177. */
  178. void GetAIOValue(void)
  179. {
  180. uint16 AirPressureTemp_Vol = 0;
  181. uint16 PluginTemp1_Vol = 0;
  182. uint32 PluginTemp1_R = 0;
  183. uint16 PluginTemp2_Vol = 0;
  184. uint32 PluginTemp2_R = 0;
  185. uint16 PluginTemp3_Vol = 0;
  186. uint32 PluginTemp3_R = 0;
  187. uint16 PluginTemp4_Vol = 0;
  188. uint32 PluginTemp4_R = 0;
  189. AirPressureTemp_Vol = ATDDrv_GetChanResult(_ATD_INDEX_AIRPRESSURE);
  190. AirPressureTemp_Vol = (uint16)(AirPressureTemp_Vol * 1000 / 4095.0);
  191. Test_LockPressure = AirPressureTemp_Vol;//锁紧力测试变量
  192. /*气压数据转换*/
  193. AirPressureTemp_Vol = MAX(AirPressureTemp_Vol, 500);
  194. AirPressureTemp_Vol = MIN(AirPressureTemp_Vol, 4500);
  195. ebcd_P_airSensor = (uint8)((AirPressureTemp_Vol - 500) / 40);
  196. /*温度采集获取*/
  197. PluginTemp1_Vol = ATDDrv_GetChanResult(_ATD_INDEX_PLUGINTEMP1);
  198. PluginTemp2_Vol = ATDDrv_GetChanResult(_ATD_INDEX_PLUGINTEMP2);
  199. PluginTemp3_Vol = ATDDrv_GetChanResult(_ATD_INDEX_PLUGINTEMP3);
  200. PluginTemp4_Vol = ATDDrv_GetChanResult(_ATD_INDEX_PLUGINTEMP4);
  201. PluginTemp1_R = (uint32)((PluginTemp1_Vol / (5.0 * 4095 - PluginTemp1_Vol)) * 1000.0);
  202. PluginTemp2_R = (uint32)((PluginTemp2_Vol / (5.0 * 4095 - PluginTemp2_Vol)) * 1000.0);
  203. PluginTemp3_R = (uint32)((PluginTemp3_Vol / (5.0 * 4095 - PluginTemp3_Vol)) * 1000.0);
  204. PluginTemp4_R = (uint32)((PluginTemp4_Vol / (5.0 * 4095 - PluginTemp4_Vol)) * 1000.0);
  205. ebcd_T_plugin[0] = (uint8)Look1_u32u8(PluginTemp1_R, R_table, T_table, 240);
  206. ebcd_T_plugin[1] = (uint8)Look1_u32u8(PluginTemp2_R, R_table, T_table, 240);
  207. ebcd_T_plugin[2] = (uint8)Look1_u32u8(PluginTemp3_R, R_table, T_table, 240);
  208. ebcd_T_plugin[3] = (uint8)Look1_u32u8(PluginTemp4_R, R_table, T_table, 240);
  209. }
  210. /**
  211. * @brief : lookUp Table Fun
  212. * @param {uint32} u0 x
  213. * @param {uint32} bp0 x_table
  214. * @param {uint16} table y_table
  215. * @param {uint16} maxIndex
  216. * @return {*}
  217. */
  218. uint16 Look1_u32u8(uint32 u0, uint32 *bp0, uint8 *table, uint16 MaxLen)
  219. {
  220. uint32 bpIdx = 0;
  221. uint32 iLeft = 0;
  222. uint32 iRght = 0;
  223. uint16 y = 0;
  224. uint32 yL_0d0 = 0;
  225. uint32 yR_0d0 = 0;
  226. uint32 maxIndex = MaxLen - 1;
  227. if (u0 <= bp0[0U])
  228. {
  229. iLeft = 0U;
  230. iRght = 0U;
  231. }
  232. else if (u0 < bp0[maxIndex])
  233. {
  234. //对折法寻找u0的位置
  235. bpIdx = maxIndex >> 1U;
  236. iLeft = 0U;
  237. iRght = maxIndex;
  238. while ((iRght - iLeft) > 1)
  239. {
  240. if (u0 < bp0[bpIdx])
  241. {
  242. iRght = bpIdx;
  243. }
  244. else
  245. {
  246. iLeft = bpIdx;
  247. }
  248. bpIdx = (iRght + iLeft) >> 1U;
  249. }
  250. }
  251. else
  252. {
  253. iLeft = maxIndex;
  254. iRght = maxIndex;
  255. }
  256. //找到位置以后计算插值
  257. if (iLeft != iRght)
  258. {
  259. //线性插值
  260. yR_0d0 = table[iLeft + 1U];
  261. yL_0d0 = table[iLeft];
  262. if (yR_0d0 >= yL_0d0)
  263. {
  264. y = (uint16)(((uint32)(u0 - bp0[iLeft]) * (yR_0d0 - yL_0d0)) / (bp0[iLeft + 1] - bp0[iLeft]) + yL_0d0);
  265. }
  266. else
  267. {
  268. y = (uint16)(yL_0d0 - ((uint32)(u0 - bp0[iLeft]) * (yL_0d0 - yR_0d0)) / (bp0[iLeft + 1] - bp0[iLeft]));
  269. }
  270. }
  271. else
  272. {
  273. y = (uint16)table[iLeft];
  274. }
  275. return y;
  276. }
  277. #ifdef _APP_TEST_CODE
  278. void TestDeviceFun(void)
  279. {
  280. uint8 ManuEnable = 0;
  281. //控制算法
  282. AccPedCD_Update();
  283. AccPedCD_Monitor();
  284. PulseAcqDrv_GetChanFreq(_PULSEACQ_INDEX_CP_CHAN, &VehCo_fInputUIA[0], &VehCo_rInputUWA[0]);
  285. // DODrv_SetChanState(_DO_INDEX_CPCTL_CHAN,(uint8)VehCo_bTestCPCtrlUW_C);
  286. uint16 DistenceBufferV[2] = {0, 0}, DistenceBufferR[2] = {0, 0};
  287. //开关1采集
  288. DINDrv_SetChanThres(_DIN_INDEX_BAK1_CHAN, 1, 4095U);
  289. Switch1 = !DINDrv_GetChanState(_DIN_INDEX_BAK1_CHAN);
  290. //手动控制采集
  291. DINDrv_SetChanThres(_DIN_INDEX_BAK2_CHAN, 1, 4095U);
  292. ManuEnable = !DINDrv_GetChanState(_DIN_INDEX_BAK2_CHAN);
  293. //位移量采集
  294. DistenceBufferV[0] = ATDDrv_GetChanResult(_ATD_INDEX_BAK3_CHAN);
  295. DistenceBufferR[0] = (uint16)((DistenceBufferV[0] / (5.0 * 4095 - DistenceBufferV[0])) * 1000.0);
  296. Distence1 = (uint16)((2132 - DistenceBufferR[0]) * (0.1219));
  297. //压力采集
  298. PressureValueBuffer = ATDDrv_GetChanResult(_ATD_INDEX_ACCPED1_CHAN);
  299. PressureValue = (uint32)(PressureValueBuffer * 1000 / 4095.0);
  300. //控制输出
  301. VehCo_ctEEPTestUI += 10;
  302. VehCo_ctEEPTestUB += 10;
  303. if (VehCo_ctEEPTestUI >= 4 * 1000)
  304. {
  305. PSwtDrv_Interface(_PSWT_INDEX_HBAK1_CHAN, 1); //输出 解锁持续9-4s
  306. ControlState = 1; //解锁
  307. }
  308. else
  309. {
  310. PSwtDrv_Interface(_PSWT_INDEX_HBAK1_CHAN, 0); //不输出
  311. ControlState = 2; //锁定 4 秒
  312. }
  313. if (VehCo_ctEEPTestUI >= 9 * 1000)
  314. {
  315. Control_Times++;
  316. VehCo_ctEEPTestUI = 0;
  317. }
  318. if (ManuEnable == 0)
  319. {
  320. Control_Times = 0;
  321. VehCo_ctEEPTestUI = 0;
  322. }
  323. }
  324. #endif
  325. #ifdef _APP_TEST_MOTOR_CODE
  326. void MotorTestFun(void)
  327. {
  328. static uint32 MotorRunTimer = 0;
  329. static uint16 MotorLockReadyTimer = 0;
  330. static sint8 LockMotorNum = -1;
  331. static sint8 unLockMotorNum = -1;
  332. static uint32 testTimer = 0;
  333. GetDIOState();
  334. GetAIOValue();
  335. testTimer = testTimer + 10;
  336. MotorControlLockNum = LockMotorNum;
  337. MotorControlunLockNum = unLockMotorNum;
  338. if (MotorControlCmd == 0) //可进入调试模式
  339. {
  340. if (MotorDebugCmd == 1)
  341. {
  342. if (getbit(MotorControlEnable, 0) == 1)
  343. {
  344. MotorControlFunc(0, 1);
  345. return;
  346. }
  347. else if (getbit(MotorControlEnable, 1) == 1)
  348. {
  349. MotorControlFunc(1, 1);
  350. return;
  351. }
  352. else if (getbit(MotorControlEnable, 2) == 1)
  353. {
  354. MotorControlFunc(2, 1);
  355. return;
  356. }
  357. else if (getbit(MotorControlEnable, 3) == 1)
  358. {
  359. MotorControlFunc(3, 1);
  360. return;
  361. }
  362. else
  363. {
  364. return;
  365. }
  366. }
  367. else if (MotorDebugCmd == 2)
  368. {
  369. if (getbit(MotorControlEnable, 0) == 1)
  370. {
  371. MotorControlFunc(0, 2);
  372. return;
  373. }
  374. else if (getbit(MotorControlEnable, 1) == 1)
  375. {
  376. MotorControlFunc(1, 2);
  377. return;
  378. }
  379. else if (getbit(MotorControlEnable, 2) == 1)
  380. {
  381. MotorControlFunc(2, 2);
  382. return;
  383. }
  384. else if (getbit(MotorControlEnable, 3) == 1)
  385. {
  386. MotorControlFunc(3, 2);
  387. return;
  388. }
  389. else
  390. {
  391. return;
  392. }
  393. }
  394. else
  395. {
  396. if (MotorLifeTestCmd == 1)
  397. {
  398. if (LockMotorNum < 4 && testTimer > 5000)
  399. {
  400. MotorControlCmd = 1;
  401. }
  402. else if (unLockMotorNum < 5 && LockMotorNum == 4 && testTimer > 5000)
  403. {
  404. MotorControlCmd = 2;
  405. }
  406. }
  407. else
  408. {
  409. MotorControlFunc(0, 0xF1);
  410. LockMotorNum = -1;
  411. unLockMotorNum = -1;
  412. return;
  413. }
  414. }
  415. }
  416. else if (MotorControlCmd == 1) //控制锁紧的自动流程
  417. {
  418. switch (LockMotorNum)
  419. {
  420. case -1:
  421. {
  422. MotorControlFunc(0, 0xF1);
  423. LockMotorNum = 0;
  424. break;
  425. }
  426. case 0:
  427. {
  428. if ((MotorRunTimer >= RunFailedDelay) || (MotorLockReadyTimer >= LockDelay) || getbit(MotorControlEnable, LockMotorNum) != 1)
  429. {
  430. MotorControlFunc(LockMotorNum, 0xF1);
  431. LockMotorNum = 1;
  432. MotorRunTimer = 0;
  433. MotorLockReadyTimer = 0;
  434. }
  435. else
  436. {
  437. if (getbit(ebcd_st_lockSensor, LockMotorNum) == 1)
  438. {
  439. MotorLockReadyTimer = MotorLockReadyTimer + 10;
  440. }
  441. MotorControlFunc(LockMotorNum, 1);
  442. MotorRunTimer = MotorRunTimer + 10;
  443. }
  444. break;
  445. }
  446. case 1:
  447. {
  448. if ((MotorRunTimer >= RunFailedDelay) || (MotorLockReadyTimer >= LockDelay) || getbit(MotorControlEnable, LockMotorNum) != 1)
  449. {
  450. MotorControlFunc(LockMotorNum, 0xF1);
  451. LockMotorNum = 2;
  452. MotorRunTimer = 0;
  453. MotorLockReadyTimer = 0;
  454. }
  455. else
  456. {
  457. if (getbit(ebcd_st_lockSensor, LockMotorNum) == 1)
  458. {
  459. MotorLockReadyTimer = MotorLockReadyTimer + 10;
  460. }
  461. MotorControlFunc(LockMotorNum, 1);
  462. MotorRunTimer = MotorRunTimer + 10;
  463. }
  464. break;
  465. }
  466. case 2:
  467. {
  468. if ((MotorRunTimer >= RunFailedDelay) || (MotorLockReadyTimer >= LockDelay) || getbit(MotorControlEnable, LockMotorNum) != 1)
  469. {
  470. MotorControlFunc(LockMotorNum, 0xF1);
  471. LockMotorNum = 3;
  472. MotorRunTimer = 0;
  473. MotorLockReadyTimer = 0;
  474. }
  475. else
  476. {
  477. if (getbit(ebcd_st_lockSensor, LockMotorNum) == 1)
  478. {
  479. MotorLockReadyTimer = MotorLockReadyTimer + 10;
  480. }
  481. MotorControlFunc(LockMotorNum, 1);
  482. MotorRunTimer = MotorRunTimer + 10;
  483. }
  484. break;
  485. }
  486. case 3:
  487. {
  488. if ((MotorRunTimer >= RunFailedDelay) || (MotorLockReadyTimer >= LockDelay) || getbit(MotorControlEnable, LockMotorNum) != 1)
  489. {
  490. MotorControlFunc(LockMotorNum, 0xF1);
  491. LockMotorNum = 4;
  492. unLockMotorNum = -1;
  493. MotorRunTimer = 0;
  494. MotorLockReadyTimer = 0;
  495. testTimer = 0;
  496. }
  497. else
  498. {
  499. if (getbit(ebcd_st_lockSensor, LockMotorNum) == 1)
  500. {
  501. MotorLockReadyTimer = MotorLockReadyTimer + 10;
  502. }
  503. MotorControlFunc(LockMotorNum, 1);
  504. MotorRunTimer = MotorRunTimer + 10;
  505. }
  506. break;
  507. }
  508. default:
  509. break;
  510. }
  511. }
  512. else if (MotorControlCmd == 2) //控制解锁的自动流程
  513. {
  514. switch (unLockMotorNum)
  515. {
  516. case -1:
  517. {
  518. MotorControlFunc(0, 0xF2);
  519. unLockMotorNum = 0;
  520. break;
  521. }
  522. case 0:
  523. {
  524. if ((MotorRunTimer >= RunFailedDelay) || (MotorLockReadyTimer >= 1) || getbit(MotorControlEnable, unLockMotorNum) != 1)
  525. {
  526. MotorControlFunc(unLockMotorNum, 0xF2);
  527. unLockMotorNum = 1;
  528. MotorRunTimer = 0;
  529. MotorLockReadyTimer = 0;
  530. }
  531. else
  532. {
  533. if (getbit(ebcd_st_unlockSensor, unLockMotorNum) == 1)
  534. {
  535. MotorLockReadyTimer = MotorLockReadyTimer + 10;
  536. }
  537. MotorControlFunc(unLockMotorNum, 2);
  538. MotorRunTimer = MotorRunTimer + 10;
  539. }
  540. break;
  541. }
  542. case 1:
  543. {
  544. if ((MotorRunTimer >= RunFailedDelay) || (MotorLockReadyTimer >= 1) || getbit(MotorControlEnable, unLockMotorNum) != 1)
  545. {
  546. MotorControlFunc(unLockMotorNum, 0xF2);
  547. unLockMotorNum = 2;
  548. MotorRunTimer = 0;
  549. MotorLockReadyTimer = 0;
  550. }
  551. else
  552. {
  553. if (getbit(ebcd_st_unlockSensor, unLockMotorNum) == 1)
  554. {
  555. MotorLockReadyTimer = MotorLockReadyTimer + 10;
  556. }
  557. MotorControlFunc(unLockMotorNum, 2);
  558. MotorRunTimer = MotorRunTimer + 10;
  559. }
  560. break;
  561. }
  562. case 2:
  563. {
  564. if ((MotorRunTimer >= RunFailedDelay) || (MotorLockReadyTimer >= 1) || getbit(MotorControlEnable, unLockMotorNum) != 1)
  565. {
  566. MotorControlFunc(unLockMotorNum, 0xF2);
  567. unLockMotorNum = 3;
  568. MotorRunTimer = 0;
  569. MotorLockReadyTimer = 0;
  570. }
  571. else
  572. {
  573. if (getbit(ebcd_st_unlockSensor, unLockMotorNum) == 1)
  574. {
  575. MotorLockReadyTimer = MotorLockReadyTimer + 10;
  576. }
  577. MotorControlFunc(unLockMotorNum, 2);
  578. MotorRunTimer = MotorRunTimer + 10;
  579. }
  580. break;
  581. }
  582. case 3:
  583. {
  584. if ((MotorRunTimer >= RunFailedDelay) || (MotorLockReadyTimer >= 1) || getbit(MotorControlEnable, unLockMotorNum) != 1)
  585. {
  586. MotorControlFunc(unLockMotorNum, 0xF2);
  587. unLockMotorNum = 4;
  588. MotorRunTimer = 0;
  589. MotorLockReadyTimer = 0;
  590. }
  591. else
  592. {
  593. if (getbit(ebcd_st_unlockSensor, unLockMotorNum) == 1)
  594. {
  595. MotorLockReadyTimer = MotorLockReadyTimer + 10;
  596. }
  597. MotorControlFunc(unLockMotorNum, 2);
  598. MotorRunTimer = MotorRunTimer + 10;
  599. }
  600. break;
  601. }
  602. case 4:
  603. {
  604. MotorControlFunc(0, 0xF1);
  605. unLockMotorNum = 5;
  606. LockMotorNum = -1;
  607. if (MotorLifeTestCmd == 1)
  608. {
  609. LifeTestCounter++;
  610. testTimer = 0;
  611. EEPROMDrv_bSaveInstantUB = 1;
  612. }
  613. break;
  614. }
  615. default:
  616. break;
  617. }
  618. }
  619. }
  620. void MotorControlFunc(UINT8 MotorIdx, UINT8 RotateDirec) // MotorIdx 0-3 表示四个电机,RotateDirec F1停止正转,F2表示反转停止,1表示正转,2表示反转
  621. {
  622. switch (MotorIdx)
  623. {
  624. case 0:
  625. {
  626. switch (RotateDirec)
  627. {
  628. case 0xF1:
  629. {
  630. PSwtDrv_Interface(_M1_C, 0);
  631. PSwtDrv_Interface(_M2_C, 0);
  632. PSwtDrv_Interface(_M3_C, 0);
  633. PSwtDrv_Interface(_M4_C, 0);
  634. PSwtDrv_Interface(_M_D_C, 0);
  635. break;
  636. }
  637. case 0xF2:
  638. {
  639. PSwtDrv_Interface(_M1_C, 1);
  640. PSwtDrv_Interface(_M2_C, 1);
  641. PSwtDrv_Interface(_M3_C, 1);
  642. PSwtDrv_Interface(_M4_C, 1);
  643. PSwtDrv_Interface(_M_D_C, 1);
  644. break;
  645. }
  646. case 1:
  647. {
  648. PSwtDrv_Interface(_M1_C, 0);
  649. PSwtDrv_Interface(_M_D_C, 0);
  650. PSwtDrv_Interface(_M1_C, 1);
  651. break;
  652. }
  653. case 2:
  654. {
  655. PSwtDrv_Interface(_M1_C, 1);
  656. PSwtDrv_Interface(_M_D_C, 1);
  657. PSwtDrv_Interface(_M1_C, 0);
  658. break;
  659. }
  660. default:
  661. break;
  662. }
  663. break;
  664. }
  665. case 1:
  666. {
  667. switch (RotateDirec)
  668. {
  669. case 0xF1:
  670. {
  671. PSwtDrv_Interface(_M1_C, 0);
  672. PSwtDrv_Interface(_M2_C, 0);
  673. PSwtDrv_Interface(_M3_C, 0);
  674. PSwtDrv_Interface(_M4_C, 0);
  675. PSwtDrv_Interface(_M_D_C, 0);
  676. break;
  677. }
  678. case 0xF2:
  679. {
  680. PSwtDrv_Interface(_M1_C, 1);
  681. PSwtDrv_Interface(_M2_C, 1);
  682. PSwtDrv_Interface(_M3_C, 1);
  683. PSwtDrv_Interface(_M4_C, 1);
  684. PSwtDrv_Interface(_M_D_C, 1);
  685. break;
  686. }
  687. case 0:
  688. {
  689. PSwtDrv_Interface(_M2_C, 0);
  690. PSwtDrv_Interface(_M_D_C, 0);
  691. break;
  692. }
  693. case 1:
  694. {
  695. PSwtDrv_Interface(_M2_C, 0);
  696. PSwtDrv_Interface(_M_D_C, 0);
  697. PSwtDrv_Interface(_M2_C, 1);
  698. break;
  699. }
  700. case 2:
  701. {
  702. PSwtDrv_Interface(_M2_C, 1);
  703. PSwtDrv_Interface(_M_D_C, 1);
  704. PSwtDrv_Interface(_M2_C, 0);
  705. break;
  706. }
  707. default:
  708. break;
  709. }
  710. break;
  711. }
  712. case 2:
  713. {
  714. switch (RotateDirec)
  715. {
  716. case 0xF1:
  717. {
  718. PSwtDrv_Interface(_M1_C, 0);
  719. PSwtDrv_Interface(_M2_C, 0);
  720. PSwtDrv_Interface(_M3_C, 0);
  721. PSwtDrv_Interface(_M4_C, 0);
  722. PSwtDrv_Interface(_M_D_C, 0);
  723. break;
  724. }
  725. case 0xF2:
  726. {
  727. PSwtDrv_Interface(_M1_C, 1);
  728. PSwtDrv_Interface(_M2_C, 1);
  729. PSwtDrv_Interface(_M3_C, 1);
  730. PSwtDrv_Interface(_M4_C, 1);
  731. PSwtDrv_Interface(_M_D_C, 1);
  732. break;
  733. }
  734. case 0:
  735. {
  736. PSwtDrv_Interface(_M3_C, 0);
  737. PSwtDrv_Interface(_M_D_C, 0);
  738. break;
  739. }
  740. case 1:
  741. {
  742. PSwtDrv_Interface(_M3_C, 0);
  743. PSwtDrv_Interface(_M_D_C, 0);
  744. PSwtDrv_Interface(_M3_C, 1);
  745. break;
  746. }
  747. case 2:
  748. {
  749. PSwtDrv_Interface(_M3_C, 1);
  750. PSwtDrv_Interface(_M_D_C, 1);
  751. PSwtDrv_Interface(_M3_C, 0);
  752. break;
  753. }
  754. default:
  755. break;
  756. }
  757. break;
  758. }
  759. case 3:
  760. {
  761. switch (RotateDirec)
  762. {
  763. case 0xF1:
  764. {
  765. PSwtDrv_Interface(_M1_C, 0);
  766. PSwtDrv_Interface(_M2_C, 0);
  767. PSwtDrv_Interface(_M3_C, 0);
  768. PSwtDrv_Interface(_M4_C, 0);
  769. PSwtDrv_Interface(_M_D_C, 0);
  770. break;
  771. }
  772. case 0xF2:
  773. {
  774. PSwtDrv_Interface(_M1_C, 1);
  775. PSwtDrv_Interface(_M2_C, 1);
  776. PSwtDrv_Interface(_M3_C, 1);
  777. PSwtDrv_Interface(_M4_C, 1);
  778. PSwtDrv_Interface(_M_D_C, 1);
  779. break;
  780. }
  781. case 0:
  782. {
  783. PSwtDrv_Interface(_M4_C, 0);
  784. PSwtDrv_Interface(_M_D_C, 0);
  785. break;
  786. }
  787. case 1:
  788. {
  789. PSwtDrv_Interface(_M4_C, 0);
  790. PSwtDrv_Interface(_M_D_C, 0);
  791. PSwtDrv_Interface(_M4_C, 1);
  792. break;
  793. }
  794. case 2:
  795. {
  796. PSwtDrv_Interface(_M4_C, 1);
  797. PSwtDrv_Interface(_M_D_C, 1);
  798. PSwtDrv_Interface(_M4_C, 0);
  799. break;
  800. }
  801. default:
  802. break;
  803. }
  804. break;
  805. }
  806. default:
  807. break;
  808. }
  809. }
  810. #endif