Forum: Mikrocontroller und Digitale Elektronik STM32 ADC und SPI Problem


von Reginald L. (Firma: HEGRO GmbH) (reggie)


Angehängte Dateien:

Lesenswert?

Howdyho!

Habe mal wieder ein Problem:
Ich erfasse mit dem ADC eines STM32F407 ein Signal (DualMode und 
CircularMode). Dieses wird abwechselnd und manuell in zwei Buffer 
geschrieben. Sobald ein Buffer vollgeschrieben ist, wird ein Flag 
gesetzt und in der Mainloop der SPI getriggert der diesen Buffer an 
einen STM32F429 sendet. Das heißt ich bekomme einen kontinuierlichen 
Stream. Danach gehts über Ethernet an den PC und ich bekomme das Signal 
wie auf den Bildern zu sehen. Das Komische ist nun, dass genau während 
der SPI-Übertragung ein Rauschen (?) auftaucht. Bestätigt habe ich mir 
das ganze mit einem Delay vor der SPI-Übertragung, deshalb auch der 
Offset auf den Bildern.

Folgende Einstellungen habe ich noch getroffen:
- Alles läuft über DMA, genauer gesagt DMA2
- Nur für ADC-DMA FIFO aktiviert (1/4Full, Word)
- ADC Clock 22,5MHz
- ADC-SampleTime 3 Cycles
- ADC getriggert mit 7kHz
- Buffergrößen jeweils 48912 Bytes
- SPI Clock 2,8125MHz

Auch, wenn ich mit diesen Einstellungen etwas rumspiele, ändert sich 
nichts am Rauschen, ausser, logischerweise je nach Einstellungen, die 
Dauer.

Seltsam ist auch, dass das Rauschen mal mehr mal weniger stark 
ausgeprägt ist, siehe Bild 2. Manchmal ist es auch kaum zu sehen. 
Allerdings wiederholt es sich im gleichen Schema.


Hat jemand irgend eine Idee, was das sein könnte? Vielleicht liege ich 
mit meinen Annahmen auch total daneben?


Danke euch schonmal!

Grüße
Reggie

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Angehängte Dateien:

Lesenswert?

Okay, gerade habe ich mit dem Oszilloskop direkt am Signal gemessen, da 
taucht dieses Rauschen auch auf und zwar immer dann, wenn das SPI 
losschießt. Kann das sein, dass das SPI hier so eine Wirkung auf die 
Umgebung hat?!

EDIT: Achso, habe die Kabel der Sensoren vom STM abgesteckt.

: Bearbeitet durch User
von Alexander K. (alex_k111)


Lesenswert?

hi, das klingt nach einem inneren emv problem.

Deine SPI Übertragung stört dein analoges Signal und das misst dann auch 
der adc.

ist das ein Breadboard aufbau? wenn ja versuch mal die kabel vom spi 
weiter weg vom analog teil zu legen. bzw mach mal ein Foto vom Aufbau.

gruß,
alex

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Angehängte Dateien:

Lesenswert?

Alexander K. schrieb:
> ist das ein Breadboard aufbau? wenn ja versuch mal die kabel vom spi
> weiter weg vom analog teil zu legen. bzw mach mal ein Foto vom Aufbau.

Vielen Dank für die schnelle Antwort. Die Sensoren kommen mit etwa 1m 
geschirmtem Kabel ans Breadboard, von dort mit Jumperkabeln an den STM, 
siehe Bild. Ich nehme nur Frequenzen im Bereich 5-30 Hz auf, deshalb 
möchte ich auf dem Breadboard erst mal vorfiltern, was ich bisher aber 
noch nicht tue. Der Frequenzumrichter arbeitet zwischen 2-16kHz, das ist 
komischerweise null Problemo. Aber die 2MHz vom SPI machen mich fertig. 
Erstaunlich wieviel so ein kleines "Ding" im Gegensatz zum Umrichter 
anrichtet.

EDIT: Jetzt ist auch das Bild oben.

: Bearbeitet durch User
von Alexander K. (alex_k111)


Lesenswert?

okay räumlich weiter trennen wird schwierig :)

das sensor signal kommt zur Zeit also direkt auf das breadboard und dann 
an den 407er?

wie sieht die masse anbindung der einzelnen boards/signale aus?
evtl könnte eine extra leitung für das spi interface helfen, diese wäre 
dann nah an der cs und den datenleitungen zu legen.

auch die masse des analog signals kann ich auf dem foto nicht ausmachen, 
auch hier rückweg (masse) so nah wie möglich am hinweg (signalleitung)

: Bearbeitet durch User
von Reginald L. (Firma: HEGRO GmbH) (reggie)


Angehängte Dateien:

Lesenswert?

Alexander K. schrieb:
> das sensor signal kommt zur Zeit also direkt auf das breadboard und dann
> an den 407er?
Genau, keine Veränderung, wenn ich direkt an den F407 gehe.

Alexander K. schrieb:
> wie sieht die masse anbindung der einzelnen boards aus?
> evtl könnte eine extra leitung für das spi interface helfen, diese wäre
> dann nah an der cs und den datenleitungen zu legen.
Für Masse verwende ich auch wieder Jumperkabel. Von jedem Board zu allen 
anderen Boards.

