adc.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834
  1. /**
  2. ******************************************************************************
  3. * File Name : ADC.c
  4. * Description : This file provides code for the configuration
  5. * of the ADC instances.
  6. ******************************************************************************
  7. ** This notice applies to any and all portions of this file
  8. * that are not between comment pairs USER CODE BEGIN and
  9. * USER CODE END. Other portions of this file, whether
  10. * inserted by the user or by software development tools
  11. * are owned by their respective copyright owners.
  12. *
  13. * COPYRIGHT(c) 2019 STMicroelectronics
  14. *
  15. * Redistribution and use in source and binary forms, with or without modification,
  16. * are permitted provided that the following conditions are met:
  17. * 1. Redistributions of source code must retain the above copyright notice,
  18. * this list of conditions and the following disclaimer.
  19. * 2. Redistributions in binary form must reproduce the above copyright notice,
  20. * this list of conditions and the following disclaimer in the documentation
  21. * and/or other materials provided with the distribution.
  22. * 3. Neither the name of STMicroelectronics nor the names of its contributors
  23. * may be used to endorse or promote products derived from this software
  24. * without specific prior written permission.
  25. *
  26. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  27. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  28. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  29. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  30. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  31. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  32. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  33. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  34. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  35. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  36. *
  37. ******************************************************************************
  38. */
  39. /* Includes ------------------------------------------------------------------*/
  40. #include "adc.h"
  41. #include "gpio.h"
  42. #include "dma.h"
  43. /* USER CODE BEGIN 0 */
  44. #include "ntc_sensor.h"
  45. #include "tim.h"
  46. #include "hall_sensor.h"
  47. #include "MC_Globals.h"
  48. #include "gas_sensor.h"
  49. #include "torque_sensor.h"
  50. #include "math_tools.h"
  51. #include "motor_control.h"
  52. #include "remain_distance.h"
  53. uint16_t ADC1_Result[ADC1_DATA_NUM] = {0};
  54. uint16_t ADC1_Result_Filt[ADC1_DATA_NUM] = {0};
  55. uint16_t ADC2_Result[ADC2_DATA_NUM] = {0};
  56. uint16_t ADC2_Result_Filt[ADC2_DATA_NUM]= {0};
  57. FlagStatus ADC2_ConvCpmplete_Flag = RESET;
  58. ADC_SensorData_Struct_t ADC_SensorData = {0, 0};//力矩传感器和指拨传感器
  59. ADC_3ShuntCurrent_OffSet_Struct_t ADC_3ShuntCurrent_OffSet = {32768, 32768, 32768};//三相电流零点
  60. ADC_3ShuntCurrent_Struct_t ADC_3ShuntCurrent = {0};
  61. ADC_3ShuntCurrent_Struct_t ADC_3ShuntCurrent_RMSValue = {0};
  62. uint16_t uw_current_offset = 2048;//母线电流零点
  63. /* USER CODE END 0 */
  64. ADC_HandleTypeDef hadc1;
  65. ADC_HandleTypeDef hadc2;
  66. DMA_HandleTypeDef hdma_adc1;
  67. /* ADC1 init function */
  68. void MX_ADC1_Init(void)
  69. {
  70. ADC_ChannelConfTypeDef sConfig;
  71. /**Common config
  72. */
  73. hadc1.Instance = ADC1;
  74. hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  75. hadc1.Init.ContinuousConvMode = DISABLE;
  76. hadc1.Init.DiscontinuousConvMode = DISABLE;
  77. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  78. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  79. hadc1.Init.NbrOfConversion = 11;
  80. if (HAL_ADC_Init(&hadc1) != HAL_OK)
  81. {
  82. _Error_Handler(__FILE__, __LINE__);
  83. }
  84. /**Configure Regular Channel PCB温度
  85. */
  86. sConfig.Channel = ADC_CHANNEL_10;
  87. sConfig.Rank = ADC_REGULAR_RANK_1;
  88. sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  89. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  90. {
  91. _Error_Handler(__FILE__, __LINE__);
  92. }
  93. /**Configure Regular Channel 母线电压
  94. */
  95. sConfig.Channel = ADC_CHANNEL_11;
  96. sConfig.Rank = ADC_REGULAR_RANK_2;
  97. sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  98. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  99. {
  100. _Error_Handler(__FILE__, __LINE__);
  101. }
  102. /**Configure Regular Channel 绕组温度
  103. */
  104. sConfig.Channel = ADC_CHANNEL_12;
  105. sConfig.Rank = ADC_REGULAR_RANK_3;
  106. sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  107. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  108. {
  109. _Error_Handler(__FILE__, __LINE__);
  110. }
  111. /**Configure Regular Channel 母线电流
  112. */
  113. sConfig.Channel = ADC_CHANNEL_13;
  114. sConfig.Rank = ADC_REGULAR_RANK_4;
  115. sConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
  116. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  117. {
  118. _Error_Handler(__FILE__, __LINE__);
  119. }
  120. /**Configure Regular Channel 力矩传感器1
  121. */
  122. sConfig.Channel = ADC_CHANNEL_5;
  123. sConfig.Rank = ADC_REGULAR_RANK_5;
  124. sConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
  125. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  126. {
  127. _Error_Handler(__FILE__, __LINE__);
  128. }
  129. /**Configure Regular Channel 力矩传感器2
  130. */
  131. sConfig.Channel = ADC_CHANNEL_4;
  132. sConfig.Rank = ADC_REGULAR_RANK_6;
  133. sConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
  134. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  135. {
  136. _Error_Handler(__FILE__, __LINE__);
  137. }
  138. /**Configure Regular Channel 力矩传感器3
  139. */
  140. sConfig.Channel = ADC_CHANNEL_15;
  141. sConfig.Rank = ADC_REGULAR_RANK_7;
  142. sConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
  143. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  144. {
  145. _Error_Handler(__FILE__, __LINE__);
  146. }
  147. /**Configure Regular Channel TE工作电压
  148. */
  149. sConfig.Channel = ADC_CHANNEL_7;
  150. sConfig.Rank = ADC_REGULAR_RANK_8;
  151. sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  152. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  153. {
  154. _Error_Handler(__FILE__, __LINE__);
  155. }
  156. /**Configure Regular Channel 指拨输入
  157. */
  158. sConfig.Channel = ADC_CHANNEL_14;
  159. sConfig.Rank = ADC_REGULAR_RANK_9;
  160. sConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
  161. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  162. {
  163. _Error_Handler(__FILE__, __LINE__);
  164. }
  165. /**Configure Regular Channel MCU温度
  166. */
  167. sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
  168. sConfig.Rank = ADC_REGULAR_RANK_10;
  169. sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5;
  170. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  171. {
  172. _Error_Handler(__FILE__, __LINE__);
  173. }
  174. /**Configure Regular Channel Vref
  175. */
  176. sConfig.Channel = ADC_CHANNEL_VREFINT;
  177. sConfig.Rank = ADC_REGULAR_RANK_11;
  178. sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  179. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  180. {
  181. _Error_Handler(__FILE__, __LINE__);
  182. }
  183. }
  184. /* ADC2 init function */
  185. void MX_ADC2_Init(void)
  186. {
  187. ADC_InjectionConfTypeDef sConfigInjected;
  188. /**Common config
  189. */
  190. hadc2.Instance = ADC2;
  191. hadc2.Init.ScanConvMode = ADC_SCAN_ENABLE;
  192. hadc2.Init.ContinuousConvMode = DISABLE;
  193. hadc2.Init.DiscontinuousConvMode = DISABLE;
  194. hadc2.Init.ExternalTrigConv = ADC_EXTERNALTRIGINJECCONV_EDGE_NONE;
  195. hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  196. hadc2.Init.NbrOfConversion = 1;
  197. if (HAL_ADC_Init(&hadc2) != HAL_OK)
  198. {
  199. _Error_Handler(__FILE__, __LINE__);
  200. }
  201. /**Configure Injected Channel
  202. */
  203. sConfigInjected.InjectedChannel = ADC_CHANNEL_1;
  204. sConfigInjected.InjectedRank = ADC_INJECTED_RANK_1;
  205. sConfigInjected.InjectedNbrOfConversion = 3;
  206. sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  207. sConfigInjected.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJECCONV_T1_CC4;
  208. sConfigInjected.AutoInjectedConv = DISABLE;
  209. sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
  210. sConfigInjected.InjectedOffset = 0;
  211. if (HAL_ADCEx_InjectedConfigChannel(&hadc2, &sConfigInjected) != HAL_OK)
  212. {
  213. _Error_Handler(__FILE__, __LINE__);
  214. }
  215. /**Configure Injected Channel
  216. */
  217. sConfigInjected.InjectedChannel = ADC_CHANNEL_2;
  218. sConfigInjected.InjectedRank = ADC_INJECTED_RANK_2;
  219. if (HAL_ADCEx_InjectedConfigChannel(&hadc2, &sConfigInjected) != HAL_OK)
  220. {
  221. _Error_Handler(__FILE__, __LINE__);
  222. }
  223. /**Configure Injected Channel
  224. */
  225. sConfigInjected.InjectedChannel = ADC_CHANNEL_3;
  226. sConfigInjected.InjectedRank = ADC_INJECTED_RANK_3;
  227. if (HAL_ADCEx_InjectedConfigChannel(&hadc2, &sConfigInjected) != HAL_OK)
  228. {
  229. _Error_Handler(__FILE__, __LINE__);
  230. }
  231. }
  232. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
  233. {
  234. GPIO_InitTypeDef GPIO_InitStruct;
  235. if(adcHandle->Instance==ADC1)
  236. {
  237. /* USER CODE BEGIN ADC1_MspInit 0 */
  238. /* USER CODE END ADC1_MspInit 0 */
  239. /* ADC1 clock enable */
  240. __HAL_RCC_ADC1_CLK_ENABLE();
  241. /**ADC1 GPIO Configuration
  242. PC0 ------> ADC1_IN10
  243. PC1 ------> ADC1_IN11
  244. PC2 ------> ADC1_IN12
  245. PC3 ------> ADC1_IN13
  246. PA4 ------> ADC1_IN4
  247. PA5 ------> ADC1_IN5
  248. PA7 ------> ADC1_IN7
  249. PC4 ------> ADC1_IN14
  250. PC5 ------> ADC1_IN15
  251. */
  252. GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
  253. |GPIO_PIN_4|GPIO_PIN_5;
  254. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  255. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  256. GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7;
  257. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  258. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  259. /* ADC1 DMA Init */
  260. /* ADC1 Init */
  261. hdma_adc1.Instance = DMA1_Channel1;
  262. hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
  263. hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
  264. hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
  265. hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  266. hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  267. hdma_adc1.Init.Mode = DMA_CIRCULAR;
  268. hdma_adc1.Init.Priority = DMA_PRIORITY_LOW;
  269. if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
  270. {
  271. _Error_Handler(__FILE__, __LINE__);
  272. }
  273. __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
  274. /* USER CODE BEGIN ADC1_MspInit 1 */
  275. /* USER CODE END ADC1_MspInit 1 */
  276. }
  277. else if(adcHandle->Instance==ADC2)
  278. {
  279. /* USER CODE BEGIN ADC2_MspInit 0 */
  280. /* USER CODE END ADC2_MspInit 0 */
  281. /* ADC2 clock enable */
  282. __HAL_RCC_ADC2_CLK_ENABLE();
  283. /**ADC2 GPIO Configuration
  284. PA1 ------> ADC2_IN1
  285. PA2 ------> ADC2_IN2
  286. PA3 ------> ADC2_IN3
  287. */
  288. GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
  289. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  290. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  291. /* ADC2 interrupt Init */
  292. HAL_NVIC_SetPriority(ADC1_2_IRQn, 1, 1);
  293. HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
  294. /* USER CODE BEGIN ADC2_MspInit 1 */
  295. /* USER CODE END ADC2_MspInit 1 */
  296. }
  297. }
  298. void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
  299. {
  300. if(adcHandle->Instance==ADC1)
  301. {
  302. /* USER CODE BEGIN ADC1_MspDeInit 0 */
  303. /* USER CODE END ADC1_MspDeInit 0 */
  304. /* Peripheral clock disable */
  305. __HAL_RCC_ADC1_CLK_DISABLE();
  306. /**ADC1 GPIO Configuration
  307. PC0 ------> ADC1_IN10
  308. PC1 ------> ADC1_IN11
  309. PC2 ------> ADC1_IN12
  310. PC3 ------> ADC1_IN13
  311. PA4 ------> ADC1_IN4
  312. PA5 ------> ADC1_IN5
  313. PA7 ------> ADC1_IN7
  314. PC4 ------> ADC1_IN14
  315. PC5 ------> ADC1_IN15
  316. */
  317. HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
  318. |GPIO_PIN_4|GPIO_PIN_5);
  319. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7);
  320. /* ADC1 DMA DeInit */
  321. HAL_DMA_DeInit(adcHandle->DMA_Handle);
  322. /* USER CODE BEGIN ADC1_MspDeInit 1 */
  323. /* USER CODE END ADC1_MspDeInit 1 */
  324. }
  325. else if(adcHandle->Instance==ADC2)
  326. {
  327. /* USER CODE BEGIN ADC2_MspDeInit 0 */
  328. /* USER CODE END ADC2_MspDeInit 0 */
  329. /* Peripheral clock disable */
  330. __HAL_RCC_ADC2_CLK_DISABLE();
  331. /**ADC2 GPIO Configuration
  332. PA1 ------> ADC2_IN1
  333. PA2 ------> ADC2_IN2
  334. PA3 ------> ADC2_IN3
  335. */
  336. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
  337. /* USER CODE BEGIN ADC2_MspDeInit 1 */
  338. /* USER CODE END ADC2_MspDeInit 1 */
  339. }
  340. }
  341. /* USER CODE BEGIN 1 */
  342. void ADC_Start(void)
  343. {
  344. HAL_ADCEx_Calibration_Start(&hadc1);
  345. HAL_ADCEx_Calibration_Start(&hadc2);
  346. HAL_ADC_Start(&hadc1);
  347. HAL_ADC_Start(&hadc2);
  348. HAL_ADCEx_InjectedStart_IT(&hadc2);
  349. HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result, ADC1_DATA_NUM);
  350. __HAL_DMA_DISABLE_IT(hadc1.DMA_Handle, DMA_IT_HT);
  351. HAL_TIM_Base_Start_IT(&PWM_TIMER);
  352. HAL_TIM_PWM_Start(&PWM_TIMER, TIM_CHANNEL_4);
  353. HAL_TIMEx_PWMN_Start(&PWM_TIMER, TIM_CHANNEL_4);
  354. }
  355. //更新三相电流采样值
  356. void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc)
  357. {
  358. //更新3相电流采样值
  359. ADC2_Result[ADC2_RANK_CURRENT_B] = HAL_ADCEx_InjectedGetValue(hadc,1) << 4;
  360. ADC2_Result[ADC2_RANK_CURRENT_C] = HAL_ADCEx_InjectedGetValue(hadc,2) << 4;
  361. ADC2_Result[ADC2_RANK_CURRENT_A] = HAL_ADCEx_InjectedGetValue(hadc,3) << 4;
  362. //计算三相电流
  363. ADC_3ShuntCurrent.uw_phase_a = (int16_t)(ADC_3ShuntCurrent_OffSet.uw_phase_a_offset - ADC2_Result[ADC2_RANK_CURRENT_A]);
  364. ADC_3ShuntCurrent.uw_phase_b = (int16_t)(ADC_3ShuntCurrent_OffSet.uw_phase_b_offset - ADC2_Result[ADC2_RANK_CURRENT_B]);
  365. ADC_3ShuntCurrent.uw_phase_c = (int16_t)(ADC_3ShuntCurrent_OffSet.uw_phase_c_offset - ADC2_Result[ADC2_RANK_CURRENT_C]);
  366. ///计算三相电流有效值
  367. PhaseCurrent_CalRMSValue(&ADC_3ShuntCurrent, &ADC_3ShuntCurrent_RMSValue);
  368. ADC2_ConvCpmplete_Flag = SET;
  369. }
  370. //更新ADC采样结果
  371. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
  372. {
  373. #if 1
  374. static uint32_t PeriodTestCnt = 0;
  375. PeriodTestCnt++;
  376. if(PeriodTestCnt > 300)
  377. {
  378. PeriodTestCnt = 0;
  379. }
  380. #endif
  381. int16_t Temp_16;
  382. int32_t Temp_32;
  383. static int32_t BusVoltageFltSum = 0;
  384. static int32_t IdcFltSum = 0;
  385. static uint16_t T_Filt_Cnt = 0;
  386. static uint32_t T_Coil_Sum = 0;
  387. static uint32_t T_PCB_Sum = 0;
  388. static uint32_t T_MCU_Sum = 0;
  389. static TrueOrFalse_Flag_Struct_t T_MCU_Init_Flag = FALSE;
  390. static uint8_t T_MCU_Init = 0;
  391. static uint16_t T_MCU_Init_AD = 0;
  392. static int32_t GasSensorFltSum = 0, HardwareVersionADFltSum=0;
  393. static TrueOrFalse_Flag_Struct_t MOS_NTC_InitFinishedFlag = FALSE;
  394. //更新PCB温度,绕组温度,MCU温度
  395. if(VersionIdentifyFinishedFlag == FALSE) //硬件版本未识别前,温度默认为25度
  396. {
  397. MC_RunInfo.T_PCB = 65;
  398. MC_RunInfo.T_Coil = 65;
  399. MC_RunInfo.T_MCU = 65;
  400. }
  401. else
  402. {
  403. if( MC_HallSensorData.InverterExistFlag == FALSE )
  404. {
  405. if(MOS_NTC_InitFinishedFlag == FALSE)
  406. {
  407. MOS_NTC_InitFinishedFlag = TRUE;
  408. MOS_NTC_Init();
  409. }
  410. }
  411. T_PCB_Sum += ADC1_Result[ADC1_RANK_NTC_PCB];
  412. T_Coil_Sum += ADC1_Result[ADC1_RANK_NTC_COIL];
  413. T_MCU_Sum += ADC1_Result[ADC1_RANK_TP_MCU];
  414. T_Filt_Cnt++;
  415. if(T_Filt_Cnt >= 3000)
  416. {
  417. if( MC_HallSensorData.InverterExistFlag == FALSE )
  418. {
  419. MC_RunInfo.T_PCB = GetNTCTempera_20K(T_PCB_Sum / 3000);
  420. MC_RunInfo.T_Coil = GetNTCTempera_20K(T_Coil_Sum / 3000);
  421. MC_RunInfo.T_MCU = GetNTCTempera_20K(T_MCU_Sum / 3000); //MOS管NTC温度
  422. }
  423. else
  424. {
  425. //计算PCB温度
  426. MC_RunInfo.T_PCB = GetNTCTempera(T_PCB_Sum / 3000);
  427. //计算绕组温度
  428. MC_RunInfo.T_Coil = GetNTCTempera(T_Coil_Sum / 3000);
  429. //MCU温度根据PCB初始温度进行校准
  430. if(T_MCU_Init_Flag == FALSE)
  431. {
  432. T_MCU_Init = MC_RunInfo.T_PCB;//校准时温度
  433. T_MCU_Init_AD = T_MCU_Sum / 3000;//校准时AD值
  434. T_MCU_Init_Flag = TRUE;
  435. }
  436. //计算MCU温度
  437. MC_RunInfo.T_MCU = T_MCU_Init + ((int16_t)(T_MCU_Init_AD - T_MCU_Sum / 3000) * 192 >> 10);//4.3mV/度, 3300 / 4095 / 4.3 * 1024 = 192
  438. }
  439. T_Filt_Cnt = 0;
  440. T_PCB_Sum = 0;
  441. T_Coil_Sum = 0;
  442. T_MCU_Sum = 0;
  443. }
  444. }
  445. //更新母线电压
  446. BusVoltageFltSum += ((ADC1_Result[ADC1_RANK_VIN] << 10) - BusVoltageFltSum) >> 9;
  447. MC_RunInfo.BusVoltage = (uint32_t)((BusVoltageFltSum >> 10) * 18382) >> 10;//3300 * 1047 / (4095 * 47)
  448. MC_RunInfo.BusVoltage += (MC_RunInfo.BusCurrent >> 7) * 25; //根据母线电流和估算的线阻进行补偿, 补偿电阻 0.2 * 128 = 25.6
  449. if( MCUManufacturer == HK32F103RBT6 )
  450. {
  451. MC_RunInfo.BusVoltage = ((MC_RunInfo.BusVoltage - 8100) * 1402) >> 10;
  452. }
  453. //累加计算母线电压
  454. if((Battery_Info.BFlagCalSoc == FALSE) && (HAL_GetTick() >= 2000))
  455. {
  456. Battery_Info.u16CurVoltage = MC_RunInfo.BusVoltage / 10;
  457. Battery_Info.u32TotalBusVoltage += Battery_Info.u16CurVoltage;
  458. Battery_Info.u32GetvalCnt++;
  459. if(Battery_Info.u32GetvalCnt >= 15000) //5 * 3K = 5s 电压平均值计算周期5s
  460. {
  461. Battery_Info.u32GetvalCnt = 0;
  462. Battery_Info.BFlagCalSoc = TRUE;
  463. }
  464. }
  465. //更新母线电流
  466. if( MC_HallSensorData.InverterExistFlag == FALSE )
  467. {
  468. Temp_32 = (ADC1_Result[ADC1_RANK_CURRENT] - uw_current_offset) * 39449 >> 10; //3300/4095* 0.98/8.2 /0.0025
  469. Temp_32 = (Temp_32 <= 0) ? 0 : ((Temp_32 >= 39449) ? 39448 : Temp_32);
  470. }
  471. else
  472. {
  473. Temp_32 = (ADC1_Result[ADC1_RANK_CURRENT] - uw_current_offset) * 50000 >> 11; //3300/4095* 0.98/13 /0.0025
  474. Temp_32 = (Temp_32 <= 0) ? 0 : ((Temp_32 >= 50000) ? 50000 : Temp_32);
  475. }
  476. IdcFltSum += ((Temp_32 << 10) - IdcFltSum) >> 9;
  477. MC_RunInfo.BusCurrent = IdcFltSum >> 10;
  478. //更新力矩传感器
  479. switch(TorsueSensorFaultStatus.FaultStatusCode)
  480. {
  481. case 0x00://无传感器异常,取三个传感器的平均值
  482. {
  483. Temp_16 = (ADC1_Result[ADC1_RANK_TORQUE_SENSOR_1] - TorqueSensor_1_Param.Torque_OffSetData.PresentData) * 100 / TorqueSensor_1_Param.Torque_Cal_K;
  484. Temp_16 = (Temp_16 <= 0) ? 0 : Temp_16;
  485. MC_RunInfo.TorqueSensorData1 = Temp_16 / 28;
  486. Temp_32 = Temp_16;
  487. Temp_16 = (ADC1_Result[ADC1_RANK_TORQUE_SENSOR_2] - TorqueSensor_2_Param.Torque_OffSetData.PresentData) * 100 / TorqueSensor_2_Param.Torque_Cal_K;
  488. Temp_16 = (Temp_16 <= 0) ? 0 : Temp_16;
  489. MC_RunInfo.TorqueSensorData2 = Temp_16 / 28;
  490. Temp_32 += Temp_16;
  491. Temp_16 = (ADC1_Result[ADC1_RANK_TORQUE_SENSOR_3] - TorqueSensor_3_Param.Torque_OffSetData.PresentData) * 100 / TorqueSensor_3_Param.Torque_Cal_K;
  492. Temp_16 = (Temp_16 <= 0) ? 0 : Temp_16;
  493. MC_RunInfo.TorqueSensorData3 = Temp_16 / 28;
  494. Temp_32 += Temp_16;
  495. Temp_32 = ((Temp_32 <= 0) ? 0 : Temp_32 / 3);
  496. break;
  497. }
  498. case 0x01://传感器1异常,取传感器2,3平均值
  499. {
  500. Temp_16 = (ADC1_Result[ADC1_RANK_TORQUE_SENSOR_2] - TorqueSensor_2_Param.Torque_OffSetData.PresentData) * 100 / TorqueSensor_2_Param.Torque_Cal_K;
  501. Temp_16 = (Temp_16 <= 0) ? 0 : Temp_16;
  502. MC_RunInfo.TorqueSensorData2 = Temp_16 / 28;
  503. Temp_32 = Temp_16;
  504. Temp_16 = (ADC1_Result[ADC1_RANK_TORQUE_SENSOR_3] - TorqueSensor_3_Param.Torque_OffSetData.PresentData) * 100 / TorqueSensor_3_Param.Torque_Cal_K;
  505. Temp_16 = (Temp_16 <= 0) ? 0 : Temp_16;
  506. MC_RunInfo.TorqueSensorData3 = Temp_16 / 28;
  507. Temp_32 += Temp_16;
  508. Temp_32 = ((Temp_32 <= 0) ? 0 : Temp_32 / 2);
  509. break;
  510. }
  511. case 0x02://传感器2异常,取传感器1,3平均值
  512. {
  513. Temp_16 = (ADC1_Result[ADC1_RANK_TORQUE_SENSOR_1] - TorqueSensor_1_Param.Torque_OffSetData.PresentData) * 100 / TorqueSensor_1_Param.Torque_Cal_K;
  514. Temp_16 = (Temp_16 <= 0) ? 0 : Temp_16;
  515. MC_RunInfo.TorqueSensorData1 = Temp_16 / 28;
  516. Temp_32 = Temp_16;
  517. Temp_16 = (ADC1_Result[ADC1_RANK_TORQUE_SENSOR_3] - TorqueSensor_3_Param.Torque_OffSetData.PresentData) * 100 / TorqueSensor_3_Param.Torque_Cal_K;
  518. Temp_16 = (Temp_16 <= 0) ? 0 : Temp_16;
  519. MC_RunInfo.TorqueSensorData3 = Temp_16 / 28;
  520. Temp_32 += Temp_16;
  521. Temp_32 = ((Temp_32 <= 0) ? 0 : Temp_32 / 2);
  522. break;
  523. }
  524. case 0x04://传感器3异常,取传感器1,2平均值
  525. {
  526. Temp_16 = (ADC1_Result[ADC1_RANK_TORQUE_SENSOR_1] - TorqueSensor_1_Param.Torque_OffSetData.PresentData) * 100 / TorqueSensor_1_Param.Torque_Cal_K;
  527. Temp_16 = (Temp_16 <= 0) ? 0 : Temp_16;
  528. MC_RunInfo.TorqueSensorData1 = Temp_16 / 28;
  529. Temp_32 = Temp_16;
  530. Temp_16 = (ADC1_Result[ADC1_RANK_TORQUE_SENSOR_2] - TorqueSensor_2_Param.Torque_OffSetData.PresentData) * 100 / TorqueSensor_2_Param.Torque_Cal_K;
  531. Temp_16 = (Temp_16 <= 0) ? 0 : Temp_16;
  532. MC_RunInfo.TorqueSensorData2 = Temp_16 / 28;
  533. Temp_32 += Temp_16;
  534. Temp_32 = ((Temp_32 <= 0) ? 0 : Temp_32 / 2);
  535. break;
  536. }
  537. case 0x03://传感器1 2异常,取传感器3
  538. {
  539. Temp_16 = (ADC1_Result[ADC1_RANK_TORQUE_SENSOR_3] - TorqueSensor_3_Param.Torque_OffSetData.PresentData) * 100 / TorqueSensor_3_Param.Torque_Cal_K;
  540. Temp_16 = (Temp_16 <= 0) ? 0 : Temp_16;
  541. MC_RunInfo.TorqueSensorData3 = Temp_16 / 28;
  542. Temp_32 = Temp_16;
  543. break;
  544. }
  545. case 0x05://传感器1 3异常,取传感器2
  546. {
  547. Temp_16 = (ADC1_Result[ADC1_RANK_TORQUE_SENSOR_2] - TorqueSensor_2_Param.Torque_OffSetData.PresentData) * 100 / TorqueSensor_2_Param.Torque_Cal_K;
  548. Temp_16 = (Temp_16 <= 0) ? 0 : Temp_16;
  549. MC_RunInfo.TorqueSensorData2 = Temp_16 / 28;
  550. Temp_32 = Temp_16;
  551. break;
  552. }
  553. case 0x06://传感器2 3异常,取传感器1
  554. {
  555. Temp_16 = (ADC1_Result[ADC1_RANK_TORQUE_SENSOR_1] - TorqueSensor_1_Param.Torque_OffSetData.PresentData) * 100 / TorqueSensor_1_Param.Torque_Cal_K;
  556. Temp_16 = (Temp_16 <= 0) ? 0 : Temp_16;
  557. MC_RunInfo.TorqueSensorData1 = Temp_16 / 28;
  558. Temp_32 = Temp_16;
  559. break;
  560. }
  561. default://超过3个传感器异常
  562. {
  563. Temp_32 = 0;
  564. break;
  565. }
  566. }
  567. #if 1 //采用原始采集值
  568. #if NormalWork //正常运行
  569. ADC_SensorData.TorqueSensor = Temp_32;
  570. #else //用于寿命测试,模拟输入力矩
  571. if(HAL_GetTick() < 5000)
  572. {
  573. Temp_32 = 0;
  574. }
  575. else
  576. {
  577. static uint32_t WaveTime_Zero = 0;
  578. static uint32_t Time_Enter = 0;
  579. if((HAL_GetTick() - Time_Enter) > 10)
  580. {
  581. WaveTime_Zero = HAL_GetTick();
  582. }
  583. Time_Enter = HAL_GetTick();
  584. Temp_32 = TriangleWaveGenerate(WaveTime_Zero, 250, 500 ,1500);
  585. }
  586. ADC_SensorData.TorqueSensor = Temp_32;
  587. #endif
  588. #else //采用滤波值
  589. static int32_t TorqueFltSum = 0;
  590. TorqueFltSum += ((Temp_32 << 10) - TorqueFltSum) >> 8;
  591. ADC_SensorData.TorqueSensor = TorqueFltSum >> 10;
  592. #endif
  593. //更新指拨
  594. if(IsGasSensorConnectedFlag == TRUE)
  595. {
  596. Temp_32 = ADC1_Result[ADC1_RANK_GAS] - GasSensor_OffSet;
  597. Temp_32 = (Temp_32 <= 0) ? 0 : Temp_32;
  598. GasSensorFltSum += ((Temp_32 << 10) - GasSensorFltSum) >> 8; //滤波延时0.33*256=85.3ms
  599. ADC_SensorData.GasSensor = GasSensorFltSum >> 10;
  600. }
  601. else
  602. {
  603. ADC_SensorData.GasSensor = 0;
  604. }
  605. //更新硬件版本AD
  606. HardwareVersionADFltSum += ((ADC1_Result[ADC1_RANK_HARDWARE_VER] << 10) - HardwareVersionADFltSum) >> 9;
  607. HardwareVersion_AD = (uint16_t)(HardwareVersionADFltSum >> 10);
  608. PowerDownProtection(ADC1_Result[ADC1_RANK_VIN]);
  609. }
  610. //ADC1和ADC2数据滑动滤波
  611. void ADC_SensorData_Filt(uint16_t* p_ADC1_Result_Filt, uint16_t* p_ADC2_Result_Filt)
  612. {
  613. static uint32_t PeriodTimeCnt = 0;
  614. static int32_t ADC1_FltSum[ADC1_DATA_NUM] = {0};
  615. static int32_t ADC2_FltSum[ADC2_DATA_NUM] = {0};
  616. uint8_t i;
  617. if((HAL_GetTick() - PeriodTimeCnt) >= 2)
  618. {
  619. for(i=0; i<ADC1_DATA_NUM; i++)
  620. {
  621. ADC1_FltSum[i] += ((ADC1_Result[i] << 10) - ADC1_FltSum[i]) >> 7;
  622. p_ADC1_Result_Filt[i] = ADC1_FltSum[i] >> 10;
  623. }
  624. for(i=0; i<ADC2_DATA_NUM; i++)
  625. {
  626. ADC2_FltSum[i] += ((ADC2_Result[i] << 10) - ADC2_FltSum[i]) >> 7;
  627. p_ADC2_Result_Filt[i] = ADC2_FltSum[i] >> 10;
  628. }
  629. PeriodTimeCnt = HAL_GetTick();
  630. }
  631. }
  632. //相电流有效值计算,有效值 = 最大值 * 0.707,运行频率15K
  633. void PhaseCurrent_CalRMSValue(ADC_3ShuntCurrent_Struct_t* ADC_3ShuntCurrent, ADC_3ShuntCurrent_Struct_t* PhaseCurrent_RMS)
  634. {
  635. static int16_t PhaseCurrentA_Max = 0;
  636. static int16_t PhaseCurrentB_Max = 0;
  637. static int16_t PhaseCurrentC_Max = 0;
  638. static int16_t Count = 0;
  639. int16_t DataTemp;
  640. static int32_t PhaseCurrentA_FltSum = 0;
  641. static int32_t PhaseCurrentB_FltSum = 0;
  642. static int32_t PhaseCurrentC_FltSum = 0;
  643. //计算A相电流峰值
  644. if(PhaseCurrentA_Max < ADC_3ShuntCurrent->uw_phase_a)
  645. {
  646. PhaseCurrentA_Max = ADC_3ShuntCurrent->uw_phase_a;
  647. }
  648. //计算B相电流峰值
  649. if(PhaseCurrentB_Max < ADC_3ShuntCurrent->uw_phase_b)
  650. {
  651. PhaseCurrentB_Max = ADC_3ShuntCurrent->uw_phase_b;
  652. }
  653. //计算C相电流峰值
  654. if(PhaseCurrentC_Max < ADC_3ShuntCurrent->uw_phase_c)
  655. {
  656. PhaseCurrentC_Max = ADC_3ShuntCurrent->uw_phase_c;
  657. }
  658. Count++;
  659. if(Count >= 500)
  660. {
  661. //计算A相电流有效值
  662. DataTemp = PhaseCurrentA_Max;
  663. PhaseCurrentA_Max = 0;
  664. PhaseCurrentA_FltSum += (((abs(DataTemp) * 724)) - PhaseCurrentA_FltSum) >> 5;
  665. PhaseCurrent_RMS->uw_phase_a = PhaseCurrentA_FltSum >> 10;
  666. //计算B相电流有效值
  667. DataTemp = PhaseCurrentB_Max;
  668. PhaseCurrentB_Max = 0;
  669. PhaseCurrentB_FltSum += (((abs(DataTemp) * 724)) - PhaseCurrentB_FltSum) >> 5;
  670. PhaseCurrent_RMS->uw_phase_b = PhaseCurrentB_FltSum >> 10;
  671. //计算C相电流有效值
  672. DataTemp = PhaseCurrentC_Max;
  673. PhaseCurrentC_Max = 0;
  674. PhaseCurrentC_FltSum += (((abs(DataTemp) * 724)) - PhaseCurrentC_FltSum) >> 5;
  675. PhaseCurrent_RMS->uw_phase_c = PhaseCurrentC_FltSum >> 10;
  676. Count = 0;
  677. }
  678. }
  679. //PA0切换AD,采集MOS管NTC
  680. void MOS_NTC_Init( void )
  681. {
  682. GPIO_InitTypeDef GPIO_InitStruct;
  683. ADC_ChannelConfTypeDef sConfig;
  684. GPIO_InitStruct.Pin = GPIO_PIN_0;
  685. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  686. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  687. __HAL_ADC_DISABLE(&hadc1);
  688. /**Configure Regular Channel MOS温度 */
  689. sConfig.Channel = ADC_CHANNEL_0;
  690. sConfig.Rank = ADC_REGULAR_RANK_10;
  691. sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  692. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  693. {
  694. _Error_Handler(__FILE__, __LINE__);
  695. }
  696. }
  697. void PowerDownProtection( uint16_t BusVoltage_AD )
  698. {
  699. static uint16_t poweroncount=0, powerdowncount=0;
  700. static TrueOrFalse_Flag_Struct_t poweronFlag = FALSE;
  701. if(poweronFlag == FALSE)
  702. {
  703. if( BusVoltage_AD > 1671 ) //1671对应的母线电压为30V
  704. {
  705. if( ++poweroncount > 30000 ) //电压大于30V并持续10s左右
  706. {
  707. poweroncount=0;
  708. poweronFlag = TRUE;
  709. }
  710. }
  711. else poweroncount=0;
  712. }
  713. else
  714. {
  715. if( BusVoltage_AD < 1504 ) //1504对应的母线电压为27V
  716. {
  717. if( ++powerdowncount > 60 ) //电压小于27V并连续60次,大约持续20ms左右
  718. {
  719. Disable_PwmGpio_Out();
  720. poweronFlag = FALSE;
  721. PowerDown_SaveFlag = TRUE;
  722. }
  723. }
  724. else
  725. {
  726. powerdowncount=0;
  727. }
  728. }
  729. }
  730. /* USER CODE END 1 */
  731. /**
  732. * @}
  733. */
  734. /**
  735. * @}
  736. */
  737. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/