Forum: Mikrocontroller und Digitale Elektronik STM32 Low Layer API ADC auslesen


von STBeginner (Gast)


Lesenswert?

Hallo zusammen,

ich versuche gerade in einem einfachen Projekt mithilfe der Low Layer 
von ST einen ADC auszulesen. Mein Code sieht folgendermaßen aus.
1
 /* Enable internal regulator */
2
  LL_ADC_EnableInternalRegulator(ADC1);
3
/* Run the ADC calibration in single-ended mode */
4
  LL_ADC_StartCalibration(ADC1,LL_ADC_SINGLE_ENDED);
5
  while(LL_ADC_IsCalibrationOnGoing(ADC1));
6
// Enables ADC
7
  LL_ADC_Enable(ADC1);
8
//Enable interruption ADC group injected end of sequence conversions
9
  LL_ADC_ClearFlag_JEOS(ADC1);
10
// Start injected conversion
11
  LL_ADC_INJ_StartConversion(ADC1);

Im ADC-Interrupt lese ich dann das entsprechende Register aus und lösche 
das JEOS-Flag. Mein Problem ist aber das die Werte die der ADC liefert 
nicht zu der Spannung passt die tatsächlich anliegt.

Was habe ich vergessen das ich trotz Kallibierung keine rrichtigen 
Ergebnisse bekomme ?

Schon mal vielen Dank für eure Antworten.

von Nop (Gast)


Lesenswert?

Schaltung? Geheim. Prozessor? Geheim. Code? Größtenteils auch geheim, 
denn das ist keine "API", das sind nur ein paar Registerwrapper.

von pegel (Gast)


Lesenswert?

Nop schrieb:
> Geheim

Genau.
Wäre das nicht so, hätte ich auf das passende Beispiel in der Cube 
HAL/LL Lib hingewiesen.

von Guest (Gast)


Lesenswert?

Was heißt denn sie passen nicht? Wenn die Messergebnisse schwanken und 
zu niedrig sind könnte das an einer zu geringen Sampelzeit liegen. Man 
kann einstellen wie viele Zyklen das Sample and Hold aufgeladen wird.

von STBeginner (Gast)


Lesenswert?

Hallo,

ich benutze einen STM32F303 und versuche mit dem Channel 1 von ADC1 eine 
Spannung einzulesen diese kann ich mit einem DC-Netzteil einstellen. Die 
Messwerte liegen jedoch um ein Vielfaches von meiner angelegten Spannung 
ab, ich habe das selbe schon mit den HAL-Befehlen gemacht und hier 
funktioniert alles. D.h. ich hbe was vergessen das die HAL-Befehle 
machen und ich mit den LL nicht mache.

Viele Grüße

von (Gast)


Lesenswert?

STBeginner schrieb:
> D.h. ich hbe was vergessen das die HAL-Befehle
> machen und ich mit den LL nicht mache.

Scheint so. Meine Glaskugel meint der Eingangs-Pin ist nicht auf 
Analog-Modus geschaltet.

Dünne das Projekt so weit aus wie möglich und stell das irgendwo online. 
Salamitaktik bringt nicht viel bei solchen Problemen.

von Guest (Gast)


Lesenswert?

STBeginner schrieb:
> ich habe das selbe schon mit den HAL-Befehlen gemacht und hier
> funktioniert alles

Dann benutz doch einfach die HAL.

von STBeginner (Gast)


Lesenswert?

Ich habe mein Projket mit CubeMX generieren lassen deswegen gehe ich 
davon aus das alle Pins so konfiguriert sind wie ich es eingestellt habe 
da die Codegenerierung mit HAL auch die richtigen Ergebnisse liefert.

Die LL benutze ich weil die Anwendung zeitkritisch ist und durch die 
HAL-Befehle ein großer Overhead entsteht.

von Florian (Gast)


Lesenswert?

> Ich habe mein Projket mit CubeMX generieren lassen deswegen gehe ich
> davon aus das alle Pins so konfiguriert sind wie ich es eingestellt habe
> da die Codegenerierung mit HAL auch die richtigen Ergebnisse liefert.

Du nutzt also die HAL zur Initialisierung und LL zum Samplen?

Na denn, die HAL ist quelloffen, du kannst also nachschauen was die HAL 
anders macht als du mit der LL bib. Geh einfach Schritt für Schritt das 
Samplen mit der HAL durch und schau ins Datenblatt falls etwas davon 
unklar ist, dann sollte dir ein Unterschied zu deinem Vorgehen 
auffallen. Fertig.

von Guest (Gast)


Lesenswert?

STBeginner schrieb:
> Die LL benutze ich weil die Anwendung zeitkritisch ist und durch die
> HAL-Befehle ein großer Overhead entsteht.

Ich finde faszinierend wie immer alle meinen die HAL hätte so viel 
overhead...

Benutz doch einfach mal die Hardware die dir zur verfügung steht. Nimm 
den ADC mit einem DMA und starte das ganze mit der HAL. Alles was du 
dann machen musst ist auf den Interrupt für die fertige Wandlung warten.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Guest schrieb:
> Ich finde faszinierend wie immer alle meinen die HAL hätte so viel
> overhead...

