Schönen guten Abend,
ich suche seit Stunden die richtige Vorgehensweise zur Kalibrierung des
ADC vom STM32F334k8T.
Im Datenblatt ist die Rede davon das im ROM eine internal reference
voltage abgelegt ist.
Im Referenzmanual steht das für die singleended und differential
input conversions unterschiedliche calibrierungen durch geführt werden
müssen.
Aber das genau wie habe ich noch nicht kapiert.
In der Hal habe ich die Funktion HAL_ADCEx_Calibration_Start gefunden
aber dessen Beschreibung ist wage.
Würde mir bitte jemand erklären ob die Hal Funktion das richte macht?
Also ob die Funktion aus dem Rom diesen Faktor raus zieht und anwendet?
Beziehungsweise wo ich die entsprechenden Infos finde?
Danke für die Hilfe.
Harry L. schrieb:> Ich les das so, daß die Funktion die kompl. Kalibrierung erledigt.> Einfach mal Mit und Ohne Testen und die Ergebnisse vergleichen.
Danke.
Und macht diese Funktion das mit dem VREFINT_CAL?
Oder ist das was anderes?
wear_a schrieb:> Aber das genau wie habe ich noch nicht kapiert.
Macht nichts. Nehmen wir den STM32F303 als Beispiel. Du aktivierst die
interne Referenzspannung und wartest die gegebene Start-up time. Ich
messe die Chiptempertur TS sowie die interne Referenzspannung VREF. In
Linie 16 führe ich die Kalibrierung durch und warte in Linie 17, bis die
Kalibrierung durchgeführt ist und die Hardware automatisch das ADCAL Bit
löscht.
Aus dem Ref-Manual:
Software procedure to calibrate the ADC
1. Ensure ADVREGEN[1:0]=01 and that ADC voltage regulator startup time
has elapsed.
2. Ensure that ADEN=0.
3. Select the input mode for this calibration by setting ADCALDIF=0
(Single-ended input)
or ADCALDIF=1 (Differential input).
4. Set ADCAL=1.
5. Wait until ADCAL=0.
6. The calibration factor can be read from ADCx_CALFACT register.
wear_a schrieb:> Und macht diese Funktion das mit dem VREFINT_CAL?> Oder ist das was anderes?
Versuch macht kluch ;-)
Du kannst doch im Debugger durchsteppen.
Die HAL ist ja im Source vorhanden.
wear_a schrieb:> Und was macht man wenn man auf dem selben ADC single und> differencial Mode braucht?
Die calibration zweimal laufen lassen. Einmal für single ended und
einmal für diff. Oder einmal für ADC1 und einmal für ADC2 und dann alle
single ended Kanäle an einen ADC anschließen und die differential Kanäle
an den anderen. Du hast 2 ADCs bezahlt, du darfst auch 2 benutzen ;)
wear_a schrieb:> Und macht diese Funktion das mit dem VREFINT_CAL?
Das ist geheim. Aber mir wäre das auch egal, nach dieser calibration hat
der ADC gefälligst die spezifizierte Genauigkeit zu haben, egal, wie sie
das machen.
Mit VREFINT_CAL kannst du den Fehler der internen Referenzspannung von
±40mV auf ±10mV (evt. ±5mV?) reduzieren. Wie das geht, steht auch im
RM0364 im Kapitel ADC. Die interne Referenz hat aber trotzdem 100ppm/K,
also wenn du messen willst, brauchst du sowieso eine externe.
Übrigens: ohne HAL geht das alles viel einfacher, schon alleine, weil du
nur ein Manual lesen musst. Und die Hardware von ST hat doch noch
weniger Fehler als ihre Software.
Guten Morgen,
Bauform B. schrieb:> Die calibration zweimal laufen lassen. Einmal für single ended und> einmal für diff. Oder einmal für ADC1 und einmal für ADC2 und dann alle> single ended Kanäle an einen ADC anschließen und die differential Kanäle> an den anderen. Du hast 2 ADCs bezahlt, du darfst auch 2 benutzen ;)
Leuchtet ein;)
Bauform B. schrieb:> Mit VREFINT_CAL kannst du den Fehler der internen Referenzspannung von> ±40mV auf ±10mV (evt. ±5mV?) reduzieren. Wie das geht, steht auch im> RM0364 im Kapitel ADC. Die interne Referenz hat aber trotzdem 100ppm/K,> also wenn du messen willst, brauchst du sowieso eine externe.
Also wenn ich das richtig verstehe dann brauch ich eine externe
Referenzspannungsquelle und messe diese mit einem Kanal und rechne das
Ergebnis der anderen Kanäle auf die gemessene Referenzspannung zurück?
Bei einem Punkt ist der Groschen noch nicht gefallen.
Nämlich was zeigt mir diese konstante VREFINT_CAL aus dem Rom an?
Brauche ich diese mit externer Referenzspannung?
Danke für die Geduld und Hilfe
Ich sehe gerade das das LQFP32 & das LQFP48 im Prinzip die selbe Fläche
auf der Leiterplatte braucht.
Das LQFP48 hat jedoch auch einen VSSA Pin. Bringt mir dies etwas
Genauigkeit oder bleibt sich das das selbe?
Danke für Eure Hilfe und Erfahrung.
wear_a schrieb:> Bringt mir dies etwas> Genauigkeit oder bleibt sich das das selbe?
Dafür ist der Pin da. Wenn man diese Versorgung gut filtert, sollte das
Rauschen des ADC etwas geringer werden - weniger Springen der unteren
Bits.
Matthias S. schrieb:> Dafür ist der Pin da. Wenn man diese Versorgung gut filtert, sollte das> Rauschen des ADC etwas geringer werden - weniger Springen der unteren> Bits.
Das heißt also ja besser den LQFP48 nehmen?
wear_a schrieb:> Also wenn ich das richtig verstehe dann brauch ich eine externe> Referenzspannungsquelle und messe diese mit einem Kanal und rechne das> Ergebnis der anderen Kanäle auf die gemessene Referenzspannung zurück?
So funktioniert das. Mit der internen Referenz geht's nach dem gleichen
Prinzip.
> was zeigt mir diese konstante VREFINT_CAL aus dem Rom an?
Das Datenblatt sagt
1
Raw data acquired at temperature of 30°C and VDDA=3.3V
Der Chip wird bei ST getestet, mit (hoffentlich) genauen 3.3V und dabei
lässt man den ADC die interne Referenzspannung messen. Das Ergebnis wird
im OTP-Flash gespeichert.
> Brauche ich diese mit externer Referenzspannung?Brauchen eigentlich nicht. Man könnte allerdings die externe Referenz
mit der internen vergleichen um z.B. Bestückungsfehler zu finden.
Man kann eine externe Referenz an einen Analog-Input anschließen oder an
den VDDA/VREF+-Pin. In beiden Fällen muss man aufpassen, dass diese
Spannung in den erlaubten Grenzen bleibt. Die sind von Chip zu Chip
verschieden und meist an VDD gekoppelt. Erst bei den neueren STM32L
entfällt diese Einschränkung. Für VDDA sagt das STM32F334-Datenblatt
z.B.
1
2.4V < VDDA < 3.6V
2
Must have a potential equal to or higher than VDD
Am sichersten ist es, VDDA/VREF+ mit VDD zu verbinden, eine
2.5V-Referenz aus VDDA zu speisen und die an einem Analog-Input
anzuschließen.
wear_a schrieb:> Das heißt also ja besser den LQFP48 nehmen?
Ob sich das lohnt, und ob sich eine externe Referenz lohnt, hängt doch
davon ab, was du messen willst. Für die Anzeige, wie voll die Batterie
vom Küchenradio ist, reicht das LQFP-32 mit interner Referenz allemal.
Um Widerstände, z.B. NTCs, zu messen, brauchst du garkeine
Referenzspannung. Wenn du wirklich alles aus dem ADC rausholen willst,
könnte sogar ein LQFP-100 interessant werden, weil da VSSA, VREF-, VREF+
und VDDA eigene Pins haben.
Ich mag die 0.8mm Pinabstand vom LQFP-32. Mit 0.5mm bleibt zwischen den
Pins eigentlich kein Platz mehr für Lötstopplack. Ja, ein guter
Leiterplattenhersteller kann das natürlich, aber wahrscheinlich auch
nicht mit jeder Farbe. Wenn ich Platinen selber ätzen oder fräsen
wollte, würde ich eher zwei uC im LQFP-32 als einen im LQFP-48 einbauen.
@Bauform B.
Danke für deine gute und ausführliche Antwort.
Ich glaube jetzt ist es mir doch recht Klar.
Mir ist 0.8mm auch lieber als 0.5mm aber so viele muss ich nicht löten
und wenn es im Sinne der Qualität ist würde ich es in kauf nehmen.
In der AN4206
wird nicht ganz auf den LQFP32 eingegangen.
Gibt es da bessere AN?
Hat jemand noch Tipps für gute Filter des VDDA?
Hier hast du Beispielcode für den F303:
http://stefanfrings.de/stm32/stm32f3.html#analog
Da sind Hinweise aus dem Errata und einer Application Note eingeflossen
(welche habe ich vergessen). Ich schätze dass es bei deinem ebenso geht.
Speziell zum Thema ADC gibt's die AN2834 (und bestimmt noch andere).
Der Unterschied zwischen dem LQFP-32 und den größeren ist eigentlich
"nur", wie weit der nächste GND-Pin vom VDDA-Pin entfernt ist. Bei den
großen liegen die direkt nebeneinander, man kann den 10nF also wirklich
kurz anbinden. Der kleine hat nur 2 allgemeine GND-Pins und beide nicht
auf der gleichen Gehäuseseite. Wieviel schlechter das ist, hängt also
auch davon ab, wieviel Strom über die GPIO-Pins fließt und mit welcher
Frequenz.
Wenn du die HAL nutzt, was ich nicht genau rauslesen konnte, dann
brauchst du nur die Kalibrierfunktion aufrufen, kurz warten und dann den
ADC starten. Temperatur und Vref Channel sollten in CubeMX nicht
aktiviert werden. Das hat bei mir nur Müllwerte ergeben.
Ich habe mich vor ca. 2 Wochen damit beschäftigt und auch verglichen.
Vorher waren die ADC Werte bei 3,3 V Betriebsspannung ca. 10 bis 30 mV
genau und jedes Mal etwas anders. Hinterher maximal 1 bis 2 mV
Abweichung. Mit STM32F042F6 (nur VDDA genutzt, allerdings 100000 fachem
Oversampling). Nach 10 h keine Abweichung erkennbar. Alles bei
Raumtemperatur. Vielleicht hilft dir das, ob der einfacherere ausreicht.
Stefan ⛄ F. schrieb:> Hier hast du Beispielcode für den F303:> http://stefanfrings.de/stm32/stm32f3.html#analog> Da sind Hinweise aus dem Errata und einer Application Note eingeflossen> (welche habe ich vergessen). Ich schätze dass es bei deinem ebenso geht.
Danke ich schau mir das an!
Bauform B. schrieb:> Speziell zum Thema ADC gibt's die AN2834 (und bestimmt noch andere).>> Der Unterschied zwischen dem LQFP-32 und den größeren ist eigentlich> "nur", wie weit der nächste GND-Pin vom VDDA-Pin entfernt ist. Bei den> großen liegen die direkt nebeneinander, man kann den 10nF also wirklich> kurz anbinden. Der kleine hat nur 2 allgemeine GND-Pins und beide nicht> auf der gleichen Gehäuseseite. Wieviel schlechter das ist, hängt also> auch davon ab, wieviel Strom über die GPIO-Pins fließt und mit welcher> Frequenz.
Ich habe als Ausgänge nur 2 LED und den DAC.
Danke für deine Antwort.
Heinz M. schrieb:> Wenn du die HAL nutzt, was ich nicht genau rauslesen konnte, dann> brauchst du nur die Kalibrierfunktion aufrufen, kurz warten und dann den> ADC starten. Temperatur und Vref Channel sollten in CubeMX nicht> aktiviert werden. Das hat bei mir nur Müllwerte ergeben.
Ich nehme die Hal immer wenn es irgendwie auf Anhieb funktioniert.
Heinz M. schrieb:> nur VDDA genutzt, allerdings 100000 fachem> Oversampling
Was meinst du damit?
Danke jede Info hilft mir auf jedem Fall!
wear_a schrieb:> Heinz M. schrieb:>> nur VDDA genutzt, allerdings 100000 fachem>> Oversampling>> Was meinst du damit?
100000 Werte addieren und Durchschnitt bilden. Siehe "ADC Oversampling".
Über VDDA wird der ADC versorgt. Den habe ich entsprechend Datenblatt
mit Kondensatoren und 3,3 V bestückt. Vref und ähnliches habe ich bis
jetzt noch nicht verwendet, weil mir der Aufwand zu hoch war mit 2
Spannungsversorgungen.
Oversampling geht kaum mehr, weil das schon ca. 1 Sekunde dauert bis die
Werte da sind, aber bei Spannungsversorgung und Entstörung ADC Eingänge
ist noch viel Potential nach oben.
Heinz M. schrieb:> 100000 Werte addieren und Durchschnitt bilden. Siehe "ADC Oversampling".> Über VDDA wird der ADC versorgt. Den habe ich entsprechend Datenblatt> mit Kondensatoren und 3,3 V bestückt. Vref und ähnliches habe ich bis> jetzt noch nicht verwendet, weil mir der Aufwand zu hoch war mit 2> Spannungsversorgungen.
Wow 100000 Messungen finde ich jetzt schon Heavy.
Wollte eigentlich schon so alle 10ms ein Vernünftiges Messergebnis
bekommen.
Ich hoffe das bekomme ich so in dem Dreh hin!
Oder ist dies unrealistisch?
Heinz M. schrieb:> Mit... 100000 fachem Oversampling
Viel Hilft viel, was? Hast du mal ausprobiert, ob deine Ergebnisse mit
erheblich weniger Messungen genau so gut sind? Ich denke da an 100 oder
so.
Stefan ⛄ F. schrieb:> Viel Hilft viel, was? Hast du mal ausprobiert, ob deine Ergebnisse mit> erheblich weniger Messungen genau so gut sind? Ich denke da an 100 oder> so.
Ich muss es morgen mal ausprobieren;)
Bei den AVR habe ich für sehr stabile Messungen 256 Messungen gemacht
und dann 8mal nach links geschoben
Ja das ist Heavy. Ist immer die Frage was man damit machen will. Mir
ging es darum zu schauen, was mit minimalem Aufwand (Kalibrierung und
Oversampling) möglich ist. Und die Anwendung wofür ich das gerade mache
ist Akku Zellspannungsmessung. Da ist es egal, ob die Messung etwas
länger dauert.
Wollte ich eigentlich später machen mit besserer Spannungsversorgung,
als einem ST-Link Klon. Auf die schnelle nur mal geprüft, welche
Kommastelle stabil ist:
1 fach: 10 mV schwankt um 10 mV
10 fach: 10 mV sind stabil
1000 fach: 1 mV sind stabil
10.000 fach: 0,1 mV schwankt um 0,1 mV
100.000 und 1.000.000 fach: Eher Verschlechterung
50.000 faches Oversampling entspricht in meiner Testschaltung ca. 1
Ergebnis pro Sekunde. Bei den sich daraus ergebenden 500 fachem
Oversampling für 10 ms, sind die 1 mV stabil. Die 0,1 mV wackeln jedoch
sehr stark.
ADC ist auf 14 MHz
Alles andere auf 48 MHz
ADC Cycle Time 55,5
Ja hier hilft nur ausprobieren, weil es von so vielen Faktoren abhängt.
Und wie gesagt, meins ist noch extrem verbesserungswürdig.