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:
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?
(ist jetzt für den STM32 F1 03 aka "Bluepill")
Ich benutze die HAL nicht, aber wenn ich den ADC im Scanmodus verwende,
gehe ich wie Folgt vor:
* Die ADC1->SQR Register konfigurieren: Gibt an in welcher Reihenfolge
die einzelnen ADC-Chanels eingelesen werden sollen.
* Die ADC1->SMPR Register konfigurieren: Wenn nötig wird hier
eingestellt wie schnell die einzelne ADC-Wandlung dauern soll
* ADC1->CR1 Bit setzen: SCAN
* ADC1->CR2 Bits setzen: CONT und DMA
* DMA Konfigurieren:
DMA1_Channel1->CPAR = &(ADC1->DR)
DMA1_Channel1->CMAR = Pointer auf das Array
DMA1_Channel1->CNDTR = Anzahl, muss mit der SQR Konfiguration
übereinstimmen, und das Array sollte lang genug sein
DMA1_Channel1->CCR: MEM2MEM=0, PL=LOW, MSIZE=16, PSIZE=16, MINC=1,
PINC=0, CIRC=1, DIR=0, TEIE=0, HTIE=0, TCIE=0, EN=0
* DMA starten: DMA1_Channel1->CCR Bit setzen: EN
Das kuriose ist, daß ich ein anderes Projekt mit dem NUCLEO-F767ZI
(deutlich größerer Mikrocontroller) habe, bei dem es funktioniert.
Anzahl der Kanäle ist bei dem aber nicht 16, sondern geringer, aber
daran sollte es ja nicht liegen.
Cube für den F767ZI sieht beim ADC geringfügig anders aus, aber die
meisten Parameter sind identisch. Hab gedacht, ich kann das bei dem
L452REgenau so machen.
Jetzt habe ich das Ganze mal genauer untersucht. Ich habe die Anzahl der
ADC-Kanäle variiert (siehe Anhang). Bis 5 Kanäle ist es OK. Ab 6 Kanäle
kommt irgend etwas durcheinander. Ob das ein Fehler des Mikrocontrollers
ist?
Im Cube ist der STM32L452RETx eingestellt. Auf dem NUCLEO-L452RE ist ein
STM32L452RET6U bestückt. Das sollte ja eigentlich passen.
Hat jemand eine Erklärung für diesen Effekt?
Habe die Cube-Datei beigefügt. Eventuell sieht jemand eine falsche
Einstellung. Ich verwende bislang den alten Cube Version 4.23.0. Ich
denke aber nicht, daß es daran liegt. Den neuen Cube finde ich etwas
unübersichtlicher.
Ich habe nun mal ein neues Projekt gemacht und das Nucleo-Board im Cube
ausgewählt. Läßt dauerhaft eine LED blinken und startet den ADC mit DMA
(7 Kanäle). Im Anhang das komplette Testprojekt.
Das selbe Problem. Kanal 2...5 geht, die anderen zeigen unsinnige Werte
an. Sollten eigentlich Null sein, da Pull down. Und ca. 4096, wenn ich
3,3V testweise anlege. Im beigefügten Watch wurde Kanal 2 mit 3,3V
gespeist und im Array 1 wird der entsprechende Wert angezeigt. Array 0,
5 und 6 zeigen Müll an.
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang