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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.