STM32F103, seltsames ADU Verhalten

Dec 25, 2024 Last reply: 1 year ago 20 Replies

Hallo,



ich habe folgendes Phänomen:



Ein STM32F103 liefert mir am ADC unstabile Daten wenn die Ergebnisse zwischen ca. 0x800 und 0x840 liegen. Die Werte springen dann hin und her. Ich konnte das noch nicht komplett aufzeichnen, aber es sieht danach aus, dass es um zwei einigermaßen stabile Werte mit einem Abstand von ca. 0x40 springen.



Hat dazu jemand eine Idee?


Der ADC wird über einen Timer manuell gestartet, also in der Timer-Routine ADC auslesen und ADC neu starten und beim nächsten Timer-Int den Wert wieder auslesen.



Timer-Intervall ca. 10us. Das Intervall hab ich testweise auf 200us erhöht, ohne Effekt.


Das Signal am ADC-Eingang kommt aus einem 10k Poti das von einem digitalen GPIO angesteuert wird damit die Spannung am Poti abgeschaltet werden kann. Die Spannung liegt aber nach dem Einschalten dauerhaft an.


-> das ist sicher nicht optimal, aber wenn das das Problem wäre, müssten diese Instabilitäten auch bei anderen Werten oberhalb 0x840 und unterhalb 0x7FF auftreten, tun sie aber nicht.


-> Poti kann nicht das Problem sein, andere Potis machen dasselbe Problem. Impedanz sollte mit 10k klein genug sein.


-> Stromversorgung ist eine LiIon Batterie mit nachgeschaltetem LDO.



Im Timer werden nacheinander ADC1 und ADC2 abgefragt. ADC1 hängt an dem Poti, ADC2 über einen Spannungsteiler mit 2x 1,5 MOhm direkt am Akku und wird verwendet, um den Ladezustand des Akkus zu überwachen.



Ich habe testweise ADC2 deaktiviert, hat nichts gebracht.



Was mich wundert, ist, dass das Problem nur in der Nähe von 0x800 auftritt.



Hm. 5kOhm Quellimpedanz ist nicht wenig.

ST AN2834 kennst Du?

Bringt ein Kondensator am ADC-Pin nach Masse eine Verbesserung?

cu Michael

Danke für die Antwort, werd ich mir anschauen und probieren.

Aber ich vermute aber eher einen Softwarefehler, irgendwas falsch initialisiert oder so weil das Phänomen nur bei ca. 0x800, also bei halbem Vollausschlag, auftritt.

Ich hab schon überlegt, einen 10k Widerstand in Serie zu schalten um die Werte unter 0x800 zu halten. Die 11 Bit Auflösung würden mir eigentlich ausreichen. Das wäre aber nur eine Notlösung.

Am 25.12.24 um 14:20 schrieb Stefan:

Und der kommt von einer zuverlässigen Bezugsquelle und ist daher keine Fälschung?

Hi Stefan,

+1

Ich kenne sie nicht, weil ich mit der Prozessorreihe nicht vertraut bin. Ich kann mir aber schon vorstellen, was da drin steht, nämlich das, was bei allen drin steht: Die Eingänge sind zwar statisch hochohmig, aber sie laden die S&H-Kondensatoren direkt von dem Eingang weg, weil sich rauscharme Impedanzwandler mit dem Prozess, in dem ein µC konstruiert wird, nicht realisieren läßt. Deshalb macht man den vor den AD-ingang direkt und nach dem Impedanzwandler gehts dann mit einem RC-Glied an den Eingang. Wie dieses sinnvoll gemacht wird, sollte in der entsprechenden Appnote stehen.

In der Größenordnung von 10++ nF bitte.

Halber Ausschlag ist der Bereich, in dem die Spannung am Poti am hochohmigsten ist ;-)

5k reichen schon.

Mach mal. Wenn dann der Effekt auf ca. 0x400 geht, dann springt Dein Poti an der Stelle mechanisch.

Marte

Am 25.12.2024 um 17:38 schrieb Marte Schwarz:

Ja, da steht genau das drin und 10nF ++ müsste auch hinkommen.

Ja, ich war zwischendurch noch nicht wieder in der Werkstatt, aber ich vermute den Fehler auch an der Stelle. Zwischendurch hab ich mir nochmal meine Schaltung und das Layout angesehen. Es ist noch schlimmer wie von Michael und dir vermutet ;-) Ich hab da noch einen 10k in Serie zum ADU Eingang, zusätzlich zum Poti. Den werd ich morgen als erstes raus nehmen.

