Forum: Mikrocontroller und Digitale Elektronik STM32F0 ADC EOC Flag wird nicht gesetzt


von Martin (Gast)


Lesenswert?

Guten Abend,

Ich bin heute auf ein Problem mit dem ADC beim STM32F0 gestoßen, dass 
ich mir nicht erklären kann. Da der ADC an sich ja funktionieren sollte 
denke ich das ich etwas vergessen habe, leider weis ich aber nicht was.

Nach der Initialisierung vom ADC lese setze ich den verwendeten Kanal 
und Starte den ADC um einen Shot zu machen. Leider wird danach nie das 
EOC Flag gesetzt. Ich habe mir auch schon mal im Debugger angeschaut ob 
das Flag gesetzt wird, aber es scheint wirklich nie gesetzt zu werden. 
Ich verwende zum Auslesen kein DMA sondern möchte gerne warten bis der 
ADC fertig ist.

Die Beispiele und Beiträge die ich zum ADC gefunden haben bezogen sich 
meist auf die F1 oder F4, die aber leicht anders aufgebaut sind, aber 
auch dort habe ich nichts gefunden.

hier mal die Initialisierung:
1
void adc_Init(void)
2
  {
3
4
  GPIO_InitTypeDef GPIO_InitStructure;
5
  ADC_InitTypeDef  ADC_InitStructure;
6
7
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);            // Clock fuer ADC aktivieren
8
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);              // GPIO Clock an
9
10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;  // IO Teil an den ADC Pins deaktivieren
11
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;                // Analog Modus der Pins
12
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;              // Pullups deaktivieren
13
  GPIO_Init(GPIOA, &GPIO_InitStructure);                    // IO Config uebernehmnen
14
15
  ADC_StructInit(&ADC_InitStructure);
16
  ADC_DeInit(ADC1);                              // ADC mit Grundwerten initialisieren
17
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;            // 12 bit Aufloesung
18
  ADC_InitStructure.ADC_ExternalTrigConv = DISABLE;              // kein ext. Trigger
19
  //ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
20
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;           
21
  ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Backward;
22
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;              // Continuous Mode disable
23
  ADC_Init(ADC1, &ADC_InitStructure);                      // ADC Config uebernehmen
24
25
  ADC_Cmd(ADC1, ENABLE);                             // ADC Enable
26
27
  ADC_AutoPowerOffCmd(ADC1, DISABLE);                      // Auto Power Off
28
  //ADC_VrefintCmd(ENABLE);                                                            // Int. 1.2 V Vref
29
30
  ADC_GetCalibrationFactor(ADC1);                                                        // Calibration Faktor einlesen
31
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));                // Warten bis ADC aktiviert
32
33
  }

Das eigentliche Auslesen mache ich dann in der folgenden Funktion:
1
u16 adc_Get(u8 Channel)
2
  {
3
  u16 Tmp = 0;
4
5
  switch (Channel)                              // Channel auswaehlen
6
    {
7
    case 0:
8
      {
9
      ADC_ChannelConfig(ADC1, ADC_Channel_0, ADC_SampleTime_55_5Cycles);
10
      break;
11
      }
12
    case 1:
13
      {
14
      ADC_ChannelConfig(ADC1, ADC_Channel_1, ADC_SampleTime_55_5Cycles);
15
      break;
16
      }
17
    case 2:
18
      {
19
      ADC_ChannelConfig(ADC1, ADC_Channel_2, ADC_SampleTime_55_5Cycles);
20
      break;
21
      }
22
    case 3:
23
      {
24
      ADC_ChannelConfig(ADC1, ADC_Channel_3 , ADC_SampleTime_55_5Cycles);
25
      break;
26
      }
27
    case 4:
28
      {
29
      ADC_ChannelConfig(ADC1, ADC_Channel_1 , ADC_SampleTime_55_5Cycles);
30
      break;
31
      }
32
    }
33
  
34
  ADC_StartOfConversion(ADC1);                        // ADC Conversion Start
35
36
  while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET){watchdog_Reload();}  // warten bis fertig
37
38
  Tmp = ADC_GetConversionValue(ADC1);                      // Wert einlesen
39
40
  return (Tmp);
41
  }

Zum kompilieren verwende ich die GCC Toolchain.

Kennt jemand zufällig das Problem und kann mir einen Tip geben ?


Gruß,
Martin

von Martin (Gast)


Lesenswert?

Guten Tag,

die gleiche ADC Konfiguration mit DMA funktioniert, wobei ich dabei das 
Flag vom DMA Channel abfrage.
Das ist etwas merkwürdig.


Gruß,
Martin

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.