Forum: Mikrocontroller und Digitale Elektronik ADC1_IN16 STM32L432 wandelt nur einmalig


von Sheriff Silver (Gast)


Lesenswert?

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
1
HAL_ADC_Start(&hadc1);
 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
1
ADC_EOC_SEQ_CONV
 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!

von Sheriff Silver (Gast)


Lesenswert?

Nachtrag:
Auch beim Verwenden eines anderen Kanals habe ich das gleiche Problem.

von pegel (Gast)


Lesenswert?

Sheriff Silver schrieb:
> Auch ein Ansprechen über Timer funktioniert nicht.

Was genau meinst du damit?

Mit der Einstellung ADC_SOFTWARE_START musst du vor dem Auslesen jedes 
mal ein

HAL_ADC_Start(&hadc1);

ausführen. Willst du einen Timer benutzen musst du das an Stelle von 
ADC_SOFTWARE_START eintragen.

EOCSelection bedeutet nur ein automatisches durchschalten durch die 
Kanäle.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.