tim.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  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. /* USER CODE END 0 */
  45. TIM_HandleTypeDef htim1;
  46. TIM_HandleTypeDef htim2;
  47. TIM_HandleTypeDef htim3;
  48. /* TIM1 init function */
  49. void MX_TIM1_Init(void)
  50. {
  51. TIM_ClockConfigTypeDef sClockSourceConfig;
  52. TIM_MasterConfigTypeDef sMasterConfig;
  53. TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
  54. TIM_OC_InitTypeDef sConfigOC;
  55. htim1.Instance = TIM1;
  56. htim1.Init.Prescaler = 0;
  57. htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1;//PWM频率为15K,FOC计算为15K
  58. htim1.Init.Period = PWM_PERIOD;
  59. htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  60. htim1.Init.RepetitionCounter = 1;
  61. HAL_TIM_Base_Init(&htim1);
  62. sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  63. HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig);
  64. HAL_TIM_PWM_Init(&htim1);
  65. sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC4REF;
  66. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
  67. HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);
  68. sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_ENABLE;
  69. sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_ENABLE;
  70. sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  71. sBreakDeadTimeConfig.DeadTime = DEADTIME;
  72. sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  73. sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_LOW;
  74. sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  75. HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);
  76. __HAL_TIM_CLEAR_IT(&htim1, TIM_IT_BREAK);
  77. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  78. sConfigOC.Pulse = PWM_PERIOD/2;
  79. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  80. sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  81. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  82. sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  83. sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  84. HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
  85. HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2);
  86. HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3);
  87. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  88. sConfigOC.Pulse = PWM_PERIOD-1;
  89. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  90. sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW;
  91. HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4);
  92. }
  93. /* TIM2 init function */
  94. void MX_TIM2_Init(void)
  95. {
  96. TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  97. TIM_MasterConfigTypeDef sMasterConfig = {0};
  98. htim2.Instance = TIM2;
  99. htim2.Init.Prescaler = 0;
  100. htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  101. htim2.Init.Period = 65535;
  102. htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  103. htim2.Init.RepetitionCounter = 0;
  104. htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  105. if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  106. {
  107. Error_Handler();
  108. }
  109. sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ETRMODE2;
  110. sClockSourceConfig.ClockPolarity = TIM_CLOCKPOLARITY_NONINVERTED;
  111. sClockSourceConfig.ClockPrescaler = TIM_CLOCKPRESCALER_DIV1;
  112. sClockSourceConfig.ClockFilter = 0;
  113. if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  114. {
  115. Error_Handler();
  116. }
  117. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  118. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  119. if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  120. {
  121. Error_Handler();
  122. }
  123. }
  124. void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
  125. {
  126. GPIO_InitTypeDef GPIO_InitStruct;
  127. if(htim_base->Instance==TIM1)
  128. {
  129. /* USER CODE BEGIN TIM1_MspInit 0 */
  130. /* USER CODE END TIM1_MspInit 0 */
  131. /* Peripheral clock enable */
  132. __HAL_RCC_TIM1_CLK_ENABLE();
  133. /**TIM1 GPIO Configuration
  134. PB13 ------> TIM1_CH1N
  135. PB14 ------> TIM1_CH2N
  136. PB15 ------> TIM1_CH3N
  137. PA8 ------> TIM1_CH1
  138. PA9 ------> TIM1_CH2
  139. PA10 ------> TIM1_CH3
  140. PA11 ------> TIM1_CH4
  141. PB12 ------> TIM1_BKIN
  142. */
  143. GPIO_InitStruct.Pin = GPIO_PIN_12;
  144. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  145. GPIO_InitStruct.Pull = GPIO_NOPULL;
  146. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  147. GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
  148. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  149. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  150. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  151. GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11;
  152. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  153. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  154. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  155. // __HAL_AFIO_REMAP_TIM1_PARTIAL();
  156. /* Peripheral interrupt init*/
  157. HAL_NVIC_SetPriority(TIM1_UP_IRQn, 1, 1);
  158. HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);
  159. HAL_NVIC_SetPriority(TIM1_BRK_IRQn, 0, 0);
  160. HAL_NVIC_EnableIRQ(TIM1_BRK_IRQn);
  161. __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_BREAK);
  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. }
  184. void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
  185. {
  186. if(htim_base->Instance==TIM1)
  187. {
  188. /* USER CODE BEGIN TIM1_MspDeInit 0 */
  189. /* USER CODE END TIM1_MspDeInit 0 */
  190. /* Peripheral clock disable */
  191. __HAL_RCC_TIM1_CLK_DISABLE();
  192. /**TIM1 GPIO Configuration
  193. PB12 ------> BREAK
  194. PB13 ------> TIM1_CH1N
  195. PB14 ------> TIM1_CH2N
  196. PB15 ------> TIM1_CH3N
  197. PA8 ------> TIM1_CH1
  198. PA9 ------> TIM1_CH2
  199. PA10 ------> TIM1_CH3
  200. PA11 ------> TIM1_CH4
  201. */
  202. HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_12);
  203. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11);
  204. /* Peripheral interrupt Deinit*/
  205. HAL_NVIC_DisableIRQ(TIM1_UP_IRQn);
  206. HAL_NVIC_DisableIRQ(TIM1_BRK_IRQn);
  207. }
  208. else if(htim_base->Instance==TIM2)
  209. {
  210. /* USER CODE BEGIN TIM2_MspDeInit 0 */
  211. /* USER CODE END TIM2_MspDeInit 0 */
  212. /* Peripheral clock disable */
  213. __HAL_RCC_TIM2_CLK_DISABLE();
  214. /**TIM2 GPIO Configuration
  215. PA0-WKUP ------> TIM2_ETR
  216. */
  217. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0);
  218. /* USER CODE BEGIN TIM2_MspDeInit 1 */
  219. /* USER CODE END TIM2_MspDeInit 1 */
  220. }
  221. /* USER CODE BEGIN TIM1_MspDeInit 1 */
  222. /* USER CODE END TIM1_MspDeInit 1 */
  223. }
  224. /* TIM3 init function */
  225. void MX_TIM3_Init(void)
  226. {
  227. TIM_MasterConfigTypeDef sMasterConfig;
  228. TIM_OC_InitTypeDef sConfigOC;
  229. htim3.Instance = TIM3;
  230. htim3.Init.Prescaler = 0;
  231. htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  232. htim3.Init.Period = 71; //频率1MHz
  233. htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  234. htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  235. if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  236. {
  237. _Error_Handler(__FILE__, __LINE__);
  238. }
  239. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  240. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  241. if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  242. {
  243. _Error_Handler(__FILE__, __LINE__);
  244. }
  245. sConfigOC.OCMode = TIM_OCMODE_PWM1;
  246. sConfigOC.Pulse = 36;
  247. sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  248. sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  249. if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  250. {
  251. _Error_Handler(__FILE__, __LINE__);
  252. }
  253. HAL_TIM_MspPostInit(&htim3);
  254. }
  255. void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* tim_pwmHandle)
  256. {
  257. if(tim_pwmHandle->Instance==TIM3)
  258. {
  259. /* USER CODE BEGIN TIM3_MspInit 0 */
  260. /* USER CODE END TIM3_MspInit 0 */
  261. /* TIM3 clock enable */
  262. __HAL_RCC_TIM3_CLK_ENABLE();
  263. /* USER CODE BEGIN TIM3_MspInit 1 */
  264. /* USER CODE END TIM3_MspInit 1 */
  265. }
  266. }
  267. void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
  268. {
  269. GPIO_InitTypeDef GPIO_InitStruct;
  270. if(timHandle->Instance==TIM3)
  271. {
  272. /* USER CODE BEGIN TIM3_MspPostInit 0 */
  273. /* USER CODE END TIM3_MspPostInit 0 */
  274. /**TIM3 GPIO Configuration
  275. PC6 ------> TIM3_CH1
  276. */
  277. GPIO_InitStruct.Pin = GPIO_PIN_6;
  278. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  279. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  280. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  281. __HAL_AFIO_REMAP_TIM3_ENABLE();
  282. /* USER CODE BEGIN TIM3_MspPostInit 1 */
  283. HAL_TIM_OC_Start(&htim3, TIM_CHANNEL_1);
  284. /* USER CODE END TIM3_MspPostInit 1 */
  285. }
  286. }
  287. void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* tim_pwmHandle)
  288. {
  289. if(tim_pwmHandle->Instance==TIM3)
  290. {
  291. /* USER CODE BEGIN TIM3_MspDeInit 0 */
  292. /* USER CODE END TIM3_MspDeInit 0 */
  293. /* Peripheral clock disable */
  294. __HAL_RCC_TIM3_CLK_DISABLE();
  295. /* USER CODE BEGIN TIM3_MspDeInit 1 */
  296. /* USER CODE END TIM3_MspDeInit 1 */
  297. }
  298. }
  299. /* USER CODE BEGIN 1 */
  300. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  301. {
  302. static uint8_t ADC_PreCnt = 0;
  303. static TrueOrFalse_Flag_Struct_t IsPwmEnableFlag = FALSE;
  304. static uint32_t FaultDelayTimeCnt = 0;
  305. #if 1
  306. static uint16_t PeriodTest = 0;
  307. //运行频率测试
  308. PeriodTest ++;
  309. if(PeriodTest >= 300) //频率15K,周期200 / 3 us * 300 = 20ms
  310. {
  311. PeriodTest = 0;
  312. }
  313. #endif
  314. //ADC采集分频
  315. ADC_PreCnt++;
  316. if(ADC_PreCnt >= 5)
  317. {
  318. __HAL_ADC_ENABLE(&hadc1);
  319. ADC_PreCnt = 0;
  320. }
  321. //霍尔传感器状态更新
  322. MC_HallSensorData.PWM_NumCnt++;
  323. HallSensor_Process();
  324. if(MC_HallSensorData.Delta_AngleSum < (ANGLE_60D + (ANGLE_60D >> 3)))
  325. {
  326. MC_HallSensorData.SVM_Angle += MC_HallSensorData.Delta_Angle;
  327. MC_HallSensorData.Delta_AngleSum += MC_HallSensorData.Delta_Angle;
  328. }
  329. //计算电机转速
  330. MC_RunInfo.MotorSpeed = MotorSpeedCal(MC_HallSensorData.SVM_Angle, MC_HallSensorData.IsStopFlag);
  331. //过流检测
  332. MC_Protect_OverCurrent_Process(&MC_Protect_OverCurrentTrig_Flag, &MC_ErrorCode);
  333. //FOC运算
  334. if(((uint8_t)(MC_CalParam.AssistRunMode ^ MC_CalParam_Back.AssistRunMode) != (uint8_t)~0) ||
  335. ((uint8_t)(MC_CalParam.Foc_Flag ^ MC_CalParam_Back.Foc_Flag) != (uint8_t)~0) ||
  336. ((uint16_t)(MC_CalParam.Ref_Speed ^ MC_CalParam_Back.Ref_Speed) != (uint16_t)~0)||
  337. ((uint16_t)(MC_CalParam.Ref_Torque ^ MC_CalParam_Back.Ref_Torque) != (uint16_t)~0))
  338. {
  339. if((HAL_GetTick() - FaultDelayTimeCnt) > 200)
  340. {
  341. FOC_Status = FOC_Status_WAIT;
  342. }
  343. }
  344. else
  345. {
  346. FaultDelayTimeCnt = HAL_GetTick();
  347. }
  348. switch(FOC_Status)
  349. {
  350. case FOC_Status_RUN:
  351. {
  352. if(MC_CalParam.Foc_Flag == SET)
  353. {
  354. //发波
  355. if(IsPwmEnableFlag == FALSE)
  356. {
  357. Enable_PwmGpio_Out();
  358. IsPwmEnableFlag = TRUE;
  359. }
  360. //参考值设定
  361. switch(MC_CalParam.AssistRunMode)
  362. {
  363. case MC_AssistRunMode_TORQUE://力矩模式
  364. {
  365. FOC_Model(MC_CalParam.Ref_Torque, MC_RunInfo.MotorSpeed, MC_HallSensorData.SVM_Angle);
  366. break;
  367. }
  368. case MC_AssistRunMode_WALK: case MC_AssistRunMode_CADENCE: case MC_AssistRunMode_GAS://速度模式
  369. {
  370. FOC_Model(MC_CalParam.Ref_Speed, MC_RunInfo.MotorSpeed, MC_HallSensorData.SVM_Angle);
  371. break;
  372. }
  373. default:break;
  374. }
  375. }
  376. break;
  377. }
  378. case FOC_Status_WAIT:
  379. {
  380. IsPwmEnableFlag = FALSE;
  381. break;
  382. }
  383. default:break;
  384. }
  385. }
  386. void HAL_TIMEx_BreakCallback(TIM_HandleTypeDef *htim)
  387. {
  388. __HAL_TIM_CLEAR_IT(htim, TIM_IT_BREAK);
  389. }
  390. /* USER CODE END 1 */
  391. /**
  392. * @}
  393. */
  394. /**
  395. * @}
  396. */
  397. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/