tim.c 14 KB

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