Forum: Mikrocontroller und Digitale Elektronik STM32 ADC Verhalten eigentümlich


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Norbert (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe auf dem STM32F407 Discovery Board eine Testsoftware laufen,
die per DMA jeweils 256 Werte eines ADC Kanals liest und in einem array 
speichert.

Für diese 256 Werte werden jeweils Mittelwert, Min und Max ermittelt.

Dieser Vorgang wird in einer Schleife 100 mal durchgeführt für jeden der 
acht möglichen Sampletime Wert (3 15 28 56 84 112 144 480).
Somit ergeben sich 800 Werte.

Anschließend werden die Ergebnisse übertragen und mit GNUplot 
ausgegeben. Auf der x-Achse entsprechen die 100er Bereiche jeweils einem 
Sampletime Wert.

Der ADC Eingang ist mit jeweils 22kΩ an Vdd und Gnd gebunden (einfacher 
Spannungsteiler) Die Widerstände haben 0.1% Toleranz.
(Bei 10000 Meßwerten mit Sampletime 480 ergibt sich ein Mittelwert von 
2048.11)

In der scan1 Grafik ist zu erkennen, das die Widerstände zu hochohmig 
sind um den ADC bei der kürzesten Sampletime (3) zu versorgen. 
Sampletime (15) ist nahezu OK, ab Sampletime (28) ist es OK. Bis hierhin 
alles kein Wunderwerk.

Die Variationen (min/max) wollte ich mittels eines kleinen Kondensators 
parallel zu R2 dämpfen, so wie es in der guten alten AVR Zeit immer 
wunderbar funktioniert hatte.

Das Ergebnis ist in der scan2 Grafik zu sehen.
Mich wundert sowohl der schlechtere Mittelwert bei allen Sampletimes 
(außer vielleicht 480),
aber noch viel mehr die sehr deutlich höheren min/max Abweichungen.

Hat jemand eine Erklärung für diese Phänomene?

von Der (Gast)


Lesenswert?

Norbert schrieb:
> Die Variationen (min/max) wollte ich mittels eines kleinen Kondensators
> parallel zu R2 dämpfen, so wie es in der guten alten AVR Zeit immer
> wunderbar funktioniert hatte.

Hattest du damals auch 12 Bit?
Der Kondensator muss mit einer möglichst kurzen Leitung von AGND zu 
ADC-IN angeschlossen werden. Hast du ein Bild vom Aufbau?

von Norbert (Gast)


Lesenswert?

Das die (von mir genutzten) AVRs nur 10bit Auflösung hatten, ist mir 
klar.
Die zehn Bit waren aber stabil bis aufs letzte LSB und damit deutlich 
'besser' als wenn ich nur die 10 höchsten Bits dieses Controllers nähme.

Kondensator steckt übrigens direkt an der Pinleiste P1. Näher geht 
nicht.
Das ist aber egal, da die Messung ohne Ko bei gleichem Aufbau wesentlich 
stabiler zu sein scheint. Über dieses Phänomen wundere ich mich am 
Meisten.

Unterschiedliche Kondensator(typen) ändern nur unwesentlich etwas am 
Bild.

von Sascha (Gast)


Lesenswert?

Hallo,
ich habe den 12 Bit ADC des STM32F103 getestet, der rauscht auch, aber 
der Drift ist ungewöhnlich.

Der Widerstand nach VCC sollte an +Vref angeschlossen werden und mit 
externer Vref betrieben werden. Ich habe damals einen MAX6166 verwendet.
Sonst kommen Spannungsschwankungen und Rauschen des Spannungsreglers 
dazu.
Die Widerstände waren bei mir 10K und der Abblockkondensator 100nF.
Aber man sollte sich mal die Rauschspannung der Widerstände ausrechnen, 
je hochohmiger desto schlimmer.....
Sonst muss ein geeigneter OP verwendet werden, wenn die Signale 
schneller werden sollen.

Die 1 Mega Sample Geschichte bringt natürlich nichts, aber durch 
Software Oversampling bekommt man doch ganz gute Ergebnisse hin.

Wenn man sehr hochwertige ADC Werte haben will geht es halt nur mit 
externem ADC.

PS. im moment teste ich den SDADC des STM32F373, ich hoffe ich komme auf 
14 Bit !?!?

Gruß Sascha

von Der (Gast)


Lesenswert?

Kannst du die Werte ohne Mittelung anschauen? Vielleicht hast du eine 
Einstreuung drauf, die periodisch ist. Oder es sind nur einzelne Peaks, 
die sich mit einem Medianfilter entfernen lassen.

von Norbert (Gast)


Angehängte Dateien:

Lesenswert?

@Sascha

Vref ist leider nicht auf den Steckleisten herausgeführt, ist aber mit 
Induktivität und Kondensator auf dem Board gefiltert und abgeblockt.

Um Auswirkungen über unsaubere Vdd zu vermeiden, habe ich zum Test3 mal 
eine Primärzelle gescannt. Ergebnis ist schlimmer als mit 
Spannungsteiler über die zwei 22kΩ Widerstände.


@Der (Gast)
Test4 zeigt 10.000 conversions (DMA/längstmögliche Sampletime)
Egal wie weit man in die Daten hineinzoomt, es bleibt beim Rauschen.


Ich werde mich wohl von den Qualitäten der AVR ADCs verabschieden.
Wenn man von den 12bit nur die obersten zehn(oder neun) nimmt, so sehen 
die Werte auch ohne Oversampling OK aus.

Wenn es deutlich langsamer reicht und man >= 256 Werte 'oversampled', so 
kommt man allerdings auf recht saubere 13-14bit Auflösung.

Linearität habe ich allerdings noch nicht getestet.

von Sascha (Gast)


Lesenswert?

Hallo Norbert, ja der 12 Bit ADC ist bei allen Controllern die ich kenne 
nicht gerade toll. Ich brauche die ADCs glücklicherweise nur für 
langsame Signale, somit kann ich damit gut leben. Die Linearität ist 
gut, wenn man unten etwas auslässt. Der erste ATxmega war bis jetzt sehr 
grausam. STM32 geht gerade so.
Mit dem Analog Device ADuC7026 habe ich die besten Erfahrungen gemacht.

Das sieht für mich auch eher alles nach einem 10+ Bit Wandler aus. Ich 
vermute da steckt nur Marketing dahinter, weil ein 10Bit Wandler sich 
Heute nicht mehr verkaufen lässt.

Gruß Sascha

von Gerd E. (robberknight)


Lesenswert?

Ich hab den ADC von meinem STM32F4DISCOVERY noch nicht getestet.

Wenn ich mich richtig erinnere, hatte branadic hier vor einiger Zeit im 
Forum ein Rauschmesssystem auf Basis des STM32F4 und einem Vorverstärker 
aus einer Linear-Appnote aufgebaut. In seinen Ergebnissen (oder genauer 
dem FFT-Output davon) waren ein paar Störfrequenzen drin, ansonsten sah 
daß aber besser als Deine Ergebnisse aus. Vielleicht liest er ja mit und 
kann ein paar Tips geben.

Probier auf jeden Fall noch mal nen Opamp davorzusetzen.

Ansonsten strahlt bei Dir wohl irgendwo nen Störer rein.

von Fritz (Gast)


Lesenswert?

Ich würde auch ausprobieren, den Ko statt zwischen Eingang-GND zwischen 
Eingang-VDD zu schalten, was sich da ergibt.

von Norbert (Gast)


Lesenswert?

@Gerd E.

> Probier auf jeden Fall noch mal nen Opamp davorzusetzen.
Muß mir mal einen passenden 3V R2R OpAmp raussuchen und testen.

> Ansonsten strahlt bei Dir wohl irgendwo nen Störer rein.
Kann ich einigermaßen ausschließen. (Es sei denn, Metallkästen hälfen 
nicht mehr). Die Anschlussleitungen sind - wenn ich dem Scope Glauben 
schenken darf - soweit sauber.

@Fritz
Kos hatte ich parallel zu R1, R2 und zu Beiden. Keine Änderung


All das erklärt aber nicht, wieso der ADC nachweislich besser arbeitet,
wenn kein Abblock-Ko angeschlossen ist.

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

>Mit dem Analog Device ADuC7026 habe ich die besten Erfahrungen gemacht.

Kann ich bestätigen, allerdings für den ADUC7024. Analog Device scheinen 
die einzigen zu sein, die einen 12bit ADC auf einem Controller sauber 
hinbringen.

Grüsse

von Uwe B. (derexponent)


Lesenswert?

Hi Norbert,

von STM gibt es eine PDF wo das "Phänomen" externer Kondensator
an einem AIN-Pin vom STM32 beschrieben wird

https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Attachments/22412/2012_STM32%20Technical%20Updates%20-%20Issue%201.pdf

siehe Seite 59 und folgende

Gruss Uwe

von Norbert (Gast)


Lesenswert?

Uwe B. schrieb:

> von STM gibt es eine PDF wo das "Phänomen" externer Kondensator
> an einem AIN-Pin vom STM32 beschrieben wird


Hi Uwe,

zuerst einmal: Vielen Dank für den Link.

Ein interessantes Dokument, das wird in die Sammlung integriert ;-)

