Forum: Mikrocontroller und Digitale Elektronik STM32F4 Analogeingänge nicht unabhängig


von Patrick S. (schero)


Lesenswert?

Hallo Wissende Forengemeinde!

Ich bin neu hier im Forum und ebenfalls fast neu in der Mikrocontroller 
Programmierung.
Leider habe ich aber nun eine Aufgabe aufs Auge gedrückt bekommen und 
beiße mich langsam durch die Inbetriebnahme des STM32F4Discovery durch.
Ein Problem bereitet mir allerdings der AD Wandler.
Ich möchte von zwei Eingängen die Temperatur einlesen und habe dafür 
zwei AD590 angeschlossen. Spannungswerte erhalte ich und kann diese in 
Temperaturen umrechnen. Wenn ich nun einen der Temperatursensoren mit 
z.B. Kältespray besprühe, ändern sich aber die Werte von beiden 
Analogkanälen.

Vielleicht hat jemand einen Tipp für mich?

hier ist mein Initialisierungscode des AD Wandlers:
1
static void Init_ADC1()
2
{
3
  GPIO_InitTypeDef GPIO_InitStructure;
4
  ADC_InitTypeDef ADC_InitStructure;
5
  ADC_CommonInitTypeDef ADC_CommonInitStructure;
6
  
7
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
8
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
9
  
10
  
11
  /* Configure ADC1 Channel1 Channel2 Channel3 pin as analog input ******************************/
12
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
13
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
14
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
15
  GPIO_Init(GPIOA, &GPIO_InitStructure);
16
  
17
  
18
  /* ADC Common Init **********************************************************/
19
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
20
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
21
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
22
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
23
  ADC_CommonInit(&ADC_CommonInitStructure);
24
   
25
  /* ADC1 Init ****************************************************************/
26
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
27
  ADC_InitStructure.ADC_ScanConvMode = DISABLE; //DISABLE
28
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //ENABLE
29
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
30
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
31
  ADC_InitStructure.ADC_NbrOfConversion = 2;
32
  ADC_Init(ADC1, &ADC_InitStructure);
33
  
34
  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_3Cycles);
35
  ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_3Cycles);
36
  
37
  ADC_Cmd(ADC1, ENABLE); 
38
  ADC_SoftwareStartConv(ADC1); 
39
}

Hier der Code zum Auslesen der Spannung:
1
uint16_t Get_VoltageADC1_Channel_1(uint32_t samples)
2
{
3
  uint32_t value=0;
4
  int i=0;
5
6
  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_15Cycles);
7
8
  for(i=0;i<samples;i++)
9
  {
10
    ADC_SoftwareStartConv(ADC1);
11
12
    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) != SET)
13
    {
14
15
    }
16
17
    value += ADC_GetConversionValue(ADC1);
18
  }
19
  return (value/samples);
20
}

Gruß
Schero

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Die "ADC_SampleTime_3Cycles" ist schon recht klein. Mache mal mehr, z.B. 
15 oder 28.

von Ingo (Gast)


Lesenswert?

Wie stark ändern sich die Eingänge denn?

von Patrick S. (schero)


Lesenswert?

Danke für die Antworten!
Die größere Sample Time werde ich Morgen testen und dann berichten ob 
sich etwas geändert hat.
Im Moment verhält es sich so:
Beide Eingänge zeigen leicht unterschiedliche Temperaturen z.B. 23.5 und 
24.2 Grad Celsius. Kühle ich nun einen Eingang ab, ich besprühe also nur 
einen AD590 mit Kältespray, ergeben sich folgende Werte:
Kanal 1: -10.5 Grad Celsius
Kanal 2: -10.2 Grad Celsius

Den zweiten Kanal lese ich mit einer eigenen Funktion aus, welche zu der 
oben gezeigten identisch ist aber auf den zweiten Eintrag der Regular 
Channel Group zeigt.

Gruß
Schero

von wurst (Gast)


Lesenswert?

zeig mal die beschaltung der Sensoren. Die AD-Eingänge dürfen nicht zu 
hochomig beschaltet werden. Ich hatte genau das gleiche Verhalten 
einmal, als ich einen der Eingänge floatend ließ. Das ist ein normales 
Verhalten.

Also: Quellenimpedanz deiner Messschaltung beachten! Die sollte 
möglichst klein sein.

von Patrick S. (schero)


Angehängte Dateien:

Lesenswert?

Hallo Wurst,

hier ist meine Beschaltung des AD590.

Gruß
Schero

von wurst (Gast)


Lesenswert?

Patrick Scherbaum schrieb:
> Hallo Wurst,
>
> hier ist meine Beschaltung des AD590.
>
> Gruß
> Schero

hmm...

Miss doch mal die Spannung die an dem Analogeingang anliegt und 
kontrolliere ob die sich ebenfalls ändert (wenn du den anderen 
besprühst). So ganz schlau werde ich da nicht draus. Wie gesagt: Ich 
konnte dieses Phänomen bisher nur beobachten, wenn einer der beiden 
Eingänge floatend war. Bist du dir sicher, dass du die Eingänge richtig 
konfiguriert hast?

Am besten du postest mal den Code.

von wurst (Gast)


Lesenswert?

Edit: Blödsinn - das hast du ja (ist wohl schon spät am Abend).

von wurst (Gast)


Lesenswert?

Eine Sache fällt mir aber noch ein: Du könntest statt der Sensoren mal 
zwei Spannungsquellen (niederohmig direkt aus einem Powersupply) an die 
Analogeingänge anschließen und gucken ob die Wechselwirkung dann 
immernoch vorhanden ist.

von holger (Gast)


Lesenswert?

>hier ist meine Beschaltung des AD590.

Papp da mal nen 10nF Kondensator vom ADC Eingang
gegen Masse dran. Und es sollte reichen wenn du
einmal pro Sekunde misst. Temperaturen ändern sich
nicht besonders im us Bereich.

von Patrick S. (schero)


Lesenswert?

Die Temperatur brauche ich auch nur alle 5 Sekunden. Das hat doch aber 
nichts mit den einstellbaren Sample Zeiten zu tun oder?

Gruß
Schero

von Patrick S. (schero)


Lesenswert?

Leider bewirkt eine Erhöhung der Sample Time keine Veränderung im 
Verhalten.
Ich kann mir nur vorstellen, dass der Eingang zu schnell umgeschaltet 
wird und sich die Ergebnisse beider Eingänge vermischen. Nur wo kann ich 
das konfigurieren?
Ist das vielleicht:
1
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;

Gruß
Schero

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.