Forum: Mikrocontroller und Digitale Elektronik STM32F4 ADC läuft nicht


von ADC STM (Gast)


Lesenswert?

Hallo, vielleicht kann mir jemand unterstützung beim initialisieren des 
ADC's beim STM32F4Discovery geben.
Leider kommt beim Auslesen 0 an auf allen vier Kanälen.
Der Code wurde zum Großteil aus den Examples entnommen.
Vielen Dank schon einmal.
1
#include "stm32f4xx_adc.h"
2
#include "stm32f4xx_gpio.h"
3
#include "stm32f4xx_rcc.h"
4
#include "stm32f4xx_dma.h"
5
#include "variables.h"
6
7
void adc_init(void){
8
  ADC_InitTypeDef ADC_InitStruct;
9
  ADC_CommonInitTypeDef ADC_CommonInitStruct;
10
  DMA_InitTypeDef DMA_InitStruct;
11
  GPIO_InitTypeDef GPIO_InitStruct;
12
  /* Enable ADC3, DMA2 and GPIO clocks ****************************************/
13
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE);
14
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);//ADC3 is connected to the APB2 peripheral bus
15
  /* DMA2 Stream0 channel0 configuration **************************************/
16
  DMA_InitStruct.DMA_Channel = DMA_Channel_2;
17
  DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC3->DR;//ADC3's data register
18
  DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)&ADCConvertedValue;
19
  DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralToMemory;
20
  DMA_InitStruct.DMA_BufferSize = (uint32_t) 8;
21
  DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
22
  DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
23
  DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//Reads 16 bit values
24
  DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//Stores 16 bit values
25
  DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
26
  DMA_InitStruct.DMA_Priority = DMA_Priority_High;
27
  DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Disable;
28
  DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
29
  DMA_InitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single;
30
  DMA_InitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
31
  DMA_Init(DMA2_Stream0, &DMA_InitStruct);
32
  DMA_Cmd(DMA2_Stream0, ENABLE);
33
  /* Configure GPIO pins ******************************************************/
34
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;// PC0, PC1, PC2, PC3
35
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;//The pins are configured in analog mode
36
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
37
  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
38
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL ;//We don't need any pull up or pull down
39
  GPIO_Init(GPIOC, &GPIO_InitStruct);//Initialize GPIOC pins with the configuration
40
  /* ADC Common Init **********************************************************/
41
  ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent;
42
  ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div2;
43
  ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
44
  ADC_CommonInitStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
45
  ADC_CommonInit(&ADC_CommonInitStruct);
46
  /* ADC3 Init ****************************************************************/
47
  ADC_DeInit();
48
  ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;//Input voltage is converted into a 12bit int (max 4095)
49
  ADC_InitStruct.ADC_ScanConvMode = ENABLE;//The scan is configured in multiple channels
50
  ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;//Continuous conversion: input signal is sampled more than once
51
  ADC_InitStruct.ADC_ExternalTrigConv = 0;
52
  ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
53
  ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//Data converted will be shifted to right
54
  ADC_InitStruct.ADC_NbrOfConversion = 4;
55
  ADC_Init(ADC3, &ADC_InitStruct);//Initialize ADC with the configuration
56
  /* Select the channels to be read from **************************************/
57
  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_144Cycles);//PC0
58
  ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_144Cycles);//PC1
59
  ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_144Cycles);//PC2
60
  ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_144Cycles);//PC3
61
  /* Enable DMA request after last transfer (Single-ADC mode) */
62
  ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);
63
  /* Enable ADC3 DMA */
64
  ADC_DMACmd(ADC3, ENABLE);
65
  /* Enable ADC3 */
66
  ADC_Cmd(ADC3, ENABLE);
67
  /* Start ADC3 Software Conversion */
68
  ADC_SoftwareStartConv(ADC3);
69
}

Main:
1
int main(void) {
2
  
3
  SystemInit();                 
4
  ur_sh_adc_init();
5
6
  SysTick_Config(SystemCoreClock/1000); //Definition of Systick to 1 ms.
7
  while(1){
8
    }
9
    ADC_result1 = ADCConvertedValue[0];
10
    ADC_result2 = ADCConvertedValue[1];
11
    ADC_result3 = ADCConvertedValue[2];
12
    ADC_result4 = ADCConvertedValue[3];
13
  }
14
}
15
}

von Stefan (Gast)


Lesenswert?

Du musst im PMC (Power Management Controller) noch den ADC aktivieren

von dummy (Gast)


Lesenswert?

Genau hinsehen hilft oft:

  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1,
  ADC_Cmd(ADC3, ENABLE);

von ADC STM (Gast)


Lesenswert?

Okay der Vorschlag von "dummy" wurde umgesetzt (man ist mir das 
peinlich)...
Nur beim Vorschlag von Stefan steh ich gerade noch ein wenig auf dem 
Schlauch, wie kann man den PMC (Power Management Controller) aktivieren?

Die Kanäle zeigen mittlerweile irgendwelche Werte an. Kanal 1 z.B. FFF
Beim Anlegen von 3,3V an den Pin zuckt er kurz auf FBF und dann wieder 
auf FFF, das wars, also laufen tut er noch nicht richtig.

von ADC STM (Gast)


Lesenswert?

Hat keiner einen Tipp für mich? Google lässt mich grad ziemlich im Stich 
was den Power Management Controller betrifft.

von Stefan (Gast)


Lesenswert?

Sry falscher controller. Der STM32F4 hat keinen PMC.

Der Clock wird mit den Zeilen
1
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE);
2
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);

aktiviert. Das müsste passen

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Evtl. fehlt dir noch
1
 ADC_ContinuousModeCmd(ADC3,ENABLE);
2
  ADC_SoftwareStartConv(ADC3);

von ADC STM (Gast)


Lesenswert?

Naja der einzigste Kanal der etwas halbwegs vernünftiges anzeigt ist 
Kanal 4.
Alle anderen Kanäle liefern nur Müll.
Kanal 1 zeigt ständig den Maximalwert an und die Kanäle 2&3 schwanken 
immer schön irgendwo zwischen 0 und VDD rum.
Kanäle 1-3 juckt es also nicht ob etwas anliegt oder nicht.

von Holger A. (kaeseschnitzel)


Lesenswert?

Hast du mal versucht mit dem STM32CubeMX die Initialisierung zu 
erstellen? Oft vergisst man irgendwo einen Parameter.

Auch muss man aufpassen das für den AD-Wandler verwendete Port nicht 
schon von interner Peripherie auf dem DISCOVERY-Board verwendet wird. 
Das hat mich schonmal ein paar Stunden debuggen gekostet (STM32CubeMX 
zeigt dir das an, wenn du das Board auswählst).

von ADC STM (Gast)


Lesenswert?

Sorry aber mit dem Cube kann ich nichts anfangen.
Habs soeben ausprobiert aber das verwirrt noch mehr als so schon.

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.