adc.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  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. uint16_t ADC1_Result[ADC1_DATA_NUM] = {0};
  52. uint16_t ADC1_Result_Filt[ADC1_DATA_NUM] = {0};
  53. uint16_t ADC2_Result[ADC2_DATA_NUM] = {0};
  54. uint16_t ADC2_Result_Filt[ADC2_DATA_NUM]= {0};
  55. FlagStatus ADC2_ConvCpmplete_Flag = RESET;
  56. ADC_SensorData_Struct_t ADC_SensorData = {0, 0};//力矩传感器和指拨传感器
  57. ADC_3ShuntCurrent_OffSet_Struct_t ADC_3ShuntCurrent_OffSet = {32768, 32768, 32768};//三相电流零点
  58. ADC_3ShuntCurrent_Struct_t ADC_3ShuntCurrent = {0};
  59. ADC_3ShuntCurrent_Struct_t ADC_3ShuntCurrent_RMSValue = {0};
  60. uint16_t uw_current_offset = 2048;//母线电流零点
  61. /* USER CODE END 0 */
  62. ADC_HandleTypeDef hadc1;
  63. ADC_HandleTypeDef hadc2;
  64. DMA_HandleTypeDef hdma_adc1;
  65. /* ADC1 init function */
  66. void MX_ADC1_Init(void)
  67. {
  68. ADC_ChannelConfTypeDef sConfig;
  69. /**Common config
  70. */
  71. hadc1.Instance = ADC1;
  72. hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  73. hadc1.Init.ContinuousConvMode = DISABLE;
  74. hadc1.Init.DiscontinuousConvMode = DISABLE;
  75. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  76. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  77. hadc1.Init.NbrOfConversion = 9;
  78. if (HAL_ADC_Init(&hadc1) != HAL_OK)
  79. {
  80. _Error_Handler(__FILE__, __LINE__);
  81. }
  82. /**Configure Regular Channel PCB温度
  83. */
  84. sConfig.Channel = ADC_CHANNEL_10;
  85. sConfig.Rank = ADC_REGULAR_RANK_1;
  86. sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  87. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  88. {
  89. _Error_Handler(__FILE__, __LINE__);
  90. }
  91. /**Configure Regular Channel 母线电压
  92. */
  93. sConfig.Channel = ADC_CHANNEL_11;
  94. sConfig.Rank = ADC_REGULAR_RANK_2;
  95. sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  96. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  97. {
  98. _Error_Handler(__FILE__, __LINE__);
  99. }
  100. /**Configure Regular Channel 绕组温度
  101. */
  102. sConfig.Channel = ADC_CHANNEL_12;
  103. sConfig.Rank = ADC_REGULAR_RANK_3;
  104. sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  105. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  106. {
  107. _Error_Handler(__FILE__, __LINE__);
  108. }
  109. /**Configure Regular Channel 母线电流
  110. */
  111. sConfig.Channel = ADC_CHANNEL_13;
  112. sConfig.Rank = ADC_REGULAR_RANK_4;
  113. sConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
  114. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  115. {
  116. _Error_Handler(__FILE__, __LINE__);
  117. }
  118. /**Configure Regular Channel 力矩传感器
  119. */
  120. sConfig.Channel = ADC_CHANNEL_5;
  121. sConfig.Rank = ADC_REGULAR_RANK_5;
  122. sConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
  123. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  124. {
  125. _Error_Handler(__FILE__, __LINE__);
  126. }
  127. /**Configure Regular Channel TE工作电压
  128. */
  129. sConfig.Channel = ADC_CHANNEL_7;
  130. sConfig.Rank = ADC_REGULAR_RANK_6;
  131. sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  132. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  133. {
  134. _Error_Handler(__FILE__, __LINE__);
  135. }
  136. /**Configure Regular Channel 指拨输入
  137. */
  138. sConfig.Channel = ADC_CHANNEL_14;
  139. sConfig.Rank = ADC_REGULAR_RANK_7;
  140. sConfig.SamplingTime = ADC_SAMPLETIME_7CYCLES_5;
  141. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  142. {
  143. _Error_Handler(__FILE__, __LINE__);
  144. }
  145. /**Configure Regular Channel MCU温度
  146. */
  147. sConfig.Channel = ADC_CHANNEL_TEMPSENSOR;
  148. sConfig.Rank = ADC_REGULAR_RANK_8;
  149. sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5;
  150. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  151. {
  152. _Error_Handler(__FILE__, __LINE__);
  153. }
  154. /**Configure Regular Channel Vref
  155. */
  156. sConfig.Channel = ADC_CHANNEL_VREFINT;
  157. sConfig.Rank = ADC_REGULAR_RANK_9;
  158. sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
  159. if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  160. {
  161. _Error_Handler(__FILE__, __LINE__);
  162. }
  163. }
  164. /* ADC2 init function */
  165. void MX_ADC2_Init(void)
  166. {
  167. ADC_InjectionConfTypeDef sConfigInjected;
  168. /**Common config
  169. */
  170. hadc2.Instance = ADC2;
  171. hadc2.Init.ScanConvMode = ADC_SCAN_ENABLE;
  172. hadc2.Init.ContinuousConvMode = DISABLE;
  173. hadc2.Init.DiscontinuousConvMode = DISABLE;
  174. hadc2.Init.ExternalTrigConv = ADC_EXTERNALTRIGINJECCONV_EDGE_NONE;
  175. hadc2.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  176. hadc2.Init.NbrOfConversion = 1;
  177. if (HAL_ADC_Init(&hadc2) != HAL_OK)
  178. {
  179. _Error_Handler(__FILE__, __LINE__);
  180. }
  181. /**Configure Injected Channel
  182. */
  183. sConfigInjected.InjectedChannel = ADC_CHANNEL_0;
  184. sConfigInjected.InjectedRank = ADC_INJECTED_RANK_1;
  185. sConfigInjected.InjectedNbrOfConversion = 3;
  186. sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_1CYCLE_5;
  187. sConfigInjected.ExternalTrigInjecConv = ADC_EXTERNALTRIGINJECCONV_T1_CC4;
  188. sConfigInjected.AutoInjectedConv = DISABLE;
  189. sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
  190. sConfigInjected.InjectedOffset = 0;
  191. if (HAL_ADCEx_InjectedConfigChannel(&hadc2, &sConfigInjected) != HAL_OK)
  192. {
  193. _Error_Handler(__FILE__, __LINE__);
  194. }
  195. /**Configure Injected Channel
  196. */
  197. sConfigInjected.InjectedChannel = ADC_CHANNEL_1;
  198. sConfigInjected.InjectedRank = ADC_INJECTED_RANK_2;
  199. if (HAL_ADCEx_InjectedConfigChannel(&hadc2, &sConfigInjected) != HAL_OK)
  200. {
  201. _Error_Handler(__FILE__, __LINE__);
  202. }
  203. /**Configure Injected Channel
  204. */
  205. sConfigInjected.InjectedChannel = ADC_CHANNEL_2;
  206. sConfigInjected.InjectedRank = ADC_INJECTED_RANK_3;
  207. if (HAL_ADCEx_InjectedConfigChannel(&hadc2, &sConfigInjected) != HAL_OK)
  208. {
  209. _Error_Handler(__FILE__, __LINE__);
  210. }
  211. }
  212. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
  213. {
  214. GPIO_InitTypeDef GPIO_InitStruct;
  215. if(adcHandle->Instance==ADC1)
  216. {
  217. /* USER CODE BEGIN ADC1_MspInit 0 */
  218. /* USER CODE END ADC1_MspInit 0 */
  219. /* ADC1 clock enable */
  220. __HAL_RCC_ADC1_CLK_ENABLE();
  221. /**ADC1 GPIO Configuration
  222. PC0 ------> ADC1_IN10
  223. PC1 ------> ADC1_IN11
  224. PC2 ------> ADC1_IN12
  225. PC3 ------> ADC1_IN13
  226. PA5 ------> ADC1_IN5
  227. PA7 ------> ADC1_IN7
  228. PC4 ------> ADC1_IN14
  229. */
  230. GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
  231. |GPIO_PIN_4;
  232. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  233. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  234. GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_7;
  235. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  236. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  237. /* ADC1 DMA Init */
  238. /* ADC1 Init */
  239. hdma_adc1.Instance = DMA1_Channel1;
  240. hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
  241. hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
  242. hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
  243. hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  244. hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  245. hdma_adc1.Init.Mode = DMA_CIRCULAR;
  246. hdma_adc1.Init.Priority = DMA_PRIORITY_LOW;
  247. if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
  248. {
  249. _Error_Handler(__FILE__, __LINE__);
  250. }
  251. __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
  252. /* USER CODE BEGIN ADC1_MspInit 1 */
  253. /* USER CODE END ADC1_MspInit 1 */
  254. }
  255. else if(adcHandle->Instance==ADC2)
  256. {
  257. /* USER CODE BEGIN ADC2_MspInit 0 */
  258. /* USER CODE END ADC2_MspInit 0 */
  259. /* ADC2 clock enable */
  260. __HAL_RCC_ADC2_CLK_ENABLE();
  261. /**ADC2 GPIO Configuration
  262. PA0-WKUP ------> ADC2_IN0
  263. PA1 ------> ADC2_IN1
  264. PA2 ------> ADC2_IN2
  265. */
  266. GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;
  267. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  268. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  269. /* ADC2 interrupt Init */
  270. HAL_NVIC_SetPriority(ADC1_2_IRQn, 1, 1);
  271. HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
  272. /* USER CODE BEGIN ADC2_MspInit 1 */
  273. /* USER CODE END ADC2_MspInit 1 */
  274. }
  275. }
  276. void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
  277. {
  278. if(adcHandle->Instance==ADC1)
  279. {
  280. /* USER CODE BEGIN ADC1_MspDeInit 0 */
  281. /* USER CODE END ADC1_MspDeInit 0 */
  282. /* Peripheral clock disable */
  283. __HAL_RCC_ADC1_CLK_DISABLE();
  284. /**ADC1 GPIO Configuration
  285. PC0 ------> ADC1_IN10
  286. PC1 ------> ADC1_IN11
  287. PC2 ------> ADC1_IN12
  288. PC3 ------> ADC1_IN13
  289. PA5 ------> ADC1_IN5
  290. PA7 ------> ADC1_IN7
  291. PC4 ------> ADC1_IN14
  292. */
  293. HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
  294. |GPIO_PIN_4);
  295. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_7);
  296. /* ADC1 DMA DeInit */
  297. HAL_DMA_DeInit(adcHandle->DMA_Handle);
  298. /* USER CODE BEGIN ADC1_MspDeInit 1 */
  299. /* USER CODE END ADC1_MspDeInit 1 */
  300. }
  301. else if(adcHandle->Instance==ADC2)
  302. {
  303. /* USER CODE BEGIN ADC2_MspDeInit 0 */
  304. /* USER CODE END ADC2_MspDeInit 0 */
  305. /* Peripheral clock disable */
  306. __HAL_RCC_ADC2_CLK_DISABLE();
  307. /**ADC2 GPIO Configuration
  308. PA0-WKUP ------> ADC2_IN0
  309. PA1 ------> ADC2_IN1
  310. PA2 ------> ADC2_IN2
  311. */
  312. HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2);
  313. /* USER CODE BEGIN ADC2_MspDeInit 1 */
  314. /* USER CODE END ADC2_MspDeInit 1 */
  315. }
  316. }
  317. /* USER CODE BEGIN 1 */
  318. void ADC_Start(void)
  319. {
  320. HAL_ADCEx_Calibration_Start(&hadc1);
  321. HAL_ADCEx_Calibration_Start(&hadc2);
  322. HAL_ADC_Start(&hadc1);
  323. HAL_ADC_Start(&hadc2);
  324. HAL_ADCEx_InjectedStart_IT(&hadc2);
  325. HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result, ADC1_DATA_NUM);
  326. __HAL_DMA_DISABLE_IT(hadc1.DMA_Handle, DMA_IT_HT);
  327. HAL_TIM_Base_Start_IT(&PWM_TIMER);
  328. HAL_TIM_PWM_Start(&PWM_TIMER, TIM_CHANNEL_4);
  329. HAL_TIMEx_PWMN_Start(&PWM_TIMER, TIM_CHANNEL_4);
  330. }
  331. //更新三相电流采样值
  332. void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef* hadc)
  333. {
  334. //更新3相电流采样值
  335. ADC2_Result[ADC2_RANK_CURRENT_A] = HAL_ADCEx_InjectedGetValue(hadc,1) << 4;
  336. #if 1 //正常运行
  337. ADC2_Result[ADC2_RANK_CURRENT_B] = HAL_ADCEx_InjectedGetValue(hadc,2) << 4;
  338. #elif 1//模拟A、B相电流采样短路
  339. ADC2_Result[ADC2_RANK_CURRENT_B] = HAL_ADCEx_InjectedGetValue(hadc,1) << 4;
  340. #endif
  341. ADC2_Result[ADC2_RANK_CURRENT_C] = HAL_ADCEx_InjectedGetValue(hadc,3) << 4;
  342. //计算三相电流
  343. ADC_3ShuntCurrent.uw_phase_a = (int16_t)(ADC_3ShuntCurrent_OffSet.uw_phase_a_offset - ADC2_Result[ADC2_RANK_CURRENT_A]);
  344. #if 0 //模拟A相电流值比真实值大一倍
  345. ADC_3ShuntCurrent.uw_phase_a *= 2;
  346. #endif
  347. ADC_3ShuntCurrent.uw_phase_b = (int16_t)(ADC_3ShuntCurrent_OffSet.uw_phase_b_offset - ADC2_Result[ADC2_RANK_CURRENT_B]);
  348. ADC_3ShuntCurrent.uw_phase_c = (int16_t)(ADC_3ShuntCurrent_OffSet.uw_phase_c_offset - ADC2_Result[ADC2_RANK_CURRENT_C]);
  349. ///计算三相电流有效值
  350. PhaseCurrent_CalRMSValue(ADC2_Result, &ADC_3ShuntCurrent_RMSValue);
  351. ADC2_ConvCpmplete_Flag = SET;
  352. }
  353. //更新ADC采样结果
  354. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
  355. {
  356. #if 1
  357. static uint32_t PeriodTestCnt = 0;
  358. PeriodTestCnt++;
  359. if(PeriodTestCnt > 300)
  360. {
  361. PeriodTestCnt = 0;
  362. }
  363. #endif
  364. int32_t Temp_32;
  365. static int32_t IdcFltSum = 0;
  366. static uint32_t T_Roil_Sum = 0;
  367. static uint16_t T_Roil_FiltCnt = 0;
  368. static uint32_t T_PCB_Sum = 0;
  369. static uint16_t T_PCB_FiltCnt = 0;
  370. //更新PCB温度
  371. T_PCB_Sum += ADC1_Result[ADC1_RANK_NTC_PCB];
  372. T_PCB_FiltCnt++;
  373. if(T_PCB_FiltCnt >= 2048)
  374. {
  375. MC_RunInfo.T_PCB = GetNTCTempera(T_PCB_Sum >> 11);
  376. T_PCB_Sum = 0;
  377. T_PCB_FiltCnt = 0;
  378. }
  379. //更新母线电压
  380. MC_RunInfo.BusVoltage = (uint32_t)ADC1_Result[ADC1_RANK_VIN] * 18507 >> 10;//3300 * 1256 / (4095 * 56)
  381. //更新绕组温度
  382. #if 1 //正常运行
  383. T_Roil_Sum += ADC1_Result[ADC1_RANK_NTC_ROIL];
  384. #elif 1 //模拟固定值
  385. T_Roil_Sum += 2000;
  386. #endif
  387. T_Roil_FiltCnt++;
  388. if(T_Roil_FiltCnt >= 2048)
  389. {
  390. MC_RunInfo.T_Roil = GetNTCTempera(T_Roil_Sum >> 11);
  391. T_Roil_Sum = 0;
  392. T_Roil_FiltCnt = 0;
  393. }
  394. //更新母线电流
  395. Temp_32 = (ADC1_Result[ADC1_RANK_CURRENT] - uw_current_offset) * 50000 >> 11;
  396. Temp_32 = (Temp_32 <= 0) ? 0 : Temp_32;
  397. IdcFltSum += ((Temp_32 << 10) - IdcFltSum) >> 8;
  398. MC_RunInfo.BusCurrent = IdcFltSum >> 10;
  399. //更新力矩传感器
  400. Temp_32 = (ADC1_Result[ADC1_RANK_TORQUE_SENSOR] - TorqueOffSetData.PresentData) * 100 / MC_TorqueCorrectParam.K;
  401. Temp_32 = ((Temp_32 <= 0) ? 0 : Temp_32);
  402. #if 1 //采用原始采集值
  403. ADC_SensorData.TorqueSensor = Temp_32;
  404. #else //采用滤波值
  405. static int32_t TorqueFltSum = 0;
  406. TorqueFltSum += ((Temp_32 << 10) - TorqueFltSum) >> 8;
  407. ADC_SensorData.TorqueSensor = TorqueFltSum >> 10;
  408. #endif
  409. //更新TE工作电压
  410. MC_TE_SensorStatus.MCU_Voltage = (uint32_t)ADC1_Result[ADC1_RANK_3V3_TE] * 2 * 3300 >> 12;//3300 * 2 / 4095
  411. //更新指拨
  412. Temp_32 = ADC1_Result[ADC1_RANK_GAS] - GasSensor_OffSet;
  413. ADC_SensorData.GasSensor = (Temp_32 <= 0) ? 0 : Temp_32;
  414. //更新MCU温度
  415. Temp_32 = 3300 * ADC1_Result[ADC1_RANK_TP_MCU] >> 12;
  416. Temp_32 = (int32_t)1430 - Temp_32;
  417. MC_RunInfo.T_MCU = (uint8_t)((Temp_32 * 238 >> 10) + 25 + 40);
  418. //更新Vref
  419. }
  420. //ADC1和ADC2数据滑动滤波
  421. void ADC_SensorData_Filt(uint16_t* p_ADC1_Result_Filt, uint16_t* p_ADC2_Result_Filt)
  422. {
  423. static uint32_t PeriodTimeCnt = 0;
  424. static int32_t ADC1_FltSum[ADC1_DATA_NUM] = {0};
  425. static int32_t ADC2_FltSum[ADC2_DATA_NUM] = {0};
  426. uint8_t i;
  427. if((HAL_GetTick() - PeriodTimeCnt) >= 2)
  428. {
  429. for(i=0; i<ADC1_DATA_NUM; i++)
  430. {
  431. ADC1_FltSum[i] += ((ADC1_Result[i] << 10) - ADC1_FltSum[i]) >> 8;
  432. p_ADC1_Result_Filt[i] = ADC1_FltSum[i] >> 10;
  433. }
  434. for(i=0; i<ADC2_DATA_NUM; i++)
  435. {
  436. ADC2_FltSum[i] += ((ADC2_Result[i] << 10) - ADC2_FltSum[i]) >> 8;
  437. p_ADC2_Result_Filt[i] = ADC2_FltSum[i] >> 10;
  438. }
  439. PeriodTimeCnt = HAL_GetTick();
  440. }
  441. }
  442. //相电流有效值计算,有效值 = 最大值 * 0.707,运行频率15K
  443. void PhaseCurrent_CalRMSValue(uint16_t* ADC2_Result, ADC_3ShuntCurrent_Struct_t* PhaseCurrent_RMS)
  444. {
  445. static uint16_t PhaseCurrentA_Max = 0;
  446. static uint16_t PhaseCurrentB_Max = 0;
  447. static uint16_t PhaseCurrentC_Max = 0;
  448. static uint16_t Count = 0;
  449. int16_t DataTemp;
  450. //计算A相电流峰值
  451. if(PhaseCurrentA_Max < ADC2_Result[ADC2_RANK_CURRENT_A])
  452. {
  453. PhaseCurrentA_Max = ADC2_Result[ADC2_RANK_CURRENT_A];
  454. }
  455. //计算B相电流峰值
  456. if(PhaseCurrentB_Max < ADC2_Result[ADC2_RANK_CURRENT_B])
  457. {
  458. PhaseCurrentB_Max = ADC2_Result[ADC2_RANK_CURRENT_B];
  459. }
  460. //计算C相电流峰值
  461. if(PhaseCurrentC_Max < ADC2_Result[ADC2_RANK_CURRENT_C])
  462. {
  463. PhaseCurrentC_Max = ADC2_Result[ADC2_RANK_CURRENT_C];
  464. }
  465. Count++;
  466. if(Count >= 500)
  467. {
  468. DataTemp = PhaseCurrentA_Max - ADC_3ShuntCurrent_OffSet.uw_phase_a_offset;
  469. PhaseCurrentA_Max = 0;
  470. PhaseCurrent_RMS->uw_phase_a = (abs(DataTemp) * 724) >> 10;
  471. DataTemp = PhaseCurrentB_Max - ADC_3ShuntCurrent_OffSet.uw_phase_b_offset;
  472. PhaseCurrentB_Max = 0;
  473. PhaseCurrent_RMS->uw_phase_b = (abs(DataTemp) * 724) >> 10;
  474. DataTemp = PhaseCurrentC_Max - ADC_3ShuntCurrent_OffSet.uw_phase_c_offset;
  475. PhaseCurrentC_Max = 0;
  476. PhaseCurrent_RMS->uw_phase_c = (abs(DataTemp) * 724) >> 10;
  477. Count = 0;
  478. }
  479. }
  480. /* USER CODE END 1 */
  481. /**
  482. * @}
  483. */
  484. /**
  485. * @}
  486. */
  487. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/