1 | ADC_DeInit(); //Resetet alle ADC Einstellungen
|
2 |
|
3 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
|
4 |
|
5 | ADC_CommonInitTypeDef ADC_CommonInitStructure;
|
6 | ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent; // Wenn mehrere ADC's gleichzeitig verwendet werden zum synchronisieren !!!
|
7 | ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2; //AHB2 = 42 MHz Div2 -> 21 MHz
|
8 | ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_10Cycles;
|
9 | ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
|
10 | ADC_CommonInit(&ADC_CommonInitStructure);
|
11 |
|
12 | ADC_InitTypeDef ADC_InitStructure;
|
13 | ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //Eingangsspannung in 12bit Wert mit max. Wert von 4096
|
14 | ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //Kontinuierliche Auswertung aller Regular-Kanäle (in Schleife)
|
15 | ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //wird _left _right bündig in 16 Bit Register abgespeichert
|
16 | ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //Signal welches die Wandlung auslösen soll
|
17 | ADC_InitStructure.ADC_ExternalTrigConv = 0;
|
18 | ADC_InitStructure.ADC_NbrOfConversion = 3; //Anzahl der Kanäle in der "Regular Channel Groupe"
|
19 | ADC_InitStructure.ADC_ScanConvMode = ENABLE; // ENABLE: Mehrere Kanäle werden im Scan-Modus gewandelt
|
20 | ADC_AutoInjectedConvCmd(ADC1, ENABLE); //ENABLE: Nach abgearbeiteter Regular Group wird automatisch Injected Group angetriggert
|
21 | ADC_Init(ADC1, &ADC_InitStructure);
|
22 |
|
23 | //Kanäle werden manuell der Regular Group (bis 16 Kanäle) zugefügt (ADCx, Kanal, Reihenfolge zum Durchlaufen,Sample Time)
|
24 | ADC_RegularChannelConfig(ADC1, ADC_Channel_3 ,1 , ADC_SampleTime_84Cycles); //Wählt Kanal 11 aus (PA3)
|
25 | ADC_RegularChannelConfig(ADC1, ADC_Channel_5 ,2 , ADC_SampleTime_84Cycles); //Wählt Kanal 12 aus (PA5)
|
26 | ADC_RegularChannelConfig(ADC1, ADC_Channel_7 ,3 , ADC_SampleTime_84Cycles); //Wählt Kanal 13 aus (PA7)
|
27 |
|
28 | // Dauer einer Wandlung = (XCycles [-] + 12.5) / ADCCLK [MHz] = X µs) z.B. 84+12,5/ 21 Mhz = 4,595 µs
|
29 |
|
30 |
|
31 | DMA_DeInit(DMA2_Stream0); //Resetet alle DMA Einstellungen
|
32 |
|
33 | RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
|
34 |
|
35 |
|
36 | DMA_InitTypeDef DMA_InitStructure;
|
37 | DMA_StructInit(&DMA_InitStructure);
|
38 | DMA_InitStructure.DMA_Channel = DMA_Channel_0;
|
39 | DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADCRead; // Zieladresse
|
40 | DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->DR); // Quelladresse / Peripheriegerät
|
41 | DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; // from Peripheral to RAM
|
42 | DMA_InitStructure.DMA_BufferSize = 4; //
|
43 | DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // Source stays same address
|
44 | DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // Destination will be incremented
|
45 | DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 16 bit results
|
46 | DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; // 16 bit results
|
47 | DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // Läuft dauernd weiter ohne zu stoppen
|
48 | DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //
|
49 | DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
|
50 | DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
|
51 | DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
|
52 | DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
|
53 | DMA_Init(DMA2_Stream0, &DMA_InitStructure); // Init the stuff finally
|
54 |
|
55 |
|
56 | DMA_Cmd(DMA2_Stream0,ENABLE); //Aktiviert DMA
|
57 |
|
58 |
|
59 | while(DMA_GetCmdStatus(DMA2_Stream0)==DISABLE){};
|
60 |
|
61 | ADC_DMACmd(ADC1, ENABLE);
|
62 | ADC_Cmd(ADC1, ENABLE); //Aktiviert Wandler ADC1
|
63 | ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
|
64 |
|
65 | ADC_ContinuousModeCmd(ADC1,ENABLE);
|
66 |
|
67 | ADC_SoftwareStartConv(ADC1); //Triggert erste Wandlung
|