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.
Ich les das so, daß die Funktion die kompl. Kalibrierung erledigt. Einfach mal Mit und Ohne Testen und die Ergebnisse vergleichen.
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.
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 |
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.
Und was macht man wenn man auf dem selben ADC single und differencial Mode braucht?
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.
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.