Hallo Community,
ich habe das Problem, dass mein STM32L432KCU6 einen Wert am ADC1_IN16
nur einmalig ausliest. Es ist nicht der erste ADC, den ich bei einem
STM32 in Betrieb nehme, aber der erste ADC beim STM32L432.
Die bisherigen ADCs habe ich im CHANNEL_0 in Betrieb genommen und da gab
es bisher keine Probleme.
Diesen ADC möchte ich gern im CHANNEL_16 in Betrieb nehmen, da mein
Pinning nichts Anderes zu lässt. Da ich nur den Spannungswert bezogen
auf Masse messen will, habe ich den ADC auf Single-Diff eingestellt.
Hier meine Init:
1 | static void MX_ADC1_Init(void)
|
2 | {
|
3 |
|
4 | /* USER CODE BEGIN ADC1_Init 0 */
|
5 |
|
6 | /* USER CODE END ADC1_Init 0 */
|
7 |
|
8 | ADC_ChannelConfTypeDef sConfig = {0};
|
9 |
|
10 | /* USER CODE BEGIN ADC1_Init 1 */
|
11 |
|
12 | /* USER CODE END ADC1_Init 1 */
|
13 | /**Common config
|
14 | */
|
15 | hadc1.Instance = ADC1;
|
16 | hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
|
17 | hadc1.Init.Resolution = ADC_RESOLUTION_12B;
|
18 | hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
|
19 | hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
|
20 | hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
|
21 | hadc1.Init.LowPowerAutoWait = DISABLE;
|
22 | hadc1.Init.ContinuousConvMode = ENABLE;
|
23 | hadc1.Init.NbrOfConversion = 1;
|
24 | hadc1.Init.DiscontinuousConvMode = DISABLE;
|
25 | hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
|
26 | hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
|
27 | hadc1.Init.DMAContinuousRequests = DISABLE;
|
28 | hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
|
29 | hadc1.Init.OversamplingMode = DISABLE;
|
30 | if (HAL_ADC_Init(&hadc1) != HAL_OK)
|
31 | {
|
32 | Error_Handler();
|
33 | }
|
34 | /**Configure Regular Channel
|
35 | */
|
36 | sConfig.Channel = ADC_CHANNEL_16;
|
37 | sConfig.Rank = ADC_REGULAR_RANK_1;
|
38 | sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
|
39 | sConfig.SingleDiff = ADC_SINGLE_ENDED;
|
40 | sConfig.OffsetNumber = ADC_OFFSET_NONE;
|
41 | sConfig.Offset = 0;
|
42 | if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
|
43 | {
|
44 | Error_Handler();
|
45 | }
|
46 | /* USER CODE BEGIN ADC1_Init 2 */
|
47 |
|
48 | /* USER CODE END ADC1_Init 2 */
|
49 |
|
50 | }
|
Der ADC wird über
gestartet und dann einfach über die while-Schleife ausgelesen.
Das Problem ist jedoch, dass ich nur einmalig einen Wert der aktuellen
Spannung bekomme. Wenn ich die Spannung am ADC ändere ändert sich der
ADC-Wert nicht.
Auch ein Ansprechen über Timer funktioniert nicht.
Den Parameter
1 | hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
|
habe ich auch schon auf
geändert, so wie ich es in anderen Beträgen gelesen habe.
Ebenfalls das Ändern des Parameters
1 | hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
|
führt zum gleichen Fehlerbild.
Was läuft hier falsch?
Ich bitte um eure Hilfe!