Nein, das Problem tritt bei halber Versorgungsspannung auf, der ADU hat

12 Bit und geht bis 0xFFF. Der 10k Vorwiderstand würde das dann bei Vollausschlag auf die Hälfte, also 0x7FF reduzieren. Aber ich hoffe mal, dass das Problem die Eingangsimpedanz ist.

Nein, ich habe hier mehrere identische fertige Geräte getestet. Alle zeigen dasselbe Problem.

Danke erstmal für die Hinweise. Ich glaube, das bringt mich weiter.

Gruß

Stefan

So, sieht so aus, dass die Tipps mich tatsächlich weiter gebracht haben. Ich muss das noch intensiver testen, aber es sieht momentan gut aus.

Danke erstmal an Michael und Marte für die Hinweise.

Ich habe zunächst den 10k, der in Serie zwischen dem Potiabgriff und dem ADU Eingang geschaltet war, überbrückt. Das hat das Problem reduziert, aber nicht komplett behoben.

Ein 10nF parallel zum ADU-Eingang hat das Problem dann anscheinend behoben. Am zweiten ADU, wo ich die Akku-Spannung prüfe habe ich noch keinen Kondensator und da gibt es auch noch Probleme und so wie es aussieht über einen größeren Eingangsspannungsbereich. Da liegt die Quellimpedanz auch bei ca. 800k Ohm.

Dass die hohe Quellimpedanz ein Problem sein kann, leuchtet mir ein. Was ich nicht verstehe ist, dass das Problem nur bei knapp über 0x800 bzw.

2048 dez. auftritt. Ich hätte jetzt gedacht, dass es über einen größeren Spannungsbereich Probleme hätte geben müssen. Aber erstmal nicht so wichtig.

Gruß

Stefan

Am 25.12.2024 um 14:20 schrieb Stefan:

Schon mit ausreichend langer Sampling Zeit probiert?

Ja, das war das erste was ich probiert habe. Der ADU kann bis ca. 1 Megasampel pro Sekunde. Ich hatte zunächst ca.

100.000 und dass dann auf ca. 5000 reduziert. Kein Unterschied.

Aber wie weiter oben schon geschrieben: So wie es aussieht war das Problem die zuhohe Ausgangsimpedanz meiner Signalquellen. Das war einmal ein 10k Poti mit zusätzlich 10k in Serie mit dem Abgreifer und ein Spannungsteiler 2x 1,6 MOhm.

Ohne Kondensator am Eingang des ADC gab es an beiden ADUs dasselbe Problem. Ich habe bei beiden jeweils 10nF hinzugefügt und jetzt sieht es gut aus.

Das ist ja ein SAR-ADC, dessen gewichtete (1:2:4:8:...) Kondensatoren abwechselnd auf VREF und Eingangsspannung geladen werden.

Ich hätte jetzt erwartet, daß - die Differenz VIN-VREF die Größe des Effektes bestimmt - beim halben Wert (0x400) der Effekt ebenfalls auftritt, nur halb so stark. - es (im Rahmen der immer kleiner werdenden Kondensatoren) darauf ankommt, wie viele Bits im Ergebnis 1 oder 0 sind, und weniger auf dem absoluten Wert.

cu Michael

Das ist nicht korrekt. Ein successive-approximation ADC schaltet keine Kondensatoren um sondern Bits an einem DAC, also Widerstände.

formatting link
Das Eingangssignal wird schrittweise mit der Ausgangsspannung eines DAC verglichen. Dazu wird beginnend mit dem obersten Bit (das, wo hier das Problem auftritt) das Eingangssignal verglichen. Der DAC schaltet also die halbe Referenzspannung auf den Komparator und speichert das Ausgangsbit. Anschließend wird ein viertel addiert oder subtrahiert, dann ein achtel usw.

Der ADC-Eingang hat aber eine Eingangskapazität und die bildet mit der Impedanz der Quelle einen Tiefpass.

formatting link
Wenn die Impedanz der Quelle zu hoch ist, reicht das nicht, um die Eingangskapazität des ADC vollständig zu laden.

Schaltet man nun einen Kondensator parallel zum Eingang des ADC ist genügend Ladung vorhanden um die Eingangskapazität zu laden.

