Forum: Mikrocontroller und Digitale Elektronik Calibration ADC STM32F334


von wear_a (Gast)


Lesenswert?

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.

von Harry L. (mysth)


Angehängte Dateien:

Lesenswert?

Ich les das so, daß die Funktion die kompl. Kalibrierung erledigt.
Einfach mal Mit und Ohne Testen und die Ergebnisse vergleichen.

von wear_a (Gast)


Lesenswert?

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?

von Alex -. (alex796)


Lesenswert?

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.
1
  /*
2
   * ADC1 setup
3
   */
4
  RCC->AHBENR |= RCC_AHBENR_ADC12EN;
5
  for(;i<255;i++);
6
  i=0;
7
8
  ADC1->CR &= ~ADC_CR_ADVREGEN;
9
  ADC1->CR |= ADC_CR_ADVREGEN_0;
10
  SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;  // Enables SysTick
11
  while(msTicks<1);
12
  msTicks = 0;
13
  SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;  // Disables SysTick
14
15
  ADC12_COMMON->CCR |= ADC12_CCR_TSEN | ADC12_CCR_VREFEN | ADC12_CCR_CKMODE_0;
16
  ADC1->CR |= ADC_CR_ADCAL;
17
  while(ADC1->CR & ADC_CR_ADCAL);  // Wait for calibration to be over

von Harry L. (mysth)


Lesenswert?

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.

von wear_a (Gast)


Lesenswert?

Und was macht man wenn man auf dem selben ADC single und differencial 
Mode braucht?

von Bauform B. (bauformb)


Lesenswert?

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.

von wear_a (Gast)


Lesenswert?

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

von wear_a (Gast)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von wear_a (Gast)


Lesenswert?

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?

von wear_a (Gast)


Lesenswert?

Was sagt Ihr zu meiner Frage aus 
Beitrag "Re: Calibration ADC STM32F334"

Danke für die Hilfe

von Bauform B. (bauformb)


Lesenswert?

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.

von wear_a (Gast)


Angehängte Dateien:

Lesenswert?

@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?

von Stefan F. (Gast)


Lesenswert?

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.

von Bauform B. (bauformb)


Lesenswert?

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.

von Heinz M. (subi)


Lesenswert?

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.

von wear_a (Gast)


Lesenswert?

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!

von Heinz M. (subi)


Lesenswert?

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.

von wear_a (Gast)


Lesenswert?

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?

von Stefan F. (Gast)


Lesenswert?

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.

von wear_a (Gast)


Lesenswert?

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

von Heinz M. (subi)


Lesenswert?

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.

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.