Ich habe ein NUCLEO-L452RE, mit dem ich gerade Versuche mache, bevor ich
die reale Platine fertige.
Ich möchte 16 Analogwerte dauerhaft im Scanmode wandeln. Die
ADC-Ergebnisse sollen in ein Array geschrieben werden (DMA). Geht aber
irgendwie nicht richtig...
Mit der Abfrage eines einzelnen ADC-Kanals ohne DMA gehen die ADC-Kanäle
(zumindest bei den ersten 4 Kanälen habe ich es getestet) und es kommen
auch plausible Werte raus, wenn ich eine Spannung 0..3,3V einspeise.
Quellcode ist wie folgt:
1 | HAL_ADC_Start(&hadc1);
|
2 | HAL_ADC_PollForConversion(&hadc1, 100);
|
3 | uiAdcResult = HAL_ADC_GetValue(&hadc1);
|
4 | HAL_ADC_Stop(&hadc1);
|
PS: Den jeweiligen Kanal des ADC habe ich beim Testen jeweils im Cube
umgeschaltet.
Den ADC starte ich wie folgt beim Scannen der 16 Kanäle mittels DMA:
1 | HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ro.uiAdcResults, 16);
|
Der vom Cube erzeugte Quellcode sieht wie folgt aus:
1 | hadc1.Instance = ADC1;
|
2 | hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV16;
|
3 | hadc1.Init.Resolution = ADC_RESOLUTION_12B;
|
4 | hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
|
5 | hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
|
6 | hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
|
7 | hadc1.Init.LowPowerAutoWait = DISABLE;
|
8 | hadc1.Init.ContinuousConvMode = ENABLE;
|
9 | hadc1.Init.NbrOfConversion = 16;
|
10 | hadc1.Init.DiscontinuousConvMode = DISABLE;
|
11 | hadc1.Init.NbrOfDiscConversion = 1;
|
12 | hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
|
13 | hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
|
14 | hadc1.Init.DMAContinuousRequests = ENABLE;
|
15 | hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
|
16 | hadc1.Init.OversamplingMode = DISABLE;
|
17 |
|
18 | sConfig.Channel = ADC_CHANNEL_1;
|
19 | sConfig.Rank = 1;
|
20 | sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
|
21 | sConfig.SingleDiff = ADC_SINGLE_ENDED;
|
22 | sConfig.OffsetNumber = ADC_OFFSET_NONE;
|
23 | sConfig.Offset = 0;
|
24 |
|
25 | sConfig.Channel = ADC_CHANNEL_2;
|
26 | sConfig.Rank = 2;
|
27 |
|
28 | sConfig.Channel = ADC_CHANNEL_3;
|
29 | sConfig.Rank = 3;
|
30 | ...
|
31 | sConfig.Channel = ADC_CHANNEL_16;
|
32 | sConfig.Rank = 16;
|
und DMA:
1 | HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0);
|
2 | HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
|
Leider kommen die Daten nicht so wie erwartet in dem Array an.
Arrayfeld 0 und 1 ändern sich nahezu identisch, werden von IN3 was
kommt.
Arrayfeld 2 und 3 ändern sich nahezu identisch, werden von IN4 was
kommt.
Arrayfeld 4 ändert sich, werden von IN5 was kommt.
Die restlichen Kanäle sind trotz Pull-Down-Widerstand immer ca. auf Wert
480.
Sehr kurios das Ganze. Ich komme leider nicht dahinter, woran es liegt.
Hat jemand eine Idee, was ich falsch mache?