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