Ja, den Verdacht hatte ich auch, aber da konnte ich kein Problem feststellen. Kann natürlich sein, dass durch die niedrigere Poti-Stellung die Eingangsimpedanz ausreichend weit gesunken ist. Glaub ich aber nicht, weil da ja noch der 10k in Serie mit dem ADC Eingang war und den zu überbrücken hat das Problem nicht beseitigt. Vielleicht reicht aber dann der zusätzlich Taktzyklus des ADC damit die Eingangskapazität geladen wird.

cu

Stefan

...

Hab den Hinweis erst nicht verstanden. Sampling Zeit ist nicht die Taktrate des ADC sondern die Zeit, die der S&H öffnet.

Das könnte es sein.

Hab gerade mal im Reference Manual nachgeschaut. Es gibt ein Register ADC_SMPR1 wo man die Sample-Zeit einstellen kann. Das geht bis knapp 240 cycles.

Mit den Schaltungsänderungen funktioniert jetzt allerdings alles. Das würde mir aber einige fummelige Lötarbeiten sparen...

Danke für den Tipp

cu

Stefan

Daaaas kommt drauf an ... wie der ADC bzw. dessen S&H intern tatsächlich funktioniert. Da gibt es viele Möglichkeiten. Einige verwenden immer den gleichen (Satz an) Kondensator(en), die mit sehr ähnlicher Eingangsspannung so gut wie keine Ladung nachziehen und deshalb nur bei schnellen Änderungen der Eingangsspannung (z.B. Multiplexerumschaltung) nennenswert Ladung vom Eingang wegschaufeln willen. Andere Topologien ziehen immer die Ladung der S&H-Kondensatoren leer, egal, was am EIngang anliegt. Wieder andere machen das wieder anders. Ohne Kenntnis des konkreten Innenaufbaus lässt sich da herzlich wenig schließen. In den Datenblättern vernünftig dokumentierter ADCs erwartet man daher, dass wahlweise die maximale Ladungsmenge oder zumindest die S&H-Kapazitäten spezifiziert sind oder zumindest eine Referenzbeschaltung, wie man die Eingänge zu bedienen hat, um auf die nominalen Genauigkeiten zu kommen.

Marte

Hi Stefan,

So kann man das machen. Aber es gibt noch viel mehr Möglichkeiten, der sukkzessiven Annäherung. Das geht durchaus auch kapazitiv, was auf CMOS-Prozessen durchaus sinnvoller umzusetzen ist, wenn man Kondensatoren einplant, als Widerstände. Letztere sind im IC eher anspruchsvoller genau in den Verhältnissen abzubilden.

Das ist deutlich zu simplifiziert, um den Prozess und das Fehlerbild sinnvoll erklären zu können. Mir ists jetzt zu spät, das für Dich herauszupopeln. Such mal nach capacitive successive approximation ADC.

OK:

formatting link
formatting link
formatting link
formatting link
...

Schau mal unter

formatting link
Figure 10 ff und Du wunderst Dich nicht mehr ;-)

Marte

Am 26.12.2024 um 22:52 schrieb Marte Schwarz:

das klingt eher nach Dual-Slope und nicht nach SAR

Hi Stefan,

Nicht wirklich. Lies Dich durch die Links in meinem anderen Post und Du weißt, was Michael meinte.

Marte

Nicht zwingend. In der bereits verlinkten Application Note beschreibt ST, wie ihre SAR-ADCs arbeiten:

formatting link
Da ist kein DAC beteiligt, sondern nur geschaltete Kondensatoren.

Wobei ich jetzt sehe, daß die nur beim Start der Umsetzung alle einmal gemeinsam auf VIN geschaltet und geladen werden, beim weiteren stufenweisen Umschalten ist der Eingang abgetrennt. Das Verhalten am Eingang sollte also eigentlich dem "klassischen" SAR-ADC mit einer einzelnen Sample/Hold-Stufe entsprechen.

cu Michael

Danke, das ist deutlich besser verständlich als die ST-AN2834.

cu Michael

Das gibt es bei ST - AN2834 zusammen mit dem ADC-Kapitel im Datenblatt beantworten das im Prinzip (STM32F103x8 Datasheet, Table 46ff) - je nach Timingeinstellungen kommen da maximale Eingangswiderstände zwischen 50k und

0.4k heraus.

cu Michael

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required