Jetzt habe ich gerade deinen Tipp mit dem zusätzlichen Massekabeln 
befolgt, es scheint schon etwas geholfen zu haben, siehe Bild. Vielen 
Dank dafür erstmal!

Habe alle SPI-Leitungen zwei mal mit zwei Masseleitungen umwickelt. Gibt 
es hier noch eine bessere Möglichkeit?

EDIT: Schon wieder Bild vergessen :>

: Bearbeitet durch User
von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Was mich aber wundert: Wenn du die ersten zwei Bilder anschaust, sieht 
man, dass auf dem zweiten kaum noch ein Rauschen vorhanden ist. Weisst 
du woher das kommt?

von Alexander K. (alex_k111)


Lesenswert?

Könntest du mal eine feste Spannung auf dem Pin messen? also irgendwas 
stabilisiertes (nur nicht die 3,3V auf dem Discovery Board, die wird da 
auch als Vref für den ADC verwendet) z.b. ne 1,5V Batterie. Und 
gleichzeitig auch die CS Leitung vom SPI? Dann können direkt 2 Sachen 
getestet werden.

Von was für einem Sensor kommt dein Signal? Evtl. könnte ein 
Impedanzwandler oder direkt ein aktiver Filter (TP mit OPV) für eine 
bessere Störfestigkeit auf der Analogleitung sorgen.

Oder du beschäftigst dich mit dem SPI interface. vllt ein anderes SPI 
modul auf dem 407er verwenden. (Eins was weiter weg ist von dem Analog 
Teil.) Oder die Datenrate verringern, oder die Taktflankensteilheit 
begrenzen über serielle Widerstände in den SPI Leitungen. Oder alles 
zusammen :)

von Ingo L. (corrtexx)


Lesenswert?

Solche Probleme lassen sich meist nur ein geschicktes Layout beheben. Du 
könntest aber mal versuchen Serienwiderstände in die SPI-Leitung zu 
schleifen (10k z.B.) dadurch werden zwar u.U. die Flanken verschliffen 
aber das di/dt ist nicht mehr so groß. Es müssen ja ständig parasitäre 
Kapazitäten umgeladen werden.

: Bearbeitet durch User
von Reginald L. (Firma: HEGRO GmbH) (reggie)


Angehängte Dateien:

Lesenswert?

Alexander K. schrieb:
> Könntest du mal eine feste Spannung auf dem Pin messen? also irgendwas
> stabilisiertes (nur nicht die 3,3V auf dem Discovery Board, die wird da
> auch als Vref für den ADC verwendet) z.b. ne 1,5V Batterie. Und
> gleichzeitig auch die CS Leitung vom SPI? Dann können direkt 2 Sachen
> getestet werden.

Siehe bitte Bilder. Habe auch mal mit offenen Pins gemessen. Hoffe du 
siehst da irgendwas. Ich bin Maschinenbauer und elektrotechnischer 
Primat.

Alexander K. schrieb:
> Von was für einem Sensor kommt dein Signal? Evtl. könnte ein
> Impedanzwandler oder direkt ein aktiver Filter (TP mit OPV) für eine
> bessere Störfestigkeit auf der Analogleitung sorgen.
Das sind im Moment zwei ADXL335. Die werden zu einem späteren Zeitpunkt 
aber gegen industrielle analoge Beschleunigungsaufnehmer ausgetauscht.
Ja, ich habe schon diverse OPVs hier rumliegen, habe mich aber noch 
nicht an sie herangetraut. Das höchste der Gefühle war bis jetzt der 
Komparator für die Reflexlichtschranke. Meinst du ich sollte anfangen 
hier die Signale des Sensors aufbereiten, bevor ich mich an das 
SPI-Rauschen ranmache?

Alexander K. schrieb:
> Oder du beschäftigst dich mit dem SPI interface. vllt ein anderes SPI
> modul auf dem 407er verwenden. (Eins was weiter weg ist von dem Analog
> Teil.) Oder die Datenrate verringern, oder die Taktflankensteilheit
> begrenzen über serielle Widerstände in den SPI Leitungen. Oder alles
> zusammen :)
Ich denke hier habe ich schon das Möglichstes versucht (?): SPI liegt 
auf PortA, ADC auf PortB und PortC. Allerdings liegen die Pins auf dem 
Discovery sehr nahe beieinander.
Datenrate verringern habe ich auch probiert, augenscheinlich hat es 
absolut nichts gebracht. Nachdem was ich zu der Flankensteilheit und EMV 
gelesen habe gestern Abend, hängt das auch nicht von der Taktrate ab(?).
Serielle Widerstände und die Flankensteilheit der Pins in der 
Pin-Initialisierung werde ich noch probieren.

Ingo L. schrieb:
> Solche Probleme lassen sich meist nur ein geschicktes Layout beheben. Du
> könntest aber mal versuchen Serienwiderstände in die SPI-Leitung zu
> schleifen (10k z.B.) dadurch werden zwar u.U. die Flanken verschliffen
> aber das di/dt ist nicht mehr so groß. Es müssen ja ständig parasitäre
> Kapazitäten umgeladen werden.
Ich habe von etwa 50-100Ohm gelesen, sind 10k nicht zu viel?