Aber es lässt mich erstaunt zurück.
Da ich z.Z. nur einen einzelnen Kanal teste,
fällt 'channel-to-channel crosstalk' schon mal weg.
Des weiteren schreiben sie(ST) wiederholt, das der (interne)sample 
Kondensator Cs nicht entladen wird.
>> ...then the charge left on the sample capacitor by the previous conversion of a 
channel...

Da der externe Cext statisch auf einem festen Spannungspegel liegt und 
der interne Cs nicht entladen wird, sollte es auch keinen 
'charge-sharing process between Cext and Cs' geben.

Die 'sample time' pro Messung betrug beim Test im Maximum 480 cycles. 
Damit sollte sich auch ein teilentladener Cs hinreichend stabilisiert 
haben. Es gab praktisch keinen Unterschied im Rauschen bei 'sample time' 
28 und 480. Alles sehr mysteriös.

Der komplette analoge Teil sollte im Gleichgewicht sein, alles deutet 
auf (intern eingefangenes) Rauschen hin.

Bleibt wohl bei 12bits gekauft, 9-10bits genutzt. ;-)

von Gregor B. (Gast)


Lesenswert?

Norbert schrieb:
>
> Aber es lässt mich erstaunt zurück.
> Da ich z.Z. nur einen einzelnen Kanal teste,
> fällt 'channel-to-channel crosstalk' schon mal weg.