Guck dir mal die Sourcen an ;)

von Johannes S. (Gast)


Lesenswert?

man kann doch sicher die Referenz auf verschiedene Werte stellen, ist 
die richtig eingestellt?

von Guest (Gast)


Lesenswert?

Mw E. schrieb:
> Guck dir mal die Sourcen an ;)

Die Kenn ich und ich habe früher auch die SPL benutzt und ganz ehrlich, 
wenn du Projekte hast auf denen immer wieder die gleiche Peripherie zum 
Einsatz kommt sich aber je nach Anforderung die CPU ändert dann willst 
du nicht immer alles neu auf den jeweiligen Cortex abstimmen.

Klar hat die HAL einen gewissen Overhead. Das meiste davon ist aber 
absolut nebensächlich, wenn man sie richtig benutzt....

von Dieter (Gast)


Lesenswert?

Guest schrieb:
> Klar hat die HAL einen gewissen Overhead. Das meiste davon ist aber
> absolut nebensächlich, wenn man sie richtig benutzt....

Dazu müsste man aber wissen was der Controller einem Bietet und wie man 
es benutzt und Datenblätter lesen wir ja meistens überbewertet ;)

Ich finde auch das der Overhead überschaubar ist sofern man etwas 
sinnvoll die Funktionen nutzt.

Wer wirklich Overhead erleben will der muss Arduino benutzen :D

von Guest (Gast)


Lesenswert?

Dieter schrieb:
> Wer wirklich Overhead erleben will der muss Arduino benutzen :D

Wieso die gigantischen 100khz beim Pin toggeln mit digitalWrite sind 
doch der Wahnsinn. :D

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Guest schrieb:
> und ganz ehrlich,
> wenn du Projekte hast auf denen immer wieder die gleiche Peripherie zum
> Einsatz kommt sich aber je nach Anforderung die CPU ändert dann willst
> du nicht immer alles neu auf den jeweiligen Cortex abstimmen.

Mit der STM32 HAL ist das ja schonmal nicht möglich.
Bei einem DMA Transfer musste selber angeben welcher DMA und welcher 
Channel für den UART (oder hier für den ADC) genutzt werden muss.
Anstatt nur anzugeben "machmal DMA mit dem UART hier".
Hardware abstrahiert ist da ganix.

Wer also öfter mal umzieht und seine Applikation nicht anpassen will 
muss eh ein eigenes HAL Interface definieren und das dann selber 
Implementieren.
Oder wer ganz faul is der mappt das dann eben auf die Herstellerlibs.

von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Dieter schrieb:
> Wer wirklich Overhead erleben will der muss Arduino benutzen

Oder noch besser: STM32Duino, da hat man den Overhead gleich im 
Doppelpack. Ich sage nur: Hello-World 30kB Flash

von pegel (Gast)


Lesenswert?

Overhead bei ADC im DMA Modus?

Bei der Initialisierung schon, aber wenn es läuft wird kein Code mehr 
benötigt. Das macht die Hardware, dazu ist sie da.

Code kommt erst wieder beim Interrupt ins Spiel.

von Stefan F. (Gast)


Lesenswert?

pegel schrieb:
> wenn es läuft wird kein Code mehr benötigt.

Das kannst du sagen, wenn du >= 128kB Flash hast. Darunter ist das schon 
ein Thema.

von pegel (Gast)


Lesenswert?

Stefan F. schrieb:
> Das kannst du sagen, wenn du >= 128kB Flash hast.

Das verstehe ich nicht. Was hat das mit ADC und DMA zu tun, wenn er in 
Hardware nur ein paar Registerinhalte an eine bestimmte Speicherstelle 
schaufelt?

von pegel (Gast)


Lesenswert?

Na gut. Es macht einen Unterschied ob ich die ADC Wandlung per Software 
oder Timer starte.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

pegel schrieb:
> Overhead bei ADC im DMA Modus?

Da gings grade eher darum ob der HAL wirklich abstrahiert oder nurn 
Klotz am Bein ist ;)

von pegel (Gast)


Lesenswert?

Mw E. schrieb:
> Da gings grade eher darum ob der HAL wirklich abstrahiert oder nurn
> Klotz am Bein ist ;)

Geht es nicht immer darum?

Man kann es benutzen, muss man aber nicht in allen Situationen.

Zur Not kann man im Interrupt oder sonst wo auch einen ASM Befehl 
unterbringen.

von Nop (Gast)


Lesenswert?

STBeginner schrieb:

> ab, ich habe das selbe schon mit den HAL-Befehlen gemacht und hier
> funktioniert alles. D.h. ich hbe was vergessen das die HAL-Befehle
> machen und ich mit den LL nicht mache.

Die Performance steigt deutlich, wenn man die Hälfte der HAL-Befehle 
wegläßt. Wenn man gezielt die unnötige Hälfte wegläßt, ist das Ergebnis 
sogar dasselbe.

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.