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 ...
:
Bearbeitet durch User
VREFINT_CAL_ADDR gibts laut meiner Suche in der "stm32l1xx_ll_adc.h".
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 ...
:
Bearbeitet durch User
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... :(
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.
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.
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!
:
Bearbeitet durch User
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.
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.
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.