um Channel-To-Channel-Crosstalk auszuschließen, musst Du die unbenutzten 
Eingänge niederohmig abschließen.

von Norbert (Gast)


Angehängte Dateien:

Lesenswert?

Gregor B. schrieb:

> um Channel-To-Channel-Crosstalk auszuschließen, musst Du die unbenutzten
> Eingänge niederohmig abschließen.

Wieso, wenn der Input Muxer noch nicht einmal dorthin schaltet?

von Gerd E. (robberknight)


Lesenswert?

Norbert schrieb:
>> Ansonsten strahlt bei Dir wohl irgendwo nen Störer rein.
> Kann ich einigermaßen ausschließen. (Es sei denn, Metallkästen hälfen
> nicht mehr). Die Anschlussleitungen sind - wenn ich dem Scope Glauben
> schenken darf - soweit sauber.

Wie sieht es denn mit der Spannungsversorgung aus? Wie mit der 
Datenübertragung zum PC?

Ist beides galvanisch isoliert?

Als ich das letzte Mal Ärger mit Rauschen hatte, hab ich die Versorgung 
aus 2 Batterien gezogen (Digitalteil und Analogteil separat) und die 
Datenübertragung per UART über 2 Optokoppler (6N137) gemacht. Das ganze 
hübsch in ne Keksdose und es war Ruhe.

von Norbert (Gast)


Lesenswert?

Gerd E. schrieb:

> Wie sieht es denn mit der Spannungsversorgung aus? Wie mit der
> Datenübertragung zum PC?

5V aus linear geregeltem Netzteil, glatt wie ein Seidentuch;-)
wird auf dem Board noch einmal auf 3.0V geregelt.

> ... galvanisch isoliert? ... Datenübertragung per UART über 2 Optokoppler 
(6N137)

Identisch hier! Datenübertragung über 6N137 - UART-USB Kabel.

> Als ich das letzte Mal Ärger mit Rauschen hatte, hab ich die Versorgung
> aus 2 Batterien gezogen (Digitalteil und Analogteil separat)

Ist ein Discovery Board, die Möglichkeiten sind limitiert.

von Sascha (Gast)


Lesenswert?

Hallo,
so ich habe heute den STM32F373 16Bit SDADC zum laufen gebracht und 
getestet.

Test1:
72MHz CPU, SADC3 mit externer Vref 2.5V und single Input ohne 
Mittelwerte im low clock mode (1.5MHz) ergab bestenfalls ein ca. 12Bit 
ADC. Muss aber dazu sagen, mein Board ist eher bescheiden, was die 
Signalrauschfreiheit angeht, da ich einen getakteten DC/DC Wandler drauf 
habe.

Test2:
32MHz CPU, SADC3 mit externer Vref 2.5V und single Input mit 128 
Mittelwerten komme ich auf gute 14Bit. Das würde sich auch mit der 
Angabe von ST decken.

Ich bin mir sicher, dass noch mehr rauszuholen ist, wenn man das Board, 
die Analogseite symetrisch macht, und vor allem den Prozessor langsamer 
taktet
(zumindest bei der Messung).

Also mein Fazit: der STM32F373 ist ein echter Tip für das Geld 3 x 16Bit 
SDADC und noch eine FPU ......


Gruß Sascha

von Harald (Gast)


Lesenswert?

Hallo,

ich habe mir ein STM32373C-EVAL Board geholt, um in die Welt der 
Mikrocontroller rein zu kommen. Allerdings habe ich mit der 
Programmierung nicht so viele Erfahrungen gemacht.
Den USB-Treiber und Tasking-VX v.4.4.1 habe ich installiert und die 
ersten "Testprogramme" erfolgreich geflasht und getestet.
Jetzt würde ich gerne ein Poti an den Delta-Sigma-Wanlder anschließen 
und damit weiter tesetn. Würdest du die C-Codes veröffentlichen, die du 
benutzt hast, oder könntest du mir sagen, wo ich weitere 
Beispielprogramme finde?

Vielen Dank im Voraus.

von Sascha (Gast)


Lesenswert?

Hallo, also wenn du mich meinst, ich programmiere nicht in C.
Aber der SDADC leuft mit einem DSP-Filter sogar mit 16 Bit sehr gut. 
Sogar auf 1 LSB genau, besser als das Datenblatt angibt.
Allerdings darf man die CPU nur noch mit 8MHz Takten.
Der Chip ist auch bei 8MHz noch richtig schnell, das macht richtig Spaß.
Und der Floating Point Coprozessor echt klasse.
Habe alle 3 SDADC zu 100% im Einsatz.
Fehler des SDADC ist seine Grundgenauigkeit, aber das kann man 
Linearisieren mit etwas Software. Da er keine Gain Kalibration hat, 
trifft er auch nicht Vref, aber wie gesagt das ist alles kein Problem 
mit etwas Software.
Der Aufbau des SDADC was die Register betrifft ist klasse gemacht und 
auch ohne DMA Unterstützung toll zu bedienen. Um gute Ergebnisse zu 
bekommen muss man sich damit auch etwas tiefer beschäftigen, als nur mal 
kurz eine App. zu benutzen.

Mein Fazit, der STM32F373 ist sein Geld wert.


Gruß Sascha


PS. ein Potie bei 16Bit ist sinnlos, was willst du da noch sehen? 
Temperaturdrift des Poties?

von Harald (Gast)


Lesenswert?

Momentan suche ich nach weiteren Programmen um die Funktionen des ADC 
und SDAC besser kennen zu lernen.

Durch Drehen am Poti kann ich direkt feststellen, ob sich was am ADS 
ändert oder nicht ohne Veränderung am Aufbau. Für den späteren Gebrauch 
würde ich was anderes verwenden.

von Sascha (Gast)


Lesenswert?

Hallo Harald,
ich habe ein prezisions Potie mit 10 Gängen genommen und habe ein 30cm 
langes Lineal festgemacht, damit ich sehr fein drehen kann. Aber das war 
auch noch nicht sehr erfolgreich.

Die Nullpunkt Kalibration des Wandlers geht reht gut, aber alle 3 
Wandler haben ein unterschiedliches Gain. Es sind natürlich kleine 
Abweichungen, aber die Daten von ST stimmen schon recht gut und sind 
eher nüchtern angegeben.

TIPP:
Schalte über die RCC-Register den Takt für die Wandler frei und im 
Power-Register die Versorgungsspannung für die Wandler. Das steht leider 
nicht im Kapitel SDADC.
Auch wenn nur SDADC3 benutzt werden soll, muss trotzdem der SDADC1 auch 
Takt und Power bekommen, denn das Register vom SDADC1 lässt sich nur 
dann beschreiben, um die Vref einstellungen zu ändern.


Gruß Sascha

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.