von Alexander K. (alex_k111)


Lesenswert?

Reginald L. schrieb:
> Ich denke hier habe ich schon das Möglichstes versucht (?): SPI liegt
> auf PortA, ADC auf PortB und PortC.

So wie ich das auf dem Foto sehe nutzt du für SPI PA5,6,7, das sind 
alles pins die auch als adc genutzt werden können, also mit an der ADC 
Peripherie hängen.

Mach ein Pin-remapping auf die Pins B3,4,5 um weiter SPI1 nutzen zu 
können oder weich auf SPI2 oder 3 aus. Hauptsache weit weg vom adc und 
keine pins nutzen die damit geteilt werden.

Reginald L. schrieb:
> Siehe bitte Bilder. Habe auch mal mit offenen Pins gemessen. Hoffe du
> siehst da irgendwas.

Die Batterie zeigt das es nicht wirklich an der Impedanz vom Sensor 
liegt, also wird ein OPV hier nicht viel helfen. Offene Pins "messen" 
alles was so in der luft ist, also nicht brauchbar.

Wie ist deine GPIO konfiguration für die SPI-Pins? Du kannst mit dem 
GPIO_Speed die Flankensteilheit beeinflussen. Stell das mal auf 2 bzw 25 
Mhz je nachdem wie schnell du dein spi laufen lassen willst. Sonst halt 
noch die Widerstände einbringen, hochohmig anfangen, wenn es nicht geht 
niederohmiger weden. (Das hängt unter anderem von parasitäten 
Kapazitäten ab, bei so einem "Draht"-aufbau ist das schwehr 
abzuschätzen)

Wobei ich denke das ein wechsel der SPI-Pins am meisten bringt

: Bearbeitet durch User
von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Alexander K. schrieb:
> So wie ich das auf dem Foto sehe nutzt du für SPI PA5,6,7, das sind
> alles pins die auch als adc genutzt werden können, also mit an der ADC
> Peripherie hängen.
>
> Mach ein Pin-remapping auf die Pins B3,4,5 um weiter SPI1 nutzen zu
> können oder weich auf SPI2 oder 3 aus. Hauptsache weit weg vom adc und
> keine pins nutzen die damit geteilt werden.
Aaah, ja na klar. Danke, werde ich jetzt gleich als erstes mal 
versuchen.

Alexander K. schrieb:
> Die Batterie zeigt das es nicht wirklich an der Impedanz vom Sensor
> liegt, also wird ein OPV hier nicht viel helfen.
Spätestens mit den industriellen Sensoren werde ich das Signal so oder 
so verstärken müssen. Hast du da irgend ein "Tutorial" oder etwas in die 
Richtung zur Hand, damit ich den Spannungsunterschied von 50-100mV auf 
1-3V verstärken kann? Da würde das Rauschen des SPIs auch nicht mehr so 
ins Gewicht fallen.

Alexander K. schrieb:
> Offene Pins "messen"
> alles was so in der luft ist, also nicht brauchbar.
Wie gesagt, Primat ;)

Alexander K. schrieb:
> Wie ist deine GPIO konfiguration für die SPI-Pins?
Momentan auf der Master-Seite:
1
  // Pins
2
  GPIO_InitTypeDef h_gpio;
3
  ZEROINIT(h_gpio);
4
  h_gpio.GPIO_Mode = GPIO_Mode_AF;
5
  h_gpio.GPIO_OType = GPIO_OType_PP;
6
  h_gpio.GPIO_PuPd = GPIO_PuPd_DOWN;
7
  h_gpio.GPIO_Speed = GPIO_High_Speed;
8
  h_gpio.GPIO_Pin =
9
    GPIO_Pin_5 |    // SPI1 CLK
10
    GPIO_Pin_6 |    // SPI1 MISO
11
    GPIO_Pin_7;      // SPI1 MOSI
12
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
13
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
14
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
15
  GPIO_Init(GPIOA, &h_gpio);
16
  h_gpio.GPIO_Mode = GPIO_Mode_OUT;
17
  h_gpio.GPIO_OType = GPIO_OType_PP;
18
  h_gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
19
  h_gpio.GPIO_Pin =
20
    GPIO_Pin_4;      // SPI1 CS
21
  GPIO_Init(GPIOA, &h_gpio);
22
  GPIO_SetBits(GPIOA, GPIO_Pin_4);

Und Slave:
1
  // Pins
2
  GPIO_InitTypeDef h_gpio;
3
  ZEROINIT(h_gpio);
4
  h_gpio.GPIO_Mode = GPIO_Mode_OUT;
5
  h_gpio.GPIO_OType = GPIO_OType_OD;
6
  h_gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
7
  h_gpio.GPIO_Speed = GPIO_High_Speed;
8
  h_gpio.GPIO_Pin =
9
    GPIO_Pin_11;  // STM32F407 NRST Boot Reset
10
  GPIO_Init(GPIOI, &h_gpio);
