Forum: Mikrocontroller und Digitale Elektronik Potisignal rauscht bei STM32F1 development board


von Manuel W. (multisync)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich möchte einen Joystick mithilfe eines STM32F1 development board 
auslesen. Ein Bild des Joystick findet ihr im Anhang. Es funktioniert 
quasi wie ein Drehpotentiometer (R unbekannt, Batterie des Multimeters 
wird leer). Die Spannung skaliert mit der Position des Hebels. Der Zweck 
der ganzen Schaltung ist es die Drehzahl eines Schrittmotors zu steuern.

Jedenfalls habe ich das Problem, dass das gemessene Signal ungemein 
rauscht. Die Messungen die ich mit dem 12bit-ADC alle 10ms durchführe 
weichen im Extremfall um bis zu 120inc voneinander ab. (Da Vcc 3.3V ist, 
müssten 120inc wohl etwa 10mV sein.) Derart große Sprünge messe ich aber 
nur alle paar Sekunden.

Ich habe sehr rudimentäre Debounce-Funktion geschrieben die so lange den 
alten Wert ausgibt, bis der neue um mindestens +-128 abweicht. Das 
funktioniert auch, allerdings schränke ich damit die Auflösung des 
Joysticks auf quasi 4bit ein. Das möchte ich vermeiden.

In der Hoffnung die Toleranzschwelle verringern zu können, habe ich noch 
einen RC-Tiefpass an den Eingang des ADC geschaltet. (Anordnung: 
STM32-ADC-Pin - (C=100nF gegen Masse) - R=10kOhm - Potischleifer.)

Es wundert mich, dass ich dadurch die Toleranzschwelle nur kaum 
verringern konnte. Nachdem die Einstreuungen wohl sehr hochfrequent 
sind, hätte ich gedacht, sie mit den gewählten Werten locker wegbügeln 
zu können.


Ich glaube, dass ich hier irgendwo etwas übersehe oder mir irgendwelche 
Zusammenhänge noch nicht ganz klar sind.

Könnt ihr mir helfen?
Vielen Dank!



Hier ein Link zum verwendeten development board:
https://www.openimpulse.com/blog/products-page/product-category/stm32f103c8t6-arm-development-board-cortex-m3/

von Johannes O. (jojo_2)


Lesenswert?

Hast du mal eine einfache Mittelwertbildung ausprobiert?
Also anstatt alle 10ms abzutasten, beispielsweise alle 1ms und dafür 
über 10 Messungen zu mitteln?
(Wenn du das noch optimiert machen willst, dann mittle über 2^N 
Messungen, das geht meist einfacher/schneller beim Berechnen).

Ansonsten kannst du auch mal deinen Aufbau hier posten, du kannst dir 
Störungen auch extern einfangen.

von Gerd E. (robberknight)


Lesenswert?

Manuel W. schrieb:
> Hier ein Link zum verwendeten development board:
> 
https://www.openimpulse.com/blog/products-page/product-category/stm32f103c8t6-arm-development-board-cortex-m3/

Vergleich mal die Kondensatoren an der Stromversorgung Deines Boards mit 
dem Datenblatt von ST. Bei Vdda sieht es zwar nicht so schlecht aus, 
aber bei den normalen Vdds:

ST möchte zwischen den verschiedenen Vdd und Vss 5 Stück 100nF und 1 
4.7µF haben, wobei der 4.7µF nahe an Vdd3 sein muss. Da ist Dein Board 
weit von weg.

Digital- und Analogversorgung sind nur über die kleine Spule/Ferrit 
entkoppelt. Wenn die Digitalversorung wegen falscher Dimensionierung 
zusammenbricht, hat das auch ziemlich schnell Auswirkungen auf den 
Analogbereich.

von Manuel W. (multisync)


Angehängte Dateien:

Lesenswert?

Johannes O. schrieb:
> Hast du mal eine einfache Mittelwertbildung ausprobiert?
> Also anstatt alle 10ms abzutasten, beispielsweise alle 1ms und dafür
> über 10 Messungen zu mitteln?
> (Wenn du das noch optimiert machen willst, dann mittle über 2^N
> Messungen, das geht meist einfacher/schneller beim Berechnen).
>
> Ansonsten kannst du auch mal deinen Aufbau hier posten, du kannst dir
> Störungen auch extern einfangen.

Das war ein guter Tipp, die Mittelwertbildung hat das Problem 
tatsächlich gemindert. Ich habe auch ein paar Blogposts gefunden, in 
denen für solche Anwendungsfälle eine Medianbildung empfohlen wird. 
Theoretisch müsste diese wirklich sehr gut geeignet sein -- der Nachteil 
dieser Lösung ist halt die Rechenzeit, da eine ständige Sortierung der 
Samples notwendig ist.

Auch der Hinweis mit den externen Störungen war richtig. Anbei ist ein 
Bild vom Aufbau. Es scheint, als hätte ich mir über die 10cm-Leitungen 
an denen die Entwicklungsplatine mit dem µC die Einstreuungen 
eingefangen. Quelle der Einstreuungen ist der Schrittmotortreiber 
unten-links. Wenn ich ihn deaktiviere, tritt quasi kein Rauschen mehr 
auf. (Übersprechen zwischen den 10cm-Leitungen dürfte kaum stattfinden, 
da die meisten davon noch elektrisch tot sind.)

von Manuel W. (multisync)


Lesenswert?

Gerd E. schrieb:
> Manuel W. schrieb:
>> Hier ein Link zum verwendeten development board:
>>
> 
https://www.openimpulse.com/blog/products-page/product-category/stm32f103c8t6-arm-development-board-cortex-m3/
>
> Vergleich mal die Kondensatoren an der Stromversorgung Deines Boards mit
> dem Datenblatt von ST. Bei Vdda sieht es zwar nicht so schlecht aus,
> aber bei den normalen Vdds:
>
> ST möchte zwischen den verschiedenen Vdd und Vss 5 Stück 100nF und 1
> 4.7µF haben, wobei der 4.7µF nahe an Vdd3 sein muss. Da ist Dein Board
> weit von weg.

Ich denke, dass ich mir das nächste mal wohl eine Platine aus westlicher 
Fertigung holen werden. Die paar gesparten Euro sind mir die 
potentiellen Probleme nicht wert.

> Digital- und Analogversorgung sind nur über die kleine Spule/Ferrit
> entkoppelt. Wenn die Digitalversorung wegen falscher Dimensionierung
> zusammenbricht, hat das auch ziemlich schnell Auswirkungen auf den
> Analogbereich.

Wie meinst du "wenn die Digitalversorgung zusammenbricht"? Wenn die 
Spannung wegbricht ist der ganze Chip doch ohnehin tot. Auch wenn der 
Analogteil noch Saft hätte. Ich denke, ich verstehe dich irgendwie 
falsch. 8-)

von c.m. (Gast)


Lesenswert?

Manuel W. schrieb:

> Wie meinst du "wenn die Digitalversorgung zusammenbricht"? Wenn die
> Spannung wegbricht ist der ganze Chip doch ohnehin tot.

der µc zupft digital an der versorgungsspannung und streut so 
möglicherweise störungen in den analogteil ein.
ich hab nicht ins datenblatt geschaut, aber der chip läuft 
wahrscheinlich auch noch weiter wenn vdd kurz von 3.3 auf 3.0v 
zusammenbricht. normalerweise macht man zwischen benachbarte vdd/vss 
pins deswegen kleine (100n) puffer/entstörkondensatoren.
wenn ich mir 
https://www.openimpulse.com/blog/wp-content/uploads/wpsc/downloadables/STM32F103C8T6-Schematic-Diagram.pdf 
anschaue frage ich mich ob die pins von vdd_(n) und vss_(n) eventuell 
soche nebeneinanderliegende pins sind, und warum dann keine c's 
dazwischen sind.

wenn du magst, frickel doch mal welche dran :)

von Gerd E. (robberknight)


Lesenswert?

Manuel W. schrieb:
>> Digital- und Analogversorgung sind nur über die kleine Spule/Ferrit
>> entkoppelt. Wenn die Digitalversorung wegen falscher Dimensionierung
>> zusammenbricht, hat das auch ziemlich schnell Auswirkungen auf den
>> Analogbereich.
>
> Wie meinst du "wenn die Digitalversorgung zusammenbricht"? Wenn die
> Spannung wegbricht ist der ganze Chip doch ohnehin tot. Auch wenn der
> Analogteil noch Saft hätte. Ich denke, ich verstehe dich irgendwie
> falsch. 8-)

Die Digitalversorung ist auf diesem Board nicht ausreichend mit 
Kondensatoren entkoppelt. Wenn der µC kurze Strompeaks aus der 
Digitalversorung zieht, sinkt daher dort die Spannung kurzzeitig. Und 
das kann durchaus kräftig runtergehen. Das meinte ich mit 
"zusammenbrechen".

Das schlägt dann auch auf die Analogversorgung durch und Deine Messwerte 
vom ADC werden instabil.

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.