STM32F4 Analogeingänge nicht unabhängig

OP #3043295
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
OP #3043573
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
Gast #3043638
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.
Gast #3043840
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.
Gast #3043848
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.
OP #3044535
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren