STM32 Low Layer API ADC auslesen

Gast #6046607
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.
Gast #6046639
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.
Gast #6046718
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
Gast #6046736
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.
Gast #6046878
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.
Gast #6046910
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.
Gast #6046936
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.
Gast #6046959
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....
Gast #6047026
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
(Firma: fritzler-avr.de) #6047045
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.
Gast #6047073
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.
Gast #6047131
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.
Gast #6047446
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren