| 1 | /** | 
|---|
| 2 |   ****************************************************************************** | 
|---|
| 3 |   * File Name          : ADC.c | 
|---|
| 4 |   * Description        : This file provides code for the configuration | 
|---|
| 5 |   *                      of the ADC instances. | 
|---|
| 6 |   ****************************************************************************** | 
|---|
| 7 |   * @attention | 
|---|
| 8 |   * | 
|---|
| 9 |   * <h2><center>© Copyright (c) 2019 STMicroelectronics. | 
|---|
| 10 |   * All rights reserved.</center></h2> | 
|---|
| 11 |   * | 
|---|
| 12 |   * This software component is licensed by ST under BSD 3-Clause license, | 
|---|
| 13 |   * the "License"; You may not use this file except in compliance with the | 
|---|
| 14 |   * License. You may obtain a copy of the License at: | 
|---|
| 15 |   *                        opensource.org/licenses/BSD-3-Clause | 
|---|
| 16 |   * | 
|---|
| 17 |   ****************************************************************************** | 
|---|
| 18 |   */ | 
|---|
| 19 |  | 
|---|
| 20 | /* Includes ------------------------------------------------------------------*/ | 
|---|
| 21 | #include "adc.h" | 
|---|
| 22 |  | 
|---|
| 23 | /* USER CODE BEGIN 0 */ | 
|---|
| 24 |  | 
|---|
| 25 | /* USER CODE END 0 */ | 
|---|
| 26 |  | 
|---|
| 27 | ADC_HandleTypeDef hadc1; | 
|---|
| 28 | DMA_HandleTypeDef hdma_adc1; | 
|---|
| 29 |  | 
|---|
| 30 | /* ADC1 init function */ | 
|---|
| 31 | void MX_ADC1_Init(void) | 
|---|
| 32 | { | 
|---|
| 33 |   ADC_ChannelConfTypeDef sConfig = {0}; | 
|---|
| 34 |  | 
|---|
| 35 |   /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)  | 
|---|
| 36 |   */ | 
|---|
| 37 |   hadc1.Instance = ADC1; | 
|---|
| 38 |   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; | 
|---|
| 39 |   hadc1.Init.Resolution = ADC_RESOLUTION_12B; | 
|---|
| 40 |   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; | 
|---|
| 41 |   hadc1.Init.ScanConvMode = ADC_SCAN_SEQ_FIXED; //More channnels | 
|---|
| 42 |   hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV; | 
|---|
| 43 |   hadc1.Init.LowPowerAutoWait = DISABLE; | 
|---|
| 44 |   hadc1.Init.LowPowerAutoPowerOff = DISABLE; | 
|---|
| 45 |   hadc1.Init.ContinuousConvMode = ENABLE; | 
|---|
| 46 |   hadc1.Init.NbrOfConversion = 1; | 
|---|
| 47 |   hadc1.Init.DiscontinuousConvMode = DISABLE; | 
|---|
| 48 |   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; | 
|---|
| 49 |   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; | 
|---|
| 50 |   hadc1.Init.DMAContinuousRequests = ENABLE; | 
|---|
| 51 |   hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; | 
|---|
| 52 |   hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_160CYCLES_5; //bei79,5 ist das gezappelt in der fast voltage eindeutig höher | 
|---|
| 53 |   hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_160CYCLES_5; | 
|---|
| 54 |   hadc1.Init.OversamplingMode = ENABLE; | 
|---|
| 55 |   hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_32; | 
|---|
| 56 |   hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_1; | 
|---|
| 57 |   hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER; | 
|---|
| 58 |   hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH; | 
|---|
| 59 |   if (HAL_ADC_Init(&hadc1) != HAL_OK) | 
|---|
| 60 |   { | 
|---|
| 61 |     Error_Handler(); | 
|---|
| 62 |   } | 
|---|
| 63 |   /** Configure Regular Channel  | 
|---|
| 64 |   */ | 
|---|
| 65 |   //Messung Common Mode Voltage (Shunt Spannung - gegen Batterie Minus) | 
|---|
| 66 |   sConfig.Channel = ADC_CHANNEL_0; | 
|---|
| 67 |   sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; | 
|---|
| 68 |   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1; | 
|---|
| 69 |   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) | 
|---|
| 70 |   { | 
|---|
| 71 |     Error_Handler(); | 
|---|
| 72 |   } | 
|---|
| 73 |     /** Configure Regular Channel  | 
|---|
| 74 |   */ | 
|---|
| 75 |   //Messung Batteriespannung Plus | 
|---|
| 76 |   sConfig.Channel = ADC_CHANNEL_1; | 
|---|
| 77 |   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) | 
|---|
| 78 |   { | 
|---|
| 79 |     Error_Handler(); | 
|---|
| 80 |   } | 
|---|
| 81 |     /** Configure Regular Channel  | 
|---|
| 82 |   */ | 
|---|
| 83 |   //Messung Neu : Vref | 
|---|
| 84 |   sConfig.Channel = ADC_CHANNEL_2; | 
|---|
| 85 |   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) | 
|---|
| 86 |   { | 
|---|
| 87 |     Error_Handler(); | 
|---|
| 88 |   } | 
|---|
| 89 |  | 
|---|
| 90 |   //Fast current Plus | 
|---|
| 91 |   sConfig.Channel = ADC_CHANNEL_3; | 
|---|
| 92 |   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) | 
|---|
| 93 |   { | 
|---|
| 94 |     Error_Handler(); | 
|---|
| 95 |   } | 
|---|
| 96 |  | 
|---|
| 97 |   //Fast current Minus | 
|---|
| 98 |   sConfig.Channel = ADC_CHANNEL_4; | 
|---|
| 99 |   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) | 
|---|
| 100 |   { | 
|---|
| 101 |     Error_Handler(); | 
|---|
| 102 |   } | 
|---|
| 103 |  | 
|---|
| 104 |  | 
|---|
| 105 |   sConfig.Channel = ADC_CHANNEL_TEMPSENSOR; | 
|---|
| 106 |   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) | 
|---|
| 107 |   { | 
|---|
| 108 |     Error_Handler(); | 
|---|
| 109 |   } | 
|---|
| 110 |  | 
|---|
| 111 |  | 
|---|
| 112 |  | 
|---|
| 113 |   /** Configure Regular Channel  | 
|---|
| 114 |   */ | 
|---|
| 115 |   //ovp sense | 
|---|
| 116 |   sConfig.Channel = ADC_CHANNEL_8; | 
|---|
| 117 |   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) | 
|---|
| 118 |   { | 
|---|
| 119 |     Error_Handler(); | 
|---|
| 120 |   } | 
|---|
| 121 |  | 
|---|
| 122 |   //lvp sense | 
|---|
| 123 |   sConfig.Channel = ADC_CHANNEL_9; | 
|---|
| 124 |   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) | 
|---|
| 125 |   { | 
|---|
| 126 |     Error_Handler(); | 
|---|
| 127 |   } | 
|---|
| 128 |  | 
|---|
| 129 |   //Temp Meas | 
|---|
| 130 |   sConfig.Channel = ADC_CHANNEL_10; | 
|---|
| 131 |   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) | 
|---|
| 132 |   { | 
|---|
| 133 |     Error_Handler(); | 
|---|
| 134 |   } | 
|---|
| 135 | } | 
|---|
| 136 |  | 
|---|
| 137 | void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) | 
|---|
| 138 | { | 
|---|
| 139 |  | 
|---|
| 140 |   GPIO_InitTypeDef GPIO_InitStruct = {0}; | 
|---|
| 141 |   if(adcHandle->Instance==ADC1) | 
|---|
| 142 |   { | 
|---|
| 143 |   /* USER CODE BEGIN ADC1_MspInit 0 */ | 
|---|
| 144 |  | 
|---|
| 145 |   /* USER CODE END ADC1_MspInit 0 */ | 
|---|
| 146 |     /* ADC1 clock enable */ | 
|---|
| 147 |     __HAL_RCC_ADC_CLK_ENABLE(); | 
|---|
| 148 |    | 
|---|
| 149 |     __HAL_RCC_GPIOA_CLK_ENABLE(); | 
|---|
| 150 |     __HAL_RCC_GPIOB_CLK_ENABLE(); | 
|---|
| 151 |     /**ADC1 GPIO Configuration     | 
|---|
| 152 |     PA0     ------> ADC1_IN0 | 
|---|
| 153 |     PB0     ------> ADC1_IN8  | 
|---|
| 154 |     */ | 
|---|
| 155 |     GPIO_InitStruct.Pin = AIN_U_SHUNT_Pin; | 
|---|
| 156 |     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | 
|---|
| 157 |     GPIO_InitStruct.Pull = GPIO_NOPULL; | 
|---|
| 158 |     HAL_GPIO_Init(AIN_U_SHUNT_GPIO_Port, &GPIO_InitStruct); | 
|---|
| 159 |  | 
|---|
| 160 |     GPIO_InitStruct.Pin = AIN_U_BATTERY_PLUS_Pin; | 
|---|
| 161 |     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | 
|---|
| 162 |     GPIO_InitStruct.Pull = GPIO_NOPULL; | 
|---|
| 163 |     HAL_GPIO_Init(AIN_U_BATTERY_PLUS_GPIO_Port, &GPIO_InitStruct); | 
|---|
| 164 |  | 
|---|
| 165 |     GPIO_InitStruct.Pin = AIN_U_BATTERY_MINUS_Pin; | 
|---|
| 166 |     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | 
|---|
| 167 |     GPIO_InitStruct.Pull = GPIO_NOPULL; | 
|---|
| 168 |     HAL_GPIO_Init(AIN_U_BATTERY_MINUS_GPIO_Port, &GPIO_InitStruct); | 
|---|
| 169 |  | 
|---|
| 170 |     GPIO_InitStruct.Pin = OVP_SENSE_MEAS_Pin; | 
|---|
| 171 |     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | 
|---|
| 172 |     GPIO_InitStruct.Pull = GPIO_NOPULL; | 
|---|
| 173 |     HAL_GPIO_Init(OVP_SENSE_MEAS_GPIO_Port, &GPIO_InitStruct); | 
|---|
| 174 |  | 
|---|
| 175 |     GPIO_InitStruct.Pin = LVP_SENSE_MEAS_Pin; | 
|---|
| 176 |     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | 
|---|
| 177 |     GPIO_InitStruct.Pull = GPIO_NOPULL; | 
|---|
| 178 |     HAL_GPIO_Init(LVP_SENSE_MEAS_GPIO_Port, &GPIO_InitStruct); | 
|---|
| 179 |  | 
|---|
| 180 |     GPIO_InitStruct.Pin = TEMP_SENSOR_Pin; | 
|---|
| 181 |     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | 
|---|
| 182 |     GPIO_InitStruct.Pull = GPIO_NOPULL; | 
|---|
| 183 |     HAL_GPIO_Init(TEMP_SENSOR_GPIO_Port, &GPIO_InitStruct); | 
|---|
| 184 |  | 
|---|
| 185 |  | 
|---|
| 186 |     GPIO_InitStruct.Pin = ADC_FAST_P_Pin; | 
|---|
| 187 |     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | 
|---|
| 188 |     GPIO_InitStruct.Pull = GPIO_NOPULL; | 
|---|
| 189 |     HAL_GPIO_Init(ADC_FAST_P_GPIO_Port, &GPIO_InitStruct); | 
|---|
| 190 |  | 
|---|
| 191 |         GPIO_InitStruct.Pin = ADC_FAST_N_Pin; | 
|---|
| 192 |     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; | 
|---|
| 193 |     GPIO_InitStruct.Pull = GPIO_NOPULL; | 
|---|
| 194 |     HAL_GPIO_Init(ADC_FAST_N_GPIO_Port, &GPIO_InitStruct); | 
|---|
| 195 |  | 
|---|
| 196 |  | 
|---|
| 197 |     /* ADC1 DMA Init */ | 
|---|
| 198 |     /* ADC1 Init */ | 
|---|
| 199 |     hdma_adc1.Instance = DMA1_Channel1; | 
|---|
| 200 |     hdma_adc1.Init.Request = DMA_REQUEST_ADC1; | 
|---|
| 201 |     hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY; | 
|---|
| 202 |     hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE; | 
|---|
| 203 |     hdma_adc1.Init.MemInc = DMA_MINC_ENABLE; | 
|---|
| 204 |     hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; | 
|---|
| 205 |     hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; | 
|---|
| 206 |     hdma_adc1.Init.Mode = DMA_CIRCULAR; | 
|---|
| 207 |     hdma_adc1.Init.Priority = DMA_PRIORITY_LOW; | 
|---|
| 208 |     if (HAL_DMA_Init(&hdma_adc1) != HAL_OK) | 
|---|
| 209 |     { | 
|---|
| 210 |       Error_Handler(); | 
|---|
| 211 |     } | 
|---|
| 212 |  | 
|---|
| 213 |     __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1); | 
|---|
| 214 |  | 
|---|
| 215 |   /* USER CODE BEGIN ADC1_MspInit 1 */ | 
|---|
| 216 |     HAL_NVIC_SetPriority(ADC1_IRQn, 0, 0); | 
|---|
| 217 |     HAL_NVIC_EnableIRQ(ADC1_IRQn); | 
|---|
| 218 |  | 
|---|
| 219 |   /* USER CODE END ADC1_MspInit 1 */ | 
|---|
| 220 |   } | 
|---|
| 221 | } | 
|---|
| 222 |  | 
|---|
| 223 | void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle) | 
|---|
| 224 | { | 
|---|
| 225 |  | 
|---|
| 226 |   if(adcHandle->Instance==ADC1) | 
|---|
| 227 |   { | 
|---|
| 228 |   /* USER CODE BEGIN ADC1_MspDeInit 0 */ | 
|---|
| 229 |  | 
|---|
| 230 |   /* USER CODE END ADC1_MspDeInit 0 */ | 
|---|
| 231 |     /* Peripheral clock disable */ | 
|---|
| 232 |     __HAL_RCC_ADC_CLK_DISABLE(); | 
|---|
| 233 |    | 
|---|
| 234 |     /**ADC1 GPIO Configuration     | 
|---|
| 235 |     PA0     ------> ADC1_IN0 | 
|---|
| 236 |     PB0     ------> ADC1_IN8  | 
|---|
| 237 |     */ | 
|---|
| 238 |     HAL_GPIO_DeInit(AIN_U_SHUNT_GPIO_Port, AIN_U_SHUNT_Pin); | 
|---|
| 239 |  | 
|---|
| 240 |     HAL_GPIO_DeInit(AIN_VREF_MEAS_GPIO_Port, AIN_VREF_MEAS_Pin); | 
|---|
| 241 |  | 
|---|
| 242 |     /* ADC1 DMA DeInit */ | 
|---|
| 243 |     HAL_DMA_DeInit(adcHandle->DMA_Handle); | 
|---|
| 244 |   /* USER CODE BEGIN ADC1_MspDeInit 1 */ | 
|---|
| 245 |  | 
|---|
| 246 |   /* USER CODE END ADC1_MspDeInit 1 */ | 
|---|
| 247 |   } | 
|---|
| 248 | }  | 
|---|
| 249 |  | 
|---|
| 250 | /* USER CODE BEGIN 1 */ | 
|---|
| 251 |  | 
|---|
| 252 | /* USER CODE END 1 */ | 
|---|
| 253 |  | 
|---|
| 254 | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | 
|---|