source: trunk/firmware/Src/adc.c @ 26

Last change on this file since 26 was 26, checked in by f.jahn, 7 weeks ago
  • Bug in ADC Kalibrierung (STM32 ADC Strom) behoben
  • DMA Buffer für ADC 1 und ADC wird vor Überschreibung während bearbeitung geschützt, indem Datenübertragung nur einmalig erfolgt und erst nach Auswertung wieder gestartet wird
  • RS485Modbus: Timeout Zeit wird für Baudraten >19200 korrekt berechnet
  • Hardware ID geändert
  • Separates Register für "Batterie Empty detection mode" auf Adresse 92 angelegt
File size: 7.6 KB
Line 
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>&copy; 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
27ADC_HandleTypeDef hadc1;
28DMA_HandleTypeDef hdma_adc1;
29
30/* ADC1 init function */
31void 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
137void 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
223void 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****/
Note: See TracBrowser for help on using the repository browser.