tim.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576
  1. /**
  2. ******************************************************************************
  3. * File Name : TIM.c
  4. * Description : This file provides code for the configuration
  5. * of the TIM instances.
  6. ******************************************************************************
  7. *
  8. * COPYRIGHT(c) 2015 STMicroelectronics
  9. *
  10. * Redistribution and use in source and binary forms, with or without modification,
  11. * are permitted provided that the following conditions are met:
  12. * 1. Redistributions of source code must retain the above copyright notice,
  13. * this list of conditions and the following disclaimer.
  14. * 2. Redistributions in binary form must reproduce the above copyright notice,
  15. * this list of conditions and the following disclaimer in the documentation
  16. * and/or other materials provided with the distribution.
  17. * 3. Neither the name of STMicroelectronics nor the names of its contributors
  18. * may be used to endorse or promote products derived from this software
  19. * without specific prior written permission.
  20. *
  21. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  22. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  24. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  25. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  27. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  28. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  29. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  30. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31. *
  32. ******************************************************************************
  33. */
  34. /* Includes ------------------------------------------------------------------*/
  35. #include "tim.h"
  36. #include "gpio.h"
  37. /* USER CODE BEGIN 0 */
  38. #include "adc.h"
  39. #include "motor_control.h"
  40. #include "hall_sensor.h"
  41. #include "MC_Globals.h"
  42. #include "MC_FOC_Driver.h"
  43. #include "protect_check.h"
  44. #include "light_driver.h"
  45. #include "key_driver.h"
  46. /* USER CODE END 0 */
  47. TIM_HandleTypeDef htim1;
  48. TIM_HandleTypeDef htim2;
  49. TIM_HandleTypeDef htim3;
  50. TIM_HandleTypeDef htim4;
  51. /* TIM1 init function */
  52. void MX_TIM1_Init(void)
  53. {
  54. TIM_ClockConfigTypeDef sClockSourceConfig;
  55. TIM_MasterConfigTypeDef sMasterConfig;
  56. TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
  57. TIM_OC_InitTypeDef sConfigOC;
  58. htim1.Instance = TIM1;
  59. htim1.Init.Prescaler = 0;
  60. htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1;//PWM频率为15K,FOC计算为15K
  61. htim1.Init.Period = PWM_PERIOD;
  62. htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  63. htim1.Init.RepetitionCounter = 1;
  64. HAL_TIM_Base_Init(&htim1);
  65. sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  66. HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig);
  67. HAL_TIM_PWM_Init(&htim1);
  68. sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC4REF;
  69. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
  70. HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);
  71. sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_ENABLE;
  72. sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_ENABLE;
  73. sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  74. sBreakDeadTimeConfig.DeadTime = DEADTIME;
  75. sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  76. sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_LOW;
  77. sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  78. HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);
  79. __HAL_TIM_CLEAR_IT(&htim1, TIM_IT_BREAK);
  80. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  81. sConfigOC.Pulse = PWM_PERIOD/2;
  82. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  83. sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  84. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  85. sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  86. sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  87. HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
  88. HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2);
  89. HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3);
  90. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  91. sConfigOC.Pulse = PWM_PERIOD-1;
  92. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  93. sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW;
  94. HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4);
  95. }
  96. /* TIM2 init function */
  97. void MX_TIM2_Init(void)
  98. {
  99. TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  100. TIM_MasterConfigTypeDef sMasterConfig = {0};
  101. htim2.Instance = TIM2;
  102. htim2.Init.Prescaler = 0;
  103. htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  104. htim2.Init.Period = 65535;
  105. htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  106. htim2.Init.RepetitionCounter = 0;
  107. htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  108. if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  109. {
  110. Error_Handler();
  111. }
  112. sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ETRMODE2;
  113. sClockSourceConfig.ClockPolarity = TIM_CLOCKPOLARITY_NONINVERTED;
  114. sClockSourceConfig.ClockPrescaler = TIM_CLOCKPRESCALER_DIV1;
  115. sClockSourceConfig.ClockFilter = 0;
  116. if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  117. {
  118. Error_Handler();
  119. }
  120. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  121. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  122. if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  123. {
  124. Error_Handler();
  125. }
  126. }
  127. void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
  128. {
  129. GPIO_InitTypeDef GPIO_InitStruct;
  130. if(htim_base->Instance==TIM1)
  131. {
  132. /* USER CODE BEGIN TIM1_MspInit 0 */
  133. /* USER CODE END TIM1_MspInit 0 */
  134. /* Peripheral clock enable */
  135. __HAL_RCC_TIM1_CLK_ENABLE();
  136. /**TIM1 GPIO Configuration
  137. PB13 ------> TIM1_CH1N
  138. PB14 ------> TIM1_CH2N
  139. PB15 ------> TIM1_CH3N
  140. PA8 ------> TIM1_CH1
  141. PA9 ------> TIM1_CH2
  142. PA10 ------> TIM1_CH3
  143. PA11 ------> TIM1_CH4
  144. PB12 ------> TIM1_BKIN
  145. */
  146. GPIO_InitStruct.Pin = GPIO_PIN_12;
  147. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  148. GPIO_InitStruct.Pull = GPIO_NOPULL;
  149. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  150. GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
  151. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  152. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  153. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  154. GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11;
  155. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  156. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  157. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  158. // __HAL_AFIO_REMAP_TIM1_PARTIAL();
  159. /* Peripheral interrupt init*/
  160. HAL_NVIC_SetPriority(TIM1_UP_IRQn, 1, 1);
  161. HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);
  162. /* USER CODE BEGIN TIM1_MspInit 1 */
  163. /* USER CODE END TIM1_MspInit 1 */
  164. }
  165. else if(htim_base->Instance==TIM2)
  166. {
  167. /* USER CODE BEGIN TIM2_MspInit 0 */
  168. /* USER CODE END TIM2_MspInit 0 */
  169. /* TIM2 clock enable */
  170. __HAL_RCC_TIM2_CLK_ENABLE();
  171. __HAL_RCC_GPIOA_CLK_ENABLE();
  172. /**TIM2 GPIO Configuration
  173. PA0-WKUP ------> TIM2_ETR
  174. */
  175. GPIO_InitStruct.Pin = GPIO_PIN_0;
  176. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  177. GPIO_InitStruct.Pull = GPIO_NOPULL;
  178. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  179. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  180. /* USER CODE BEGIN TIM2_MspInit 1 */
  181. /* USER CODE END TIM2_MspInit 1 */
  182. }
  183. else if(htim_base->Instance==TIM4)
  184. {
  185. /* USER CODE BEGIN TIM4_MspInit 0 */
  186. /* USER CODE END TIM4_MspInit 0 */
  187. /* Peripheral clock enable */
  188. __HAL_RCC_TIM4_CLK_ENABLE();
  189. /* TIM4 interrupt Init */
  190. HAL_NVIC_SetPriority(TIM4_IRQn, 2, 2);
  191. HAL_NVIC_EnableIRQ(TIM4_IRQn);
  192. /* USER CODE BEGIN TIM4_MspInit 1 */
  193. /* USER CODE END TIM4_MspInit 1 */
  194. }
  195. }
  196. void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
  197. {
  198. if(htim_base->Instance==TIM1)
  199. {
  200. /* USER CODE BEGIN TIM1_MspDeInit 0 */
  201. /* USER CODE END TIM1_MspDeInit 0 */
  202. /* Peripheral clock disable */
  203. __HAL_RCC_TIM1_CLK_DISABLE();
  204. /**TIM1 GPIO Configuration
  205. PB12 ------> BREAK
  206. PB13 ------> TIM1_CH1N
  207. PB14 ------> TIM1_CH2N
  208. PB15 ------> TIM1_CH3N
  209. PA8 ------> TIM1_CH1
  210. PA9 ------> TIM1_CH2
  211. PA10 ------> TIM1_CH3
  212. PA11 ------> TIM1_CH4
  213. */
  214. HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_12);
  215. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11);
  216. /* Peripheral interrupt Deinit*/
  217. HAL_NVIC_DisableIRQ(TIM1_UP_IRQn);
  218. HAL_NVIC_DisableIRQ(TIM1_BRK_IRQn);
  219. }
  220. else if(htim_base->Instance==TIM2)
  221. {
  222. /* USER CODE BEGIN TIM2_MspDeInit 0 */
  223. /* USER CODE END TIM2_MspDeInit 0 */
  224. /* Peripheral clock disable */
  225. __HAL_RCC_TIM2_CLK_DISABLE();
  226. /**TIM2 GPIO Configuration
  227. PA0-WKUP ------> TIM2_ETR
  228. */
  229. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0);
  230. /* USER CODE BEGIN TIM2_MspDeInit 1 */
  231. /* USER CODE END TIM2_MspDeInit 1 */
  232. }
  233. if(htim_base->Instance==TIM4)
  234. {
  235. /* USER CODE BEGIN TIM4_MspDeInit 0 */
  236. /* USER CODE END TIM4_MspDeInit 0 */
  237. /* Peripheral clock disable */
  238. __HAL_RCC_TIM4_CLK_DISABLE();
  239. /* TIM4 interrupt DeInit */
  240. HAL_NVIC_DisableIRQ(TIM4_IRQn);
  241. /* USER CODE BEGIN TIM4_MspDeInit 1 */
  242. /* USER CODE END TIM4_MspDeInit 1 */
  243. }
  244. /* USER CODE BEGIN TIM1_MspDeInit 1 */
  245. /* USER CODE END TIM1_MspDeInit 1 */
  246. }
  247. /* TIM3 init function */
  248. void MX_TIM3_Init(void)
  249. {
  250. TIM_MasterConfigTypeDef sMasterConfig;
  251. TIM_OC_InitTypeDef sConfigOC;
  252. htim3.Instance = TIM3;
  253. htim3.Init.Prescaler = 0;
  254. htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  255. htim3.Init.Period = 71;
  256. htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  257. htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  258. if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  259. {
  260. _Error_Handler(__FILE__, __LINE__);
  261. }
  262. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  263. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  264. if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  265. {
  266. _Error_Handler(__FILE__, __LINE__);
  267. }
  268. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  269. sConfigOC.Pulse = 36;
  270. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  271. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  272. if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  273. {
  274. _Error_Handler(__FILE__, __LINE__);
  275. }
  276. HAL_TIM_MspPostInit(&htim3);
  277. }
  278. void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* tim_pwmHandle)
  279. {
  280. if(tim_pwmHandle->Instance==TIM3)
  281. {
  282. /* USER CODE BEGIN TIM3_MspInit 0 */
  283. /* USER CODE END TIM3_MspInit 0 */
  284. /* TIM3 clock enable */
  285. __HAL_RCC_TIM3_CLK_ENABLE();
  286. /* USER CODE BEGIN TIM3_MspInit 1 */
  287. /* USER CODE END TIM3_MspInit 1 */
  288. }
  289. }
  290. void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
  291. {
  292. GPIO_InitTypeDef GPIO_InitStruct;
  293. if(timHandle->Instance==TIM3)
  294. {
  295. /* USER CODE BEGIN TIM3_MspPostInit 0 */
  296. /* USER CODE END TIM3_MspPostInit 0 */
  297. /**TIM3 GPIO Configuration
  298. PC6 ------> TIM3_CH1
  299. */
  300. GPIO_InitStruct.Pin = GPIO_PIN_6;
  301. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  302. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  303. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  304. __HAL_AFIO_REMAP_TIM3_ENABLE();
  305. /* USER CODE BEGIN TIM3_MspPostInit 1 */
  306. HAL_TIM_OC_Start(&htim3, TIM_CHANNEL_1);
  307. /* USER CODE END TIM3_MspPostInit 1 */
  308. }
  309. }
  310. void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* tim_pwmHandle)
  311. {
  312. if(tim_pwmHandle->Instance==TIM3)
  313. {
  314. /* USER CODE BEGIN TIM3_MspDeInit 0 */
  315. /* USER CODE END TIM3_MspDeInit 0 */
  316. /* Peripheral clock disable */
  317. __HAL_RCC_TIM3_CLK_DISABLE();
  318. /* USER CODE BEGIN TIM3_MspDeInit 1 */
  319. /* USER CODE END TIM3_MspDeInit 1 */
  320. }
  321. }
  322. void MX_TIM4_Init(void)
  323. {
  324. /* USER CODE BEGIN TIM4_Init 0 */
  325. /* USER CODE END TIM4_Init 0 */
  326. TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  327. TIM_MasterConfigTypeDef sMasterConfig = {0};
  328. /* USER CODE BEGIN TIM4_Init 1 */
  329. /* USER CODE END TIM4_Init 1 */
  330. htim4.Instance = TIM4;
  331. htim4.Init.Prescaler = 0;
  332. htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  333. htim4.Init.Period = 1098 / MC_VirtualPosition.Fren - 1; //电角度频率f = 72MHz / (分频系数 + 1) / 65535
  334. htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  335. htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  336. if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
  337. {
  338. Error_Handler();
  339. }
  340. sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  341. if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
  342. {
  343. Error_Handler();
  344. }
  345. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  346. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  347. if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  348. {
  349. Error_Handler();
  350. }
  351. /* USER CODE BEGIN TIM4_Init 2 */
  352. /* USER CODE END TIM4_Init 2 */
  353. }
  354. /* USER CODE BEGIN 1 */
  355. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  356. {
  357. if(htim->Instance == TIM1)
  358. {
  359. static uint8_t ADC_PreCnt = 0;
  360. static TrueOrFalse_Flag_Struct_t IsPwmEnableFlag = False;
  361. static uint32_t FaultDelayTimeCnt = 0;
  362. #if 1
  363. static uint16_t PeriodTest = 0;
  364. //运行频率测试
  365. PeriodTest ++;
  366. if(PeriodTest >= 300) //频率15K,周期200 / 3 us * 300 = 20ms
  367. {
  368. PeriodTest = 0;
  369. }
  370. #endif
  371. //Light控制
  372. LightDriver_Process(MC_ConfigParam2.MC_TailLight_Mode, MC_ConfigParam2.HeadLightVol, MC_ConfigParam2.TailLightVol, IsBreakTrig_Flag, MC_ControlCode.LightSwitch);
  373. //ADC采集分频
  374. ADC_PreCnt++;
  375. if(ADC_PreCnt >= 5)
  376. {
  377. __HAL_ADC_ENABLE(&hadc1);
  378. ADC_PreCnt = 0;
  379. }
  380. //霍尔传感器状态更新
  381. MC_HallSensorData.PWM_NumCnt++;
  382. HallSensor_Process();
  383. if(MC_HallSensorData.Delta_AngleSum < (ANGLE_60D + (ANGLE_60D >> 3)))
  384. {
  385. MC_HallSensorData.SVM_Angle += MC_HallSensorData.Delta_Angle;
  386. MC_HallSensorData.Delta_AngleSum += MC_HallSensorData.Delta_Angle;
  387. }
  388. //虚拟角度更新
  389. MC_VirtualPosition.SVM_Angle += 32;
  390. if(MC_VirtualPosition.SVM_Angle >= 65535)
  391. {
  392. MC_VirtualPosition.SVM_Angle = 0;
  393. }
  394. //计算电机转速
  395. MC_RunInfo.MotorSpeed = MotorSpeedCal(MC_HallSensorData.SVM_Angle, MC_HallSensorData.IsStopFlag);
  396. //过流检测
  397. MC_Protect_OverCurrent_Process(&MC_Protect_OverCurrentTrig_Flag, &MC_ErrorCode);
  398. //FOC运算
  399. if(((uint8_t)(MC_CalParam.AssistRunMode ^ MC_CalParam_Back.AssistRunMode) != (uint8_t)~0) ||
  400. ((uint8_t)(MC_CalParam.Foc_Flag ^ MC_CalParam_Back.Foc_Flag) != (uint8_t)~0) ||
  401. ((uint16_t)(MC_CalParam.Ref_Speed ^ MC_CalParam_Back.Ref_Speed) != (uint16_t)~0)||
  402. ((uint16_t)(MC_CalParam.Ref_Torque ^ MC_CalParam_Back.Ref_Torque) != (uint16_t)~0))
  403. {
  404. if((HAL_GetTick() - FaultDelayTimeCnt) > 200)
  405. {
  406. FOC_Status = FOC_Status_WAIT;
  407. }
  408. }
  409. else
  410. {
  411. FaultDelayTimeCnt = HAL_GetTick();
  412. }
  413. switch(FOC_Status)
  414. {
  415. case FOC_Status_RUN:
  416. {
  417. if(MC_CalParam.Foc_Flag == SET)
  418. {
  419. //发波
  420. if(IsPwmEnableFlag == False)
  421. {
  422. Enable_PwmGpio_Out();
  423. IsPwmEnableFlag = True;
  424. }
  425. //参考值设定
  426. switch(MC_CalParam.AssistRunMode)
  427. {
  428. case MC_AssistRunMode_TORQUE://力矩模式
  429. {
  430. FOC_Model(MC_CalParam.Ref_Torque, 0, MC_RunInfo.MotorSpeed, MC_HallSensorData.SVM_Angle, False);
  431. break;
  432. }
  433. case MC_AssistRunMode_WALK: case MC_AssistRunMode_CADENCE: case MC_AssistRunMode_GAS://速度模式
  434. {
  435. #if 0 //正常速度环
  436. FOC_Model(MC_CalParam.Ref_Speed, 0, MC_RunInfo.MotorSpeed, MC_HallSensorData.SVM_Angle, False);
  437. #elif 1 //If拖动
  438. FOC_Model(MC_MotorParam.Rate_Power, 0, MC_RunInfo.MotorSpeed, MC_VirtualPosition.SVM_Angle, False);
  439. #elif 1 //零度
  440. FOC_Model(0, 200, MC_RunInfo.MotorSpeed, 0, False);
  441. #endif
  442. break;
  443. }
  444. default:break;
  445. }
  446. }
  447. break;
  448. }
  449. case FOC_Status_WAIT:
  450. {
  451. IsPwmEnableFlag = False;
  452. break;
  453. }
  454. default:break;
  455. }
  456. }
  457. }
  458. void TIM4_Update_Isr(void)
  459. {
  460. if(__HAL_TIM_GET_FLAG(&htim4, TIM_FLAG_UPDATE) != RESET)
  461. {
  462. if(__HAL_TIM_GET_IT_SOURCE(&htim4, TIM_IT_UPDATE) !=RESET)
  463. {
  464. __HAL_TIM_CLEAR_IT(&htim4, TIM_IT_UPDATE);
  465. MC_VirtualPosition.SVM_Angle += 4;
  466. if(MC_VirtualPosition.SVM_Angle >= 65535)
  467. {
  468. MC_VirtualPosition.SVM_Angle = 0;
  469. }
  470. }
  471. }
  472. }
  473. /* USER CODE END 1 */
  474. /**
  475. * @}
  476. */
  477. /**
  478. * @}
  479. */
  480. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/