Mein 12bit ADC welchen ich in JTag proVision programmiert (Python) habe, ist sehr ungenau.
z.B. wenn ich eine Spannung von 2.70V habe misst er 2.68V oder wenn ich eine Spannugn von 0.303V habe misst er 0.247V. Ich habe Toleranzen von 20-70mV.
Wie kann ich die Genauigkeit per software präziser machen?
Mit der Sampling-Time habe ich auch schon gespielt, jedoch ohne erfolg.
als erstes solltest du mal was zu deiner Eingangsbeschaltung sagen und zur Beschaffenheit deiner Spannungsquelle.
Weiterhin wäre interessant woher du deinen Referenzwert hast, also mit welchem Messgerät ermittelt?
Das ist nicht sehr ungenau, sondern innerhalb der erwartbaren Toleranzen.
Der wohl einfachste und üblichste Weg, das zu korrigieren, ist ein einfacher Zweipunkt-Abgleich.
Also 0.3V anlegen und den gemessenen AD-Wert als Punkt speichern. Dann 2.7V anlegen und den gemessenen AD-Wert als zweiten Punkt speichern. Die rechnerischen AD-Werte stimmen eigentlich nie mit der Realität überein.
Dann hast du die exakten Werte für 0.3 und 2.7V und alles dazwischen und darüber hinaus lässt sich meist ausreichend genau inter- bzw. extrapolieren.
Das ganze muss allerdings für jeden Controller aufgrund der erwartbaren Bauteilstreuung individuell gemacht werden.
Wichtig ist auch eine stabile, gefilterte Referenzspannung für den AD-Wandler
Mit der Sampling-Time habe ich auch schon gespielt, jedoch ohne erfolg.
Schau dir im Datasheet die Tabelle "Maximum ADC RAIN" an. Je höher der Innenwiderstand/Impedanz des Signals, desto langsamer musst du samplen, und die entsprechenden Einstellungen kannst du dieser Tabelle ablesen.
Vref = 3.13-3.35V / typ = 3.24V.
Die Referenzwerte habe ich zeitgleich mit einem Multimerter (Fluke 87)
gemessen.
Und dabei welchen Wert erhalten?
wenn ich eine Spannung von 2.70V habe
Wo hast du diese Spannung? Direkt am µC-Pin?
Ich habe Toleranzen von 20-70mV.
Sind das staische Abweichungen oder zappelt der Wert?
Wie kann ich die Genauigkeit per software präziser machen?
Mach mal einen Schritt zurück: wie sieht denn die Hardware aus (Beschaltung und Layout)? Denn die beste Schaltung kann durch ein lausiges Layout schlecht werden.
Wie kann ich die Genauigkeit per software präziser machen?
Welche "Genauigkeit" brauchst du denn? Was ist die Anwendung? Wie gut und stabil sind die Quellen der Analogwerte?
Das ist nicht sehr ungenau, sondern innerhalb der erwartbaren
Toleranzen.
Naja, die ADCs der STM32 sind schon ziemlich gut (anders als z.B. beim ESP32), damit sollte man schon von Haus aus ohne manuelle Kalibrierung bessere Ergebniss erzielen können. Aber man muss ihn eben richtig bedienen und die Werte richtig interpretieren.
Meine Sampling-Time habe ich nun wieder auf 7.5 clock cycles welche mir empfohlen wurde.
Lothar M.
Und dabei welchen Wert erhalten?
=> 0.303V mit dem Mulimeter und 0.247V mit dem ADC
Wo hast du diese Spannung? Direkt am µC-Pin?
=> ja
Sind das staische Abweichungen oder zappelt der Wert?
=> sind eig immer die selben abweichungen und verändern sich nicht gross.
bei dem pin mit 0.303V sind es immer so 55mV und bei andern mit 2.7V immer so 20mV.
Mach mal einen Schritt zurück: wie sieht denn die Hardware aus
(Beschaltung und Layout)? Denn die beste Schaltung kann durch ein
lausiges Layout schlecht werden.
=> Da das Layout von Fachleuten in meiner Firma gemacht wurde und über viele Versionen verbessert wurde sollte dies eig nicht das Problem sein.
Bei meiner 2ten Antwort sollte jedoch noch ein screenshot vom design der Speisung des uC angehängt sein.
Welche "Genauigkeit" brauchst du denn? Was ist die Anwendung? Wie gut
und stabil sind die Quellen der Analogwerte?
=> Grundsätzlich teste ich mit der Software alle Eingäge des uC und vergleiche sie mit den soll Werten welche ich erwarte. Dafür habe ich eine gewisse toleranz in welcher der wert liegen muss. Jedoch zb bei der abweichung von 55mV kann ich die toleranzen nicht mehr einhalten und der test failt obwohl die echte Spannung stimmen würde.
Meine Sampling-Time habe ich nun wieder auf 7.5 clock cycles welche mir
empfohlen wurde.
Empfohlen von wem? Was für eine Impedanz hat deine Quelle, wo kommt die Spannung her? Wenn da z.B. ein Spannungsteiler ist musst du die Sampling Time erhöhen.
Niklas G
Ist aber direkt mit Vdda verbunden oder? Per Spannungsregler erzeugt?
=> Ja und ja
Wenn deine Versorgungsspannung schwankt sind dann natürlich auch die Messwerte falsch (sind ja relativ zu Vref). Aber das Multimeter misst natürlich absolut. Es kann sehr helfen, die Werte mit der internen Referenz zu verrechnen (diese immer mitmessen und auf den ADC-Wert aufmultiplizieren).
Ja die spannungen kommen alle von einem Spannungteiler. Meist mit 100k
und 12k
Ziemlich groß. Da ist so eine kurze Sampling Zeit vermutlich zu kurz.
Tatsächlich ist es laut der Tabelle im Datasheet gar nicht möglich, bei 100k Eingangsimpedanz 12bit Genauigkeit zu erzielen, nur 10bit bei Sampling time 8354ns. Am Besten wohl einen Impedanzwandler dazwischen schalten...
100k in Reihe zum ADC-Eingang und 12k gegen GND? Ohne weitere Maßnahmen ist das vermutl. viel zu hochohmig für den ADC Eingang.
schau dir mal Datenblatt Seite 108 an.
wenn du recht langsame Signale erfasst:
Setz mal testweise einen 1nF Kondensator an einen ADC Eingang gegen GND. Wenn es dann deutlich besser wird dann weisst du das deine Eingangsbeschaltung anders dimensioniert werden muss.
Schaltungstechnische Platzierung und Typ der Schutzdioden wäre durchaus interessant und wichtig zu wissen da dir in einigen Fällen Leckströme durchaus beachtliche Fehler (und das zu allem Überfluss dann auch noch extrem temperaturabhängig) einbringen können.
Sehr lesenswert ist auch Kapitel "15.3.32 Monitoring the internal voltage reference".
Der Name ist evt. irreführend, man kann die ADC-Referenz nicht zwischen interner und externer (VREF- oder VDDA-Pin) umschalten. Die interne ist einfach eine 1.23V Spannungsquelle, die man auf Kanal 18 messen kann. Die wird bei der Chip-Produktion kalibriert und das Ergebnis ins Flash geschrieben (VREFINT_CAL und VREFINT_DATA). Mit etwas Rechnerei bekommt man die maximale Genauigkeit. Jedenfalls bei Zimmertemperatur, 100ppm/K ist leider nicht so toll.
Laut Datasheet "Converting a supply-relative ADC measurement to an
absolute voltage value" ist 4095 korrekt in der Formel
Ja, ich habe auch schon andere Fehler in Datenblättern gefunden. Man glaubt nicht, was Praktikanten da so alles reinschreiben. Das war auch vor 12 Jahren im Beitrag "Re: 1023 oder 1024" schon so.
Ich sags mal so: wenn ich ein Programm bewerten muss und sehe da 1023, 2047 oder 4095 (eben 2^n-1) beim ADC, dann denke ich mir "Obacht, da sind sicher auch noch andere Fehler drin!"
Leider hab ich immernoch
die Abweichung. Resultat mit 181.5 = 0.245V; Resultat mit 7.5 = 0.244V
Mach mal eine kleine Versuchsreihe mit >=5 verschiedenen Spannungen über den ganzen Bereich und nenne die Rohwerte aus dem ADC-Register und die dazugehörige direkt am ADC-Pin per Multimeter gemessene Spannung. Verwende nicht jeweils den ersten ADC-Wert sondern lasse einige ADC-Konvertierungen durchlaufen nach dem Anlegen der jeweiligen Spannung. Prüfe per Oszilloskop ob die Spannung auch konstant ist und nicht irgendwie mit HF überlagert. Mach mal eine Trendlinie in Excel...
Da ist keine Tendenz erkennbar, ausser dass der ADC Wert grob zum Multimeter passt (der einzige Ausreißer ist der mittlere Wert). Lassen sich die Messungen reproduzieren?
Da ist keine Tendenz erkennbar, ausser dass der ADC Wert grob zum
Multimeter passt (der einzige Ausreißer ist der mittlere Wert). Lassen
sich die Messungen reproduzieren?
Da ist offenbar ein Offset von 150mV drin. Nur der letzte Messwert passt. Du misst mit dem Multimeter schon direkt am uC? Minusklemme direkt am Pin 20 und Plusklemme am ADC-Pin?
Besser wäre einfach die Differenz (= Abweichung) der beiden über der
Multimeter-Spannung.
Die ist bei einer Eingangsspannung ungleich 0V immer etwa gleich und ca. 70mV. Im ähnlichen Bereich 60mV ändert sich lustigerweise auch die Vref.
Warum schwankt die so sehr? Was passiert da in deinem System? Was passiert, wenn du da mal eine ordentlich stabile Vref anlegst? Ist da ein Bug im Layout?
Dann musst du jetzt erstmal feststellen, was ist der Grund für diese Abhängigkeit der Referenzspannung von der Eingangsspannung ist. An den bisher bekannten Informationen kann man das nicht erkennen. Ändern sich die 3V3 dxer Versorgung? Fällt Spannung am R167 ab? Verschiebt sich das GND-Potential?
Seite 3, Tabelle: Die Zenerspannung kann bei einem 3.3V-Typ zwischen 3.14 und 3.47 schwanken und ist natürlich auch temperaturabhängig. Und bei dieser Zenerspannung fließen schon 5 mA.
Du hast ja keine Schaltpläne geliefert, aber ich kann mir vorstellen, dass es irgendwas in der Richtung ist.
Nimm mal eine BAV199. Pico-Ampere Diode mit sehr kleinem Leckstrom.
Meine Aufgabe ist es eine Testinfrastruktur mit Jtag für ein fertiges PCB zu erstellen. D.h. ich kann keine Modifikationen an der Hardware vornehemen. Ich muss es irgendwie mit der Software regeln.
D.h. ich kann keine Modifikationen an der Hardware vornehemen. Ich muss
es irgendwie mit der Software regeln.
Und was wenn das Problem in der Hardware liegt, z.B. instabiles Vref? Klar kann man versuchen so was zu "wegkalibrieren" aber da hat man keine Garantie dass sich das Problem immer gleich verhält, die Abweichung könnte z.B. durch EMI beeinflusst sein...
Das ist kein Screenshot, sondern ein Foto von einem Bildschirm. Und das beste komprimierende Format für Fotos schlechthin ist JPEG.
Ein Screenshot wäre es, wenn du einen USB-Stick in dein Oszi stecken und auf die passende Taste drücken würdest. Dafür wären GIF und PNG wieder die richtigen Formate.
Ja die spannungen kommen alle von einem Spannungteiler. Meist mit 100k
und 12k.
Bei einer so hochohmigen Quelle darfst du dich über komische Effekte nicht wundern (z.B. Kanalübersprechen). Kondensatoren an den Eingängen hast du aber schon, oder?
Das ist kein Screenshot, sondern ein Foto von einem Bildschirm.
Hab das Bild mit dem Handy gemacht, da mein USB Stick nicht erkannt wurde. Habes dan per Mail auf den PC geschickt und dan einen Screenshot davon gemacht. Wurde dan Automatisch so gespeichert.
(-_-)
Bei einer so hochohmigen Quelle darfst du dich über komische Effekte
nicht wundern (z.B. Kanalübersprechen). Kondensatoren an den Eingängen
hast du aber schon, oder?
Ja, habe in einer früheren Nachricht ein Bild von der Eingangsschaltung geschickt. Mit 2 Kondensatoren.
Du betreibst den ADC bzw. den ganzen STM32 ja außerhalb der Spezifikation. Heißt also dass die Infos aus dem Datasheet und somit auch das Wissen der Leute hier nicht helfen, weil sich das natürlich alles auf das Verhalten innerhalb der Spezifikation bezieht.
Daher hilft nur: Den STM32 selbst characterisieren:
Mache eine große Versuchsreihe (viele Millionen Messwerte) von allen möglichen Eingangsspannungen, bei allen möglichen Temperaturen, allen möglichen Variationen der Störungen der Versorgungs&Referenz-Spannung (schwierig zu quantifizieren - je nachdem wie der Rest der Schaltung sich verhält wird es vermutlich viele mögliche Zustände geben), allen möglichen Alterungszuständen des STM32, und natürlich Bauteilstreuung über viele einzelne STM32-Exemplare. Dann kannst du ein mathematisches Modell aufstellen, wie die Abweichung von all diesen Variablen abhängt. Du muss statistisch prüfen, ob dieser Zusammenhang auch konsistent ist, oder ob es große Zufalls-Streuungen gibt. Du musst mit ST klären, ob die mal das Design des STM32 ändern, weil du dann diese Aufstellung natürlich wieder von vorne machen musst. Das werden die dir vermutlich nur verraten wenn du dein paar Millionen im Jahr kaufst.
Vielleicht kannst du dann eine Funktion schreiben, die in Abhängigkeit der Temperatur, Betriebsstunden des STM32, Zustand der Gesamtschaltung, und einer Initial-Kalibrierung den richtigen Wert aus dem Messwert herausrechnet.
Insbesondere die Abhängigkeit von den Störungen dürfte sehr komplex sein; je nachdem wie viel Strom der Rest der Schaltung aus dem Schaltregler zieht könnte das Störspektrum verändern und somit deine Messwerte beeinflussen. Diesen Strom müsstest du also auch irgendwie messen.
Das könnte vom Umfang her in Richtung einer Doktorarbeit gehen. Aber sicherlich billiger als die Schaltung zu korrigieren.
Es wurde schon x mal vorgeschlagen, die interne Spannungsreferenz zu messen, ich sehe aber nirgends ein Ergebnis.
Dazu vielleicht auch mal einen ADC-Pin mit GND verbinden und den messen, ob das Ergebnis dann auch einen Offset hat.
Wenn der STM32 einen großen Offsetfehler hat (was ich eigentlich nicht glaube), könnte der "verrechnet" werden. Sowas musste ich mal bei einem PIC mit bekanntem (erratum) üblen Offsetfehler machen.
Hat der STM32 ADC zufällig auch einen differenziellen Modus, der ausversehen aktiviert wurde?
Nicht die normalen SAR-ADCs, das können nur die Sigma-Delta-ADCs.
Bei den nicht so ganz alten STM32 Typen gibt es viele Typen mit differentiellen Eingang. Allerdings muss die Gleichtaktspannung nahe bei VREF/2 liegen. Ziemlich unpraktisch...
Wie bauformb schon zweimal gesagt hat, führe die interne Kalibierungsfunktion aus, so wie es im Datenblatt geraten ist und dann ist der falsche Offset weg und der adc ist fortan genau.
Dies ist die aktuelle Schaltung.
Schutzdioden habe ich weggelassen
Wo ich das lese... Hast du separate Schutzdioden platziert?
Ich hatte einmal das Problem, dass ich dem STM am Analogeingang eine eigene Schutzdiode gegen VDDA spendiert habe, da dieser von einem opamp mit 10V Versorgung gespeist wurde und ich im Fehlerfall ein Abrauchen des Eingangs verhindern wollte. Waren also 1 kOhm in Reihe zum Signal und dann die Diode nach VDDA.
Ich habe damals nicht nachgedacht und tatsächlich hat mir der Leckstrom der Diode (bei Schottky noch viel größer als bei normaler Si/Si Diode) den Eingang so verzogen, dass eine sinnvolle Messung nicht mehr möglich war und sich auch über Temperatur stark ändert.
und Fig.2 auf Seite 3 gibt das einen Sperrstrom von unter 10nA pro Einzeldiode bei 25°C. Ich denke, das sollte vernachlässigbar sein.
Probiere einfach mal, den Spannungsteiler um Faktor 10 niederohmiger zu machen. Also 100k -> 10k und 12k -> 1.2k.
Alternativ besorge Dir ein Nucleo Demoboard mit einem ähnlichen Prozessor und teste Deinen Code dort. Dort sind alle Pins auf Stiftleisten rausgeführt, so dass Du einfacher experimentieren kannst als auf einem fertig gelayouteten Board, wo noch etliches mehr drauf ist.
Gibts bei Mouser für 18.80€. Eine einzige Arbeitsstunde von Dir kostet wahrscheinlich mehr. Diese Boards sind dafür gemacht, dass man einfach Code und verschiedene Beschaltungen ausprobieren kann. Und da diese Boards vom Chiphersteller kommen, kannst Du davon ausgehen, dass die auch funktionieren. Schaltpläne und fertige CubeMX Konfigurationen und alles andere gibts zum Runterladen.