Forum: Mikrocontroller und Digitale Elektronik STM32F411 Disco ADC Wert passt nicht


von Chris H. (Gast)


Lesenswert?

Hallo Zusammen,

ich hab ein STM32F411 Disco Bord mit einem STM32F411VE drauf. Ich will 
in einem einfachen Programm den PB0 als AIN verwenden und den Wert 
anzeigen lassen. Zum Testen hab ich einmal VCC (3V) angelegt und GND. 
Beides funktioniert jedoch nicht, der Wert bleibt immer Konstant um die 
30 Dezimal.

Vref wurde auch schon geprüft, die 3V liegen an.

Vill. ist es nur ein kleiner Denkfehler oder eine Einstellung ist 
falsch, aber ich komme per se nicht zu einem Erfolg. Hab auch schon 
einige Beispiele im Netz verglichen, soweit scheint alles zu passen.

Hier das Minimalbeispiel:
1
#include "stm32f4xx.h"
2
#include "stm32f4xx_adc.h"
3
#include "stm32f4xx_gpio.h"
4
#include "stm32f4xx_rcc.h"
5
6
7
uint16_t ADCvalue = 0x00;
8
9
int main()
10
{
11
  SystemInit();
12
  
13
  /* RCC des GPIOB aktivieren */
14
  RCC_APB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
15
  
16
  /* ADC Kanäle Initialisieren */
17
  GPIO_InitTypeDef ADC1_ChannelsStruct;
18
  
19
  ADC1_ChannelsStruct.GPIO_Pin = GPIO_Pin_0;                  // GPIO Pin
20
  ADC1_ChannelsStruct.GPIO_Mode = GPIO_Mode_AIN;                // Analoger Eingang
21
  ADC1_ChannelsStruct.GPIO_Speed = GPIO_Speed_100MHz;              // Geschwindigkeit des Pins
22
  ADC1_ChannelsStruct.GPIO_OType = GPIO_OType_PP;                
23
  
24
  GPIO_Init(GPIOB, &ADC1_ChannelsStruct);
25
  
26
  /* RCC des ADC1 aktivieren */
27
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
28
29
  /* ADC1 auf Standardwerte setzen */
30
  ADC_DeInit();
31
  
32
  /* ADC1  Initialisieren */
33
  ADC_InitTypeDef ADC1_InitStruct;
34
  
35
  ADC1_InitStruct.ADC_Resolution = ADC_Resolution_12b;            // 12-Bit Auflösung
36
  ADC1_InitStruct.ADC_ScanConvMode = DISABLE;                  // Multichannel nutzen
37
  ADC1_InitStruct.ADC_ContinuousConvMode = DISABLE;              // kontinuierlich Konvertieren 
38
  ADC1_InitStruct.ADC_ExternalTrigConv = DISABLE;                // Kein externer Trigger
39
  ADC1_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
40
  ADC1_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;            // 12-Bit Rechts ausgerichtet
41
  ADC1_InitStruct.ADC_NbrOfConversion = 1;                  // 1 Kanal nutzen
42
  
43
  ADC_Init(ADC1, &ADC1_InitStruct);
44
    
45
  /* ADC Allgemein Initialisieren */
46
  ADC_CommonInitTypeDef ADC1_CommonStruct;
47
  
48
  ADC1_CommonStruct.ADC_Mode = ADC_Mode_Independent;              // Kanal unabhängig messen  
49
  ADC1_CommonStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;      // DMA deaktivieren
50
  ADC1_CommonStruct.ADC_Prescaler = ADC_Prescaler_Div2;            // Takt ist ADC SystemTakt / 2  
51
  ADC1_CommonStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;      // Wartet 5 Takte bis das Sampling beginnt
52
  
53
  ADC_CommonInit(&ADC1_CommonStruct);
54
  
55
  /* Konfiguriere das Abrufen von Kanal 8 */
56
  ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_144Cycles);
57
  
58
  
59
  /* Starte ADC1 */
60
  ADC_Cmd(ADC1, ENABLE);
61
  
62
  
63
  while (true)
64
  {
65
    /* Starte Umwandlungsprozess */
66
    ADC_SoftwareStartConv(ADC1);
67
  
68
    /* Warte bis der Prozess abschlossen wurde */
69
    while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
70
  
71
    /* Lösche End of Conversion-Flag */
72
    ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
73
  
74
    /* Rückgabe des Wertes */
75
    ADCvalue = ADC_GetConversionValue(ADC1);
76
    
77
78
  }
79
  
80
  
81
82
}

von Chris H. (Gast)


Lesenswert?

Fehler gefunden...
1
  /* RCC des GPIOB aktivieren */
2
  RCC_APB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

Manchmal sind es nur die Kleinigkeiten. Richtig wäre gewesen:

1
  /* RCC des GPIOB aktivieren */
2
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

von hp-freund (Gast)


Lesenswert?

Du lässt den ADC nicht automatisch laufen und auch nicht durch Software 
starten. Setze den:

ADC1_InitStruct.ADC_ExternalTrigConv = DISABLE;

von DISABLE zu ADC_SOFTWARE_START

von hp-freund (Gast)


Lesenswert?

Ok. dann lag ich wohl falsch.

von Chris H. (Gast)


Lesenswert?

hp-freund schrieb:
> Du lässt den ADC nicht automatisch laufen und auch nicht durch Software
> starten. Setze den:
>
> ADC1_InitStruct.ADC_ExternalTrigConv = DISABLE;
>
> von DISABLE zu ADC_SOFTWARE_START

Die Std Standard Lib hat leider kein ADC_SOFTWARE_START mit drin.

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.