Forum: Mikrocontroller und Digitale Elektronik STM32F4 Discovery ADC schwankt stark


von Steffen H. (stef_fen)


Lesenswert?

Hallo Zusammen,

ich möchte gerne den ADC des STM32F4 Discovery Board nutzen. Dies 
funktioniert soweit auch nur schwanken die Werte um ca. 400. Ich habe 
ein 10k Poti was an 3V und GND angeschlossen ist, zwischen 
Mittelabnehmer und GND ist noch ein 100nF Keramik Kondensator. Was kann 
ich dagegen machen?

Vielen Dank.

1
void ADC_init(void)
2
{
3
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
4
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
5
6
  //GPIO initialisieren
7
  GPIO_InitTypeDef  GPIO_InitStructure;
8
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
9
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
10
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
11
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
12
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
13
  GPIO_Init(GPIOA, &GPIO_InitStructure);
14
15
  //erweiterte ADC Funktionen
16
  ADC_CommonInitTypeDef ADC_CommonInitStruct;
17
  ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent;
18
  ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div4;
19
  ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
20
  ADC_CommonInitStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
21
  ADC_CommonInit(&ADC_CommonInitStruct);
22
23
  //als ADC initialisieren
24
  ADC_InitTypeDef ADC_InitStruct;
25
  ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
26
  ADC_InitStruct.ADC_ScanConvMode = DISABLE;
27
  ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
28
  ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
29
  ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
30
  ADC_InitStruct.ADC_NbrOfConversion = 1;
31
  ADC_Init(ADC1, &ADC_InitStruct);
32
33
  ADC_Cmd(ADC3, ENABLE);
34
}
35
36
uint16_t ADC_Read(uint8_t kanal)
37
{
38
  uint16_t messwert = 0;
39
40
  ADC_RegularChannelConfig(ADC3, kanal, 1, ADC_SampleTime_480Cycles);
41
  ADC_SoftwareStartConv(ADC3);
42
    while(ADC_GetFlagStatus(ADC3, ADC_FLAG_EOC)==RESET);
43
    messwert = ADC_GetConversionValue(ADC3);
44
45
    return(messwert);
46
}

In der main steht dann: "status1 = ADC_Read(Kanal_A)" wobei Kanal_A ein 
"#define Kanal_A ADC_Channel_1" ist. Diesen Wert gebe ich mir dann auf 
einem Display aus.

: Bearbeitet durch User
von Pete K. (pete77)


Lesenswert?

Was passiert, wenn Du den Kondensator weglässt?

von public (Gast)


Lesenswert?

Hallo Steffen,

10k geteilt und 100nF hört sich nach ner Menge Holz für den kleinen Kerl 
an.

Mein Glaskugel sagt:

Probiere mal den 100nF auszulöten, oder/und nimm ein niederohmigeres 
Poti...
Vermutung: Quelle ist zu hochohmig.

Beste Grüße
public

von Steffen H. (stef_fen)


Lesenswert?

Wenn ich den Kondensator weg lasse passiert das gleiche. Der Wert 
schwankt ziemlich stark.

von Steffen H. (stef_fen)


Lesenswert?

Jetzt wollte ich zum Test die Auflösung ändern von 12Bit auf 10Bit aber 
die Zahl geht immer noch bis 4095.

von Irgendwer (Gast)


Lesenswert?

Schau dir mal die App-Node AN4073 von ST dazu an:
http://www.st.com/web/en/resource/technical/document/application_note/DM00050879.pdf
Dürfte auch bei dir das beste sein mehrere Messungen durchzuführen und 
den Wert dann zu mitteln.

von Tobias V. (tobias_v)


Lesenswert?

An der Impedanz sollte es bei den verwendeten langsamen Abtastraten 
nicht liegen. Du initialisierst jedoch (versehentlich?) nur ADC1, 
verwendest aber sonst ADC3. Benutze doch nur ADC1, also einfach per 
"Suchen&Ersetzen" ADC3 zu ADC1 umwandeln.

Das Initialisieren der Structures ist ebenfalls zu empfehlen (wird in 
vielen Beispielen nicht gemacht):
1
ADC_CommonStructInit(&ADC_CommonInitStructure);
2
ADC_StructInit(&ADC_InitStructure);

Zur Qualität der STM32F4 ADCs: Beim obigen Anwendungsfall werden diese 
noch gar nicht wirklich "gefordert". Bei meiner Anwendung wird mit bis 
zu 6x 1,4MSps bzw. 1x 8,5MSps bei 12bit abgetastet (leicht übertaktet). 
Ich kann zwar keine quantitative/belastbare Aussage treffen, aber die 
Ergebnisse sehen immer noch sehr gut aus. Evtl. muss man den 
Flash-Prefetch deaktivieren, da dieser Störungen verursacht, oder man 
setzt auf die F429/F439-Serie, wo dieser Bug behoben wurde.

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.