11
  h_gpio.GPIO_Mode = GPIO_Mode_AF;
12
  h_gpio.GPIO_OType = GPIO_OType_PP;
13
  h_gpio.GPIO_PuPd = GPIO_PuPd_DOWN;
14
  h_gpio.GPIO_Pin =
15
    GPIO_Pin_5 |  // SPI1 SCK
16
    GPIO_Pin_6;    // SPI1 MISO
17
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
18
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
19
  GPIO_Init(GPIOA, &h_gpio);
20
  h_gpio.GPIO_Pin =
21
    GPIO_Pin_5;    // SPI1 MOSI
22
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI1);
23
  GPIO_Init(GPIOB, &h_gpio);
24
  h_gpio.GPIO_Mode = GPIO_Mode_IN;
25
  h_gpio.GPIO_OType = GPIO_OType_OD;
26
  h_gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
27
  h_gpio.GPIO_Pin =
28
    GPIO_Pin_0;   // SPI1 CS
29
  GPIO_Init(GPIOB, &h_gpio);
30
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource0);
31
32
  EXTI_InitTypeDef h_exti;
33
  h_exti.EXTI_Line = EXTI_Line0;
34
  h_exti.EXTI_LineCmd = ENABLE;
35
  h_exti.EXTI_Mode = EXTI_Mode_Interrupt;
36
  h_exti.EXTI_Trigger = EXTI_Trigger_Falling;
37
  EXTI_Init(&h_exti);

von Alexander K. (alex_k111)


Lesenswert?

Reginald L. schrieb:
> h_gpio.GPIO_Speed = GPIO_High_Speed;

Stell das mal auf GPIO_Medium_Speed oder GPIO_Low_Speed (25 bzw. 2Mhz)
Wenn deine SPI mit weniger als 25 oder gar 2 Mhz Daten raus schiebt.

Reginald L. schrieb:
> Hast du da irgend ein "Tutorial" oder etwas in die
> Richtung zur Hand, damit ich den Spannungsunterschied von 50-100mV auf
> 1-3V verstärken kann? Da würde das Rauschen des SPIs auch nicht mehr so
> ins Gewicht fallen.

Das sollte mit einem passenden OPV als nicht invertierender verstärker, 
mit rc tiefpass nachgeschaltet ausreichend sein.
beispiel opv hier: 
http://www.elektronik-kompendium.de/sites/slt/0210151.htm

Such dir bei Ti (zum Beispiel) einen Single Supply und (am besten mit 
3,3V Vcc) Rail-to-Rail (kann am eingang und ausgang dann auch bis an die 
Versorgungsspannung arbeiten) fähigen Op. Noch 2 Widerstände für das 
Feedback und 1 Widerstand und Kondensator als Tiefpass. Beispiel 
(welches ich gerade im Kopf habe) wäre ein OPA333 wobei ich mir da nicht 
sicher bin ob es den auch im DIP Gehäuse (für dein Breadboard) gibt.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Angehängte Dateien:

Lesenswert?

Also habe jetzt den Pin-Speed auf 25MHz gestellt, SPI-Leitungen mit 
Masse umwickelt (:>) und SPI1 auf PortB gelegt. Man erkennt schon einen 
deutlichen Unterschied zum Anfangszustand. Allerdings wäre das für meine 
Zwecke noch nicht ausreichend, weshalb ich mich jetzt auf die OPVs 
stürzen werde.

Ich verstehe aber immer noch nicht, warum das Rauschen mal relativ stark 
ist und dann wieder kaum zu sehen.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Alexander K. schrieb:
> Das sollte mit einem passenden OPV als nicht invertierender verstärker,
> mit rc tiefpass nachgeschaltet ausreichend sein.
> beispiel opv hier:
> http://www.elektronik-kompendium.de/sites/slt/0210151.htm
>
> Such dir bei Ti (zum Beispiel) einen Single Supply und (am besten mit
> 3,3V Vcc) Rail-to-Rail (kann am eingang und ausgang dann auch bis an die
> Versorgungsspannung arbeiten) fähigen Op. Noch 2 Widerstände für das
> Feedback und 1 Widerstand und Kondensator als Tiefpass. Beispiel
> (welches ich gerade im Kopf habe) wäre ein OPA333 wobei ich mir da nicht
> sicher bin ob es den auch im DIP Gehäuse (für dein Breadboard) gibt.

Danke für den Link, werde mich mal versuchen da reinzuarbeiten. Ich habe 
schon mal versucht einen Tiefpass aufzubauen aber bin da gar nicht 
durchgestiegen. Dafür werde ich hier bestimmt auch noch gesondert einen 
Thread aufmachen. Ich danke dir vielmals für die Hilfestellung! Das 
Rauschen ist sichtlich besser geworden.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Angehängte Dateien:

Lesenswert?

Hierzu nochmals eine gezoomte Aufnahme des Abschnitts mit dem Rauschen. 
Einmal kaum zu sehen, auf dem anderen Bild heftiger. Jemand eine Ahnung 
woran das liegt?

EDIT: Vielleicht irgendeine Resonanz?

: Bearbeitet durch User
von Ingo Less (Gast)


Lesenswert?

Kann mann denn was periodisches erkennen, z.B. ob er nur jedes n-te mal 
stark rauscht?

von Imal (Gast)


Lesenswert?

Hat der uc eine dedizierte Versorgung für die ADCs? Wird die genutzt?

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Ingo Less schrieb:
> Kann mann denn was periodisches erkennen, z.B. ob er nur jedes n-te mal
> stark rauscht?

Nee, es sieht absolut sporadisch aus.

Imal schrieb:
> Hat der uc eine dedizierte Versorgung für die ADCs? Wird die genutzt?
Meinst du die Referenzspannung? Nee, die kommt vom Board selber.

von Stefan K. (stefan64)


Lesenswert?

Wie wäre denn die pragmatische Lösung: den ADC ausserhalb der 
SPI-Transfers messen lassen?

Wie hochohmig sind denn die ADC-Eingänge beschaltet?

Gruß, Stefan

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Stefan K. schrieb:
> Wie wäre denn die pragmatische Lösung: den ADC ausserhalb der
> SPI-Transfers messen lassen?

Ja, so pragmatisch wäre sie in meinem Fall auch gar nicht, diese 
Messmethode habe ich schon implementiert. Allerdings möchte ich auch 
einen durchgehenden Stream implementieren. Die Software soll am Ende 
möglichst Flexibel sein um auf die wechselnden Bedingungen möglichst gut 
reagieren zu können. Aber danke für den Hinweis :)

Stefan K. schrieb:
> Wie hochohmig sind denn die ADC-Eingänge beschaltet?
Puh, hab ich schon erwähnt, dass ich Elektrotechnik-Primat bin? Was 
meinst du damit? Der Sensorausgang ist momentan direkt auf den 
ADC-Eingang geschaltet. 1m geschirmtes Kabel + etwa 30cm Jumperkabel.

von Alexander K. (alex_k111)


Lesenswert?

Warum nur sporadisch kann an vielem liegen. Ne passende antwort dafür 
hab ich auch nicht parat. Es kann halt alles mögliche sein

Auf dem 407er Discovery Board ist der ADC nur recht rudimentär an die 
3V3 vom mikrocontroller angebunden. Wenn du ein Scope zur Verfügung hast 
vllt mal am C25, C22 (VDDA) oder am C23,C21 (Vref) messen, wenn du dort 
auch die störungen siehst, dann hilft nicht mehr viel.

Tiefpass ist schnell erledigt, der hängt (wenn er nach dem opv kommt) 
nur von der maximalen signalfrequenz, die du messen möchtest ab (wenn 
die sampling frequenz min. 2 mal höher ist)

von Alexander K. (alex_k111)


Lesenswert?

Stefan K. schrieb:
> Wie hochohmig sind denn die ADC-Eingänge beschaltet?

Er nutzt einen ADXL335, der hat ~32kOhm Ausgangsimpedanz. Aber eine 
Batterie, direkt am Analog Eingang zeigt die gleichen Störer.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Angehängte Dateien:

Lesenswert?

Alexander K. schrieb:
> wenn du dort
> auch die störungen siehst, dann hilft nicht mehr viel.

Das war der entscheidende Tipp nehme ich an! Auf dem Bild ist VDD 
während der SPI-Übertragung zu sehen.
Nur dein "hilft nicht mehr viel" gefällt mir gar nicht :>
Ich verstehe den Zusammenhang hier nicht wirklich. Mir ist bewusst, dass 
der ADC die 3v3 als Referenzspannung nimmt. Wenn ich ihm die 
Referenzspannung extern zuführe, würde ich das gleiche Bild sehen?

von Alexander K. (alex_k111)


Lesenswert?

Der ADC verwendet die gleichen 3V3 wie der mikrocontroller. Sind also 
störungen auf diesen 3V3 (z.b. durch das SPI Modul) sieht auch der ADC 
diese, das heißt soviel wie dein analog signal wird nicht von der SPI 
übertragung beeinflusst, dein ADC aber. bei dem 12 bit adc wird die 3V3 
in 4096 Stufen geteilt. Also ungefähr 0,8mV pro Stufe (der kleinste 
unterschied der gemessen werden kann).
Angenommen dein eingangssignal bleibt immer gleich bei 1V dann würde der 
adc einen wert von 1 / 0,0008 messen. Also 1250, vorrausgesetzt deine 
Referenz ändert sich nicht. Tut sie es aber doch (Abfall auf 3V ~= 
0,7mV) misst der ADC 1 / 0,0007 = 1428. In deinem Programm gehst du aber 
von 0,8mV pro Schritt aus, würdest das also als 1428 * 0,0008 
interpretieren. Das wären 1,14V.

Ändern kannst du das nur wenn du VDDA und Vref weiter stabilisiert (mehr 
Kapazität bzw eigener Spannungsregler, unabhängig vom digitalteil).
Das wird aber auf Grund des Designs des Discovery Boards schwierig. 
Bauteile L1 R23 C21,22,23,25 sind da involviert, alles 0603er smd teile 
ohne viel platz. Oder wie angesprochen extern zu führen, dafür aber L1 
Herausnehmen und an die Pads gehen, es gibt keinen extra anschluss 
dafür.

Was noch möglich wäre ist die benutzung der internen referenzdiode. Das 
ist ein Kanal, den du mit deinem ADC messen kannst der an eine 
Referenzspannungsdiode (auf dem STM) angeschlossen ist. die immer ca 
1,2V (wenn ich es richtig im Kopf habe, steht im datenblatt) hat. Diese 
würdest du im Zyklus messen, aus dem Messwert deine aktuelle Vref 
feststellen und diese dann verwenden um die anderen messwerte richtig zu 
interpretieren. Klingt nach arbeit oder ? :)

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Alexander K. schrieb:
> Klingt nach arbeit oder ? :)
Wenn du wüsstest wieviele offene Baustellen ich hier vor mir liegen habe 
:>

Ok, also, wenn ich dich richtig verstanden habe, trenne ich VRef des 
ADCs vom Board und führe ihm von extern, beispielsweise habe ich hier so 
DC-DC-Wandler 5V->3.3V rumliegen, zu? Löten ist kein Problem, habe schon 
den CS34L22 und den LIS3DSH vom Board entfernt, das bekomme ich schon 
hin. Wenn ich das DataSheet richtig verstehe, kann ich auch nur maximal 
bis 3.6V Referenzspannung gehen?

von Alexander K. (alex_k111)


Lesenswert?

Auch VDDA nicht vergessen (Das ist die Spannungsversorgung für den ADC)

Ich würde L1 runter nehmen und auf das Pad zu R23 einen LDO 
Spannungsregler mit möglichst geringem Rauschen und Hoher Noise 
rejection (PSRR) anbringen, gespeist von den 5V auf dem Board (was auch 
nicht ideal ist). Masse davon muss auch auf Gnd gelegt werden, die 
negative Referenz liegt in dem gehäuse fest auf masse.

Zum testen vllt erstmal nur l1 hoch nehmen und über eine 3v knopfzelle 
oder ein externes lineares Ntezteil anschließen. Geh nicht größer als 
VDD mit der Spannung.

!!! kein schaltnetzteil und auch kein dcdc => das macht dein problem 
eher schlimmer!

: Bearbeitet durch User
von Ingo Less (Gast)


Lesenswert?

Ich würde versuchen die Ursache, nicht die Wirkung zu bekämpfen. SPI 
verursacht Störungen, weil es kapazitäten schnell umladen muss. Die 
Energie holt es sich aus den Kondensatoren an VCC. Also, wenn du 
Serienwiderdtände rein baust UND VCC stärker abblockst sollte das 
helfen. Ich hatte mal ein änliches Problem mit einem Radio-IC. Immer 
wenn ich mein LCD aktualisiert habe habe ich das im Radio gehört. 
Serienwiderstände in die Datenleitung und zack war Ruhe...

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Hi Reggie,
hast Du Dir schonmal das STM32F4 Errata Sheet angeschaut?

Zitat aus der Rev6:
"Internal noise impacting the ADC accuracy
Description
An internal noise generated on VDD supplies and propagated internally 
may impact the ADC
accuracy.
This noise is always active whatever the power mode of the MCU (RUN or 
Sleep).
Workarounds
Two steps could be followed to adapt the accuracy level to the 
application requirements:
1. Configure the Flash ART as Prefetch OFF and (Data + Instruction) 
cache ON.
2. Use averaging and filtering algorithms on ADC output codes.
For more workaround details of this limitation, refer to AN4073."

Zusätzlich zu den beschriebenen Lösungsansätzen gibt es noch die 
Möglichkeit der Beerenauslese:
die Firmware sucht nach Ausreißern in der Messreihe und wirft diese weg.

Das gemeine an diesem Problem ist, dass Du Dir beim Layout einen 
abbrechen kannst, aber nie die Performance erreichen wirst, die das 
Datenblatt suggeriert.

Das Problem ist nicht nur beim F4 vorhanden, auch andere 
Controller/Hersteller zeigen hier böse Ausreißer.

Also wenn's wirklich präzise sein soll - externer ADC.

Grüße,
 marcus

von Thorem (Gast)


Angehängte Dateien:

Lesenswert?

Ach ja, bei den Nucleos ist der Analogkram besser zugänglich, siehe die 
Schaltpläne im Anhang.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Angehängte Dateien:

Lesenswert?

Marcus H. schrieb:
> hast Du Dir schonmal das STM32F4 Errata Sheet angeschaut?
Hi! Ja, das kenne ich schon, danke. Auch die beiden ADC-Sheets von ST. 
Allerdings tritt das Problem nur in Verbindung mit SPI-Transfers auf.

Marcus H. schrieb:
> Also wenn's wirklich präzise sein soll - externer ADC.
Den wollte ich zu Anfang meines Projekts auch verwenden. Als es noch in 
den Kinderschuhen steckte, habe ich halt mit dem Internen angefangen um 
Fuß zu fassen. Dem Anschein nach, ist es auch ausreichend. Aber wer 
weiß, wie hoch ich noch hinaus möchte :) Steckst du in der Thematik drin 
und hättest da eine Empfehlung? Preislich bin ich flexibel, 12-16Bit 
Auflösung bräuchte ich, eine zuverlässige und bequeme Übertragung der 
Daten ist ein Muss (das finde ich grad so schön am internen STM-ADC), 
möglichst 3 Kanäle, vom Tempo her benötige ich nicht mehr als 200-500kS 
(je Kanal), möglichst zeitgleiches Samplen der Kanäle.

Thorem schrieb:
> Ach ja, bei den Nucleos ist der Analogkram besser zugänglich, siehe die
> Schaltpläne im Anhang.
Danke auch dir, allerdings kommt das Zeug später eh auf eine eigene 
Platine.


PS: Ich habe jetzt einen 2-Kanal OPV dran hängen (TLC272). Habe auch 
versucht zu filtern: Direkt vom Sensorsignal 100nF gegen Masse, dann in 
OPV, Offset auf 1.5V und Verstärkung so gewählt, dass ich etwa +-1V bei 
Vollausschlag bekomme. Dann am Ausgang vom OPV einen herumliegenden 
Widerstand genommen und nochmal 100nF gegen Masse. So sieht das jetzt 
aus und ich bin schon extremst zufrieden, ja, sogar richtig begeistert.
Leider habe ich mehr "probiert" als das Hirn betätigt. Wie bekomme ich 
denn das Signal weiter gefiltert? Ich würde schon gerne möglichst sauber 
in den PC reinkommen bevor ich dort mit der Signalverarbeitung anfange. 
Als Grenzfrequenz würde ich mal was zwischen 50-100Hz nehmen, es sollte 
ein Sinus rauskommen.

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Reginald L. schrieb:
> Marcus H. schrieb:
>> hast Du Dir schonmal das STM32F4 Errata Sheet angeschaut?
> Hi! Ja, das kenne ich schon, danke. Auch die beiden ADC-Sheets von ST.
> Allerdings tritt das Problem nur in Verbindung mit SPI-Transfers auf.
>
> Marcus H. schrieb:
>> Also wenn's wirklich präzise sein soll - externer ADC.
> Den wollte ich zu Anfang meines Projekts auch verwenden. Als es noch in
> den Kinderschuhen steckte, habe ich halt mit dem Internen angefangen um
> Fuß zu fassen. Dem Anschein nach, ist es auch ausreichend. Aber wer
> weiß, wie hoch ich noch hinaus möchte :) Steckst du in der Thematik drin
> und hättest da eine Empfehlung? Preislich bin ich flexibel, 12-16Bit
> Auflösung bräuchte ich, eine zuverlässige und bequeme Übertragung der
> Daten ist ein Muss (das finde ich grad so schön am internen STM-ADC),
> möglichst 3 Kanäle, vom Tempo her benötige ich nicht mehr als 200-500kS
> (je Kanal), möglichst zeitgleiches Samplen der Kanäle.

Mir wäre wohler, Du gingst mit Deiner Spec zu den üblichen Verdächtigen 
und suchst Dir was passendes raus. Entweder die Meta-Suchmaschine von 
Digikey oder nacheinander die üblichen Verdächtigen TI, LT, ADI (hab ich 
alle erwischt? da kauft ja im Moment jeder jeden auf...).

Eine interessante Variante wäre auch der Einsatz eines F3 mit SDADC. 
Allerdings ist dieses Tierchen auch mit Vorsicht zu genießen - es ist 
laut Datenblatt einiges an Kalibrieraufwand notwendig, bevor die SDADC 
halbwegs die Marketing-Performance bringen.
Mir fehlt da aktuell noch die praktische Erfahrung. Ich habe zwar ein F3 
Design in der Schublade, allerdings war das dem Kunden dann doch zu 
unsicher und wir sind auf den o.g. Ansatz ausgewichen.
Vielleicht liest hier jemand mit F3 Erfahrung mit?

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Marcus H. schrieb:
> Mir wäre wohler, Du gingst mit Deiner Spec zu den üblichen Verdächtigen
> und suchst Dir was passendes raus. Entweder die Meta-Suchmaschine von
> Digikey oder nacheinander die üblichen Verdächtigen TI, LT, ADI (hab ich
> alle erwischt? da kauft ja im Moment jeder jeden auf...).
Alles klar, ich guck da nochmal vorbei. Es gibt nur so unendlich viele, 
hätte ja sein können, du hast da was in petto. Ach und AnalogDevices 
hast du vergessen, hab hier ziemlich viel von denen rumliegen :>

Marcus H. schrieb:
> Eine interessante Variante wäre auch der Einsatz eines F3 mit SDADC.
Apropo, es gibt ja verschiedene ADC-Varianten wie etwa Sigma-Delta 
oder/und differentielle. Hast du da zufällig auch noch einen Link zur 
Hand, nach welchen Kriterien hier die Wahl zu treffen wäre?

EDIT: Ach und eine Empfehlung zur Wahl eines passenden Linearreglers für 
die Referenzspannung des ADCs bist du mir noch schuldig ;) Falls ich auf 
einen externen ADC wechseln werde, möchte ich hier auch die 
Signalspannung auf zwischen 0-10V verstärken, muss ich hier dann eine 
Referenzspannung wählen die bei 10V liegen würde?

: Bearbeitet durch User
von Stefan K. (stefan64)


Lesenswert?

Ingo Less schrieb:
> ch würde versuchen die Ursache, nicht die Wirkung zu bekämpfen. SPI
> verursacht Störungen, weil es kapazitäten schnell umladen muss.

Ich würde an Deiner Stelle den Post von Ingo aufgreifen:
Du hast einen komplexen mc, der alle möglichen Aktionen parallel zum ADC 
ausführt. Aber nur die Übertragung auf dem SPI verursacht bei Dir diese 
massiven Störungen.

* Warum ist das so?
* Kommen diese Störungen aus dem mc oder von extern
  (z.B. kapazitive Last auf dem SPI-Bus, siehe Ingo)
* Verschwinden die Störungen, wenn keine Last am SPI hängt?

Gruß, Stefan

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Reginald L. schrieb:
> Marcus H. schrieb:
>> Mir wäre wohler, Du gingst mit Deiner Spec zu den üblichen Verdächtigen
>> und suchst Dir was passendes raus. Entweder die Meta-Suchmaschine von
>> Digikey oder nacheinander die üblichen Verdächtigen TI, LT, ADI (hab ich
>> alle erwischt? da kauft ja im Moment jeder jeden auf...).
> Alles klar, ich guck da nochmal vorbei. Es gibt nur so unendlich viele,
> hätte ja sein können, du hast da was in petto. Ach und AnalogDevices
> hast du vergessen, hab hier ziemlich viel von denen rumliegen :>
Ähem - ADI


> Marcus H. schrieb:
>> Eine interessante Variante wäre auch der Einsatz eines F3 mit SDADC.
> Apropo, es gibt ja verschiedene ADC-Varianten wie etwa Sigma-Delta
> oder/und differentielle. Hast du da zufällig auch noch einen Link zur
> Hand, nach welchen Kriterien hier die Wahl zu treffen wäre?
Hrrrm - SDADC. Die sind aber aufgrund des Tastverfahrens oft notorisch 
langsam. Jedes Bit halbiert Deine Umsetzungsrate.

> EDIT: Ach und eine Empfehlung zur Wahl eines passenden Linearreglers für
> die Referenzspannung des ADCs bist du mir noch schuldig ;) Falls ich auf
> einen externen ADC wechseln werde, möchte ich hier auch die
> Signalspannung auf zwischen 0-10V verstärken, muss ich hier dann eine
> Referenzspannung wählen die bei 10V liegen würde?
Bin mir keiner Schuld bewusst. Allerdings gibt der Hersteller gern mal 
eine Kombi aus Bausteinen an. D.h. wenn Du den ADC aussuchst, bekommst 
Du passende Vorverstärker und Referenzen angeboten.

von Reginald L. (Firma: HEGRO GmbH) (reggie)


Lesenswert?

Stefan K. schrieb:
> Ich würde an Deiner Stelle den Post von Ingo aufgreifen:
> Du hast einen komplexen mc, der alle möglichen Aktionen parallel zum ADC
> ausführt. Aber nur die Übertragung auf dem SPI verursacht bei Dir diese
> massiven Störungen.
Absolut.

Stefan K. schrieb:
> * Warum ist das so?
> * Kommen diese Störungen aus dem mc oder von extern
>   (z.B. kapazitive Last auf dem SPI-Bus, siehe Ingo)
> * Verschwinden die Störungen, wenn keine Last am SPI hängt?
Also SPI-Leitungen vom 407er abstecken?

Marcus H. schrieb:
> Ähem - ADI
Aaah, wieder was gelernt :>

Marcus H. schrieb:
> Bin mir keiner Schuld bewusst. Allerdings gibt der Hersteller gern mal
> eine Kombi aus Bausteinen an. D.h. wenn Du den ADC aussuchst, bekommst
> Du passende Vorverstärker und Referenzen angeboten.
Tatsächlich. Da war wohl was falsch verschaltet in meinem Hirn.
Alles klar, ich danke nochmals!

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Reginald L. schrieb:
> Stefan K. schrieb:
>> Ich würde an Deiner Stelle den Post von Ingo aufgreifen:
>> Du hast einen komplexen mc, der alle möglichen Aktionen parallel zum ADC
>> ausführt. Aber nur die Übertragung auf dem SPI verursacht bei Dir diese
>> massiven Störungen.
> Absolut.
>
> Stefan K. schrieb:
>> * Warum ist das so?
>> * Kommen diese Störungen aus dem mc oder von extern
>>   (z.B. kapazitive Last auf dem SPI-Bus, siehe Ingo)
>> * Verschwinden die Störungen, wenn keine Last am SPI hängt?
> Also SPI-Leitungen vom 407er abstecken?

Vielleicht hilft es, die Taktrate so weit wie möglich runterzusetzen und 
Serienterminatoren einzubauen?

von Ingo L. (corrtexx)


Lesenswert?

Probier es einfach mal aus, Versuch macht kluch

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.