[STM32L1] ADC Calibration gibt es nicht mehr?

OP Persönliche Seite #5117585
Lesenswert?

Guten Morgen,

ich hab gerade etwas Code vom STM32F1 zum STM32L1 portiert und es 
scheint so, als gäbe es den ADC-Calibration-Wert nicht mehr.

Im Datenblatt der STM32L1 Familie heißt es aber weiterhin:

>Calculating the actual VDDA voltage using the internal reference
> voltage The VDDA power supply voltage applied to the microcontroller
> may be subject to variation or not precisely known. The embedded
> internal voltage reference (VREFINT) >and its calibration
>data acquired by the ADC during the manufacturing process at VDDA = 3 V
>can be used to
>evaluate the actual VDDA voltage level.
>The following formula gives the actual VDDA voltage supplying the
> device:
>VDDA = 3 V x VREFINT_CAL / VREFINT_DATA
>Where:
>• VREFINT_CAL is the VREFINT calibration value
>• VREFINT_DATA is the actual VREFINT output value converted by ADC

Ja aber ... VREFINT_CAL gibt es nicht mehr ...

Ebenfalls sind sämtliche Funktionen aus der StdPeriphLib verschwunden, 
die die Kalibrierung durchführten.

An anderer Stelle heißt es:

>The internal reference voltage is factory measured and the result of
> the ADC conversion is stored in a specific data address : the
> VREFINT_Factory_CONV byte.

Aber Google kennt VREFINT_Factory_CONV nicht und in den ST-Libs zur 
STM32L1-Familie kommt das auch nirgends vor.

Hat jemand eine Idee?

Vielen Dank
Mampf, der wieder einmal verwundert ist, dass er so exotische Features 
wie ADC und interne Voltage-Referenz als scheinbar einziger Mensch auf 
der ganzen Welt verwendet ...
OP Persönliche Seite #5117603
Lesenswert?

Vincent H. schrieb:
> VREFINT_CAL_ADDR gibts laut meiner Suche in der
> "stm32l1xx_ll_adc.h".

Ah, das ist eine Lib, die mit HAL kommt!

Danke für den Tipp, hatte HAL gekickt und nur CMSIS verwendet :)

Aber das ist doch echt wieder ein Witz, oder?

Google nach: "VREFINT_CAL" "stm32l1"

Genau 7 Treffer ...

WTF und "stm32l1xx_ll_adc.h" bringt sogar nur 4 ...

Ähm ...
#5117608
Lesenswert?

Mampf F. schrieb:
> Vincent H. schrieb:
>> VREFINT_CAL_ADDR gibts laut meiner Suche in der
>> "stm32l1xx_ll_adc.h".
>
> Ah, das ist eine Lib, die mit HAL kommt!
>
> Danke für den Tipp, hatte HAL gekickt und nur CMSIS verwendet :)
>
> Aber das ist doch echt wieder ein Witz, oder?
>
> Google nach: "VREFINT_CAL" "stm32l1"
>
> Genau 7 Treffer ...
>
> Wie mich das immer ankotzt ... ;-)


Inkonsistenz ist bei ST leider Programm ja... Hab gestern einen Bug in 
der L4 reported, der 1:1 in der F7 Variante schon länger gekannt war. 
Von Headern und nicht vollständigen Macros brauch ma gar nicht erst 
reden... :(
OP Persönliche Seite #5117638
Lesenswert?

temp schrieb:
> Mampf F. schrieb:
>> Ebenfalls sind sämtliche Funktionen aus der StdPeriphLib verschwunden,
>> die die Kalibrierung durchführten.
>
> Ich frag mich immer wieder wieso man sich auf diesen Mist einlässt. Vor
> allem wenn es um solche trivialen Sachen geht. Da ist ja Arduino noch
> besser.

Das Problem ist ST mit ihrer HAL-Lib ... Ist ja eh toll, dass es für die 
STM32L1xx noch eine CMSIS-StdPeriph-Lib gibt ... Aber neue Features 
werden da wohl nicht mehr rein kommen und die HAL-Lib ist richtig zum 
Kotzen. Hatte ich schon viel Spaß damit ...

Bleibt nur der Wechsel auf einen anderen Hersteller ... Schade, weil 
eigentlich sind die STM32 gut, aber was sich ST mit HAL leistet ist 
unter aller Sau.
OP Persönliche Seite #5117682
Lesenswert?

Hmm, mit dem Kalibration-Wert komme ich auch auf keinen grünen Zweig ...
1
uint16_t vrefint_cal = *VREFINT_CAL_ADDR;
2
uint16_t vrefint_data = readADC(ADC_Channel_17);
3
float vdda = 3.0f * (float) vrefint_cal / (float) vrefint_data;

Ergibt bei mir 2,65V und mit dem Multimeter messe ich 2,95V an VDD.

Der digitalisierte Wert von vrefint_data ist auch nicht stabil ... 
Meistens so 1895 rum, aber hin und wieder springt er auf 1565 - also 
gleich um 300 Werte ... ganz seltsam!

Falsch sind beide ... Es müsste in etwa der Kalibrier-Wert mit 1674 
herauskommen.

Seltsam das ist!
OP Persönliche Seite #5119028
Lesenswert?

Vincent H. schrieb:
> Der L4 den ich grad verwend besitzt im CCR Register vom ADC ein eigenes
> Bit (VREFEN), mit dem man den VREFINT erst auf den entsprechenden
> ADC-Kanal legen kann.
>
> Check mal ob der L1 das auch hat.

Jap, den hatte ich aktiviert :)

Also mittlerweile konnte ich das Problem aber lösen ... Hatte eine sehr 
hohe Impedanz (ich messe Li-Ion-Batterie-Spannung über einen 650kOhm 
Spannungsteiler).

Des Rätsels Lösung war das PDF von ST zu lesen ... Conversion-Time auf 
maximum vergrößern (384 Taktzyklen), eine 150nF Kapazität an den Pin und 
nach jeder Messung 30ms Pause machen.

Jetzt kann ich korrekt auf die Batterie-Spannung über den errechneten 
VDD-Wert. (VRefint ist jetzt auch korrekt bei der hohen 
Conversion-Time).

Und zum eigentlichen Thema: Den ADC der L1-Serie muss man nicht mehr 
kalibrieren, deshalb gibt es diese Funktionen nicht mehr.

Den VREFINT_CAL-Wert benötigt man dennoch, um VDD zu errechnen.

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