Forum: Analoge Elektronik und Schaltungstechnik Motorstrommessung rauscht


von was (Gast)


Lesenswert?

Ich steuere einen DC Bürstenmotor mithilfe eines BTS7960 H-Brücken-Modul 
bei einer PWM Frequenz von 15 kHz an.

Der Motorstrom soll mit einem ACS712-Modul (gibt eine Spannung 
proportional zum Strom aus) und dem 10-Bit Analogeingang eines Arduino 
Mega gemessen werden.

Bei 0A Motorstrom liegt das Rauschen bei +- 1 LSB.

Meine Erwartung war eigentlich, dass der Motorstrom dank dessen 
Induktivität recht konstant ist und ich mir um Filtern des Messsignals 
keine Gedanken machen muss. Tatsächlich gehen die Messwerte aber völlig 
im Rauschen (+- 10 LSB) unter.

Leider habe ich kein Oszilloskop, dass die geringen Spannungshübe 
darstellen kann.

Wo liegt mein Denkfehler?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Wenn das die Originalschaltung des Arduino Mega 2560 ist, dann fehlen da 
ein paar Bauteile, die den ADC deutlich verbessern. So ist AVCC nicht 
über eine Drossel gespeist, sondern direkt an VCC und es fehlt ein 
Kondensator an AREF, der ist auf dem Board einfach freigelassen.
Das hilft dem ADC schon mal, deutlich ruhiger zu arbeiten.
Ausserdem verfügt der ACS712 über einen Anschluss für einen externen 
Filterkondensator an Pin 6, der auf jeden Fall bestückt sein sollte. Mit 
einem relativen dicken C (47nF) gibt Allegro einen Rauschpegel von etwa 
11mV am Ausgang an. Dazu sollte aber auch der Abblockkondensator an VCC 
angeschlossen sein.
Die Bandbreite sinkt natürlich mit einem grossen Filterkondensator, er 
stellt also immer einen Kompromiss zwischen Rauschen und Bandbreite dar.

von Guest (Gast)


Lesenswert?

was schrieb:
> Meine Erwartung war eigentlich, dass der Motorstrom dank dessen
> Induktivität recht konstant ist und ich mir um Filtern des Messsignals
> keine Gedanken machen muss.

Erwartungen werden meistens enttäuscht. Der Rippel des Stroms lässt sich 
mit der Schaltfrequenz und der Induktivität doch ganz gut abschätzen. 
Mal davon abgesehen das man analoge Signale IMMER filtern sollte, 
schließlich fängt man sich gerade in Umgebungen wo Dinge schnell 
geschaltet werden gerne Störungen ein.

von Gustl B. (-gb-)


Lesenswert?

was schrieb:
> Tatsächlich gehen die Messwerte aber völlig
> im Rauschen (+- 10 LSB) unter.

Dann ist dein Signal aber ziemlich schwach. Kannst du das rauschärm 
verstärken oder einen anderen Strommesswiderstand verwenden?
Was für eine ENOB sollte der ADC denn haben? So ein Rauschen hat man 
recht schnell bei ADCs wenn man Spannungen nicht filtert und auch nicht 
so beim Layout aufpasst.

Das Rauschen muss aber ja nicht stören wenn man den 
Signal-Rausch-Abstand erhöhen kann.

von Guest (Gast)


Lesenswert?

Gustl B. schrieb:
> einen anderen Strommesswiderstand verwenden?

Wird bei einem Hall-Sensor schwierig....

von was (Gast)


Lesenswert?

Matthias S. schrieb:
> Das hilft dem ADC schon mal, deutlich ruhiger zu arbeiten.

Nunja, wie gesagt bei 0A ist da nichts auszusetzen, die Werte sind +-1 
LSB stabil.

Matthias S. schrieb:
> Die Bandbreite sinkt natürlich mit einem grossen Filterkondensator, er
> stellt also immer einen Kompromiss zwischen Rauschen und Bandbreite dar.

Ich habe den Filterkondensator an Pin 6 von 47nF auf 1µF erhöht, das 
sollte zu einer Grenzfrequenz von ca. 100Hz führen. Dennoch, keine 
Besserung.

Guest schrieb:
> Erwartungen werden meistens enttäuscht. Der Rippel des Stroms lässt sich
> mit der Schaltfrequenz und der Induktivität doch ganz gut abschätzen.

Die Induktivität ist mir nicht bekannt. Es handelt sich um diesen Motor: 
https://www.ebikethaikit.com/uploads/443/files/MY1016Z250W.pdf

von Wolfgang (Gast)


Lesenswert?

was schrieb:
> Der Motorstrom soll mit einem ACS712-Modul (gibt eine Spannung
> proportional zum Strom aus) und dem 10-Bit Analogeingang eines Arduino
> Mega gemessen werden.

ACS712 ist ein Familienname. Welchen Typ verwendest du?

von Gustl B. (-gb-)


Lesenswert?

Guest schrieb:
> Wird bei einem Hall-Sensor schwierig....

Stimmt, aber es gibt auch unterschiedliche Sensoren. Selbst von diesem 
Sensor gibt es 3 verschiedene mit unterschiedlicher Spannung je Strom. 
Aber das sind jeweils nur ein paar mv/A. Da stellt sich die Frage:
Welchen Maximalstrom erwartest du?

was schrieb:
> Nunja, wie gesagt bei 0A ist da nichts auszusetzen, die Werte sind +-1
> LSB stabil.

Das klingt fast so als würde der Motorstrom irgendwie in den ADC 
einkoppeln. Hängt das an der selben Versorgung (gleiches Netzteil und 
wenig Entkopplung)? Hast du im Layout große Schleifen gebaut?

von Gustl B. (-gb-)


Lesenswert?

was schrieb:
> Die Induktivität ist mir nicht bekannt. Es handelt sich um diesen Motor:
> https://www.ebikethaikit.com/uploads/443/files/MY1016Z250W.pdf

Also maximal rund 20 A. Das wären beim
ACS712ELCTR-05B-T: 3,7 V
ACS712ELCTR-20A-T: 2 V
ACS712ELCTR-30A-T: 1,3 V

Welchen Eingangsbereich hat denn der ADC und mit welchem Strom lässt du 
den Motor tatsächlich laufen?

von Wolfgang (Gast)


Lesenswert?

was schrieb:
> Leider habe ich kein Oszilloskop, dass die geringen Spannungshübe
> darstellen kann.
Das ist doof. Vielleicht schwankt dein Strom wirklich so stark. Irgendwo 
muss sich die PWM schließlich auswirken oder hast du deine Strommessung 
zum PWM-Signal synchronisiert?

von Gustl B. (-gb-)


Lesenswert?

Hast du diese Störungen auch ohne Motor? Oder wenn du dem Motor zeinen 
Strom gibst?

Es könnte ja sein, dass deine PWM gar keine Pulse ausgibt wenn der Motor 
0 A zieht. Und dann stört deine PWM auch nicht den ADC.

Also teste mal ob es der Motor ist der den ADC stört oder die PWM 
Ausgabe.

von was (Gast)


Lesenswert?

Wolfgang schrieb:
> ACS712 ist ein Familienname. Welchen Typ verwendest du?

Den mit +-30A Messbereich, da der Motor bis knapp über 20A ziehen kann 
und auch weil ich keine anderen da habe.

Gustl B. schrieb:
> Das klingt fast so als würde der Motorstrom irgendwie in den ADC
> einkoppeln. Hängt das an der selben Versorgung (gleiches Netzteil und
> wenig Entkopplung)? Hast du im Layout große Schleifen gebaut?

Gleiches Netzteil ja, aber zwischen den 24V für die H-Brücke und den 5V 
für Arduino und Hallsensor ist ein Buck-Converter mit je 1000µF an Ein- 
und Ausgang.

Verbindung zwischen H-Brücke, Arduino und Hallsensor sind jeweils mit 
verdrillter Drillingslitze (GND, 5V, PWM/analog) ausgeführt, weit weg 
von den stromführenden Motoranschlussdrähten.

von Wolfgang (Gast)


Lesenswert?

was schrieb:
> Gleiches Netzteil ja, aber zwischen den 24V für die H-Brücke und den 5V
> für Arduino und Hallsensor ist ein Buck-Converter mit je 1000µF an Ein-
> und Ausgang.
Und der Eingangskondensator für den Step-Down Wandler ist über eine 
Diode von den 24V entkoppelt oder stabilisierst du damit die 
Betriebsspannung für den Motor?

von was (Gast)


Lesenswert?

Gustl B. schrieb:
> mit welchem Strom lässt du
> den Motor tatsächlich laufen?

Schwer zu sagen ohne Oszi, Labornetzteil zeigt 140mA an. Davon kann man 
grob 10mA für die 5V Spannungsversorgung abziehen. Vielleicht erwarte 
ich auch einfach zu viel vom ACS712, aber bei nur 100Hz Bandbreite hatte 
ich schon erwartet, dass die 10-Bit Auflösung des ADC der limitierende 
Faktor wäre.

Wolfgang schrieb:
> hast du deine Strommessung
> zum PWM-Signal synchronisiert?

Nein, ich wüsste bei 20kHz und aktuell 15% duty-cycle auch garnicht wie 
ich das sicherstellen könnte.

Gustl B. schrieb:
> Hast du diese Störungen auch ohne Motor?

Nein, nur wenn der Motor auch tatsächlich angeschlossen ist.

von was (Gast)


Lesenswert?

Wolfgang schrieb:
> Und der Eingangskondensator für den Step-Down Wandler ist über eine
> Diode von den 24V entkoppelt [?]

Ist er, ja.

von Gustl B. (-gb-)


Lesenswert?

was schrieb:
> Den mit +-30A Messbereich, da der Motor bis knapp über 20A ziehen kann
> und auch weil ich keine anderen da habe.

Das führt aber auch zu einem recht schwachen Signal am Ausgang. Das 
solltest du so verstärken, dass es den ADC Eingangsbereich möglichst 
voll ausnutzt.

was schrieb:
> zwischen den 24V für die H-Brücke und den 5V
> für Arduino und Hallsensor ist ein Buck-Converter mit je 1000µF an Ein-
> und Ausgang.

Nur ein Kondensator bringt nicht viel. Da sollte noch ein kleiner 
Widerstand oder ein Ferrit in Reihe sitzen.

was schrieb:
> weit weg
> von den stromführenden Motoranschlussdrähten.

Das ist gut.

Edit:

was schrieb:
> Nein, nur wenn der Motor auch tatsächlich angeschlossen ist.

OK. Also ist es nicht die PWM.

was schrieb:
> Schwer zu sagen ohne Oszi, Labornetzteil zeigt 140mA an. Davon kann man
> grob 10mA für die 5V Spannungsversorgung abziehen.

Das sind aber sehr kleine Ströme. Stimmt das wirklich? Wenn du nur so 
kleine Ströme verwendest, dann ist der Sensor ungeeignet.

was schrieb:
> dass die 10-Bit Auflösung des ADC der limitierende
> Faktor wäre.

Die Anzahl der Bits sagt aber nicht aus wie genau du mit dem ADC 
tatsächlich messen kannst. Gerade von einem ADC der in einem uC 
eingebaut ist würde ich nicht allzu viel erwarten.
Und dann verschenkst du ja viele Bits dadurch, dass du den ADC nicht 
ordentlich aussteuerst.

Wenn dein ADC z. B. von 0 bis 5 V erfassen kann, du aber nur ein Signal 
von 0 bis 2,5 V anlegst, dann hast du 1 Bit verschenkt. Wenn du nur ein 
Signal von 0 V bis 300 mV anlegst, dann verschenkst du schon 4 Bits.

Wenn du den Motor tatsächlich nur mit 140 mA betreibst, dann liefert 
dein Sensor nur 0,14 A * 66 mV/A = 9,24 mV als Signal.
Wenn dein ADC also 5 V Spanne hat, dann ist eine Stufe bei 10 Bits 5 
V/2^10=4,88 mV. Bei dem Schwachen Signal ändern sich also die zwei 
niederwertigsten Bits.

: Bearbeitet durch User
von was (Gast)


Lesenswert?

Gustl B. schrieb:
> Das
> solltest du so verstärken, dass es den ADC Eingangsbereich möglichst
> voll ausnutzt.

Nun, denn Messbereich brauch ich ja aber ziemlich komplett, wenn ich um 
0 herum verstärke kann ich hohe Ströme nicht mehr messen. Wenn ich die 
2.5V Bias rausnehme, kann ich nur noch in eine Drehrichtung messen, auch 
blöd.

Ich seh schon, ich erwarte wohl bei den sehr kleinen Strömen die ich 
hier auf dem Tisch fahren kann ein zu "klares" Signal. Vielleicht 
schauts garnicht so schlecht aus, wenn der Strom >> 1A erreicht, leider 
kann ich das hier auf dem Tisch nicht prüfen, ohne dass mir der Aufbau 
um die Ohren fliegt :)

Danke soweit für die Hinweise und gute Nacht.

von Gustl B. (-gb-)


Lesenswert?

was schrieb:
> Ich seh schon, ich erwarte wohl bei den sehr kleinen Strömen die ich
> hier auf dem Tisch fahren kann ein zu "klares" Signal.

Gut möglich.

was schrieb:
> leider
> kann ich das hier auf dem Tisch nicht prüfen, ohne dass mir der Aufbau
> um die Ohren fliegt :)

Du kannst vielleicht den Motor belasten, dann geht auch der Strom nach 
oben. Den maximalen Strom zieht der Motor dann, wenn er so stark 
belastet wird, dass er sich nicht mehr dreht.

Gute Nacht!

: Bearbeitet durch User
von K. S. (the_yrr)


Lesenswert?

Ändere erstmal VRef auf die internen 1.1V, dann hast du schonmal etwas 
mehr Auflösung. Den Bias solltest du dann auch anpassen.

Dann ändere mal die Verkabelung so, dass du eines der Paare ADC 0/1, 
2/3, 8/9 oder 10/11 frei hast. Dann misst du differentiell, den 
negativen Eingang legst du an GND/Bias vom Sensor bzw. dorthin wo das 
GND/Bias Kabel zum Sensor angeschlossen ist. Die Software muss dann den 
Gain entsprechend anpassen. Wenn das Rauschen aber wirklich vom Signal 
kommt, hilft das auch nur begrenzt.

was schrieb:
> Arduino Mega
Vergiss Arduino für diese Aufgabe und lies das Datenblatt, am besten das 
ganze Kapitel 26.
https://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8-bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf

> Leider habe ich kein Oszilloskop, dass die geringen Spannungshübe
> darstellen kann.
Lass deinen Arduino über die Serielle Schnittstelle (Baudrate schnell 
genug einstellen) die ADC Werte ausgeben und log die am PC in eine 
Datei. Dann plottest du mal die Messwerte, dann sieht man ob das weißes 
Rauschen ist oder irgendwelche Regelmäßigkeiten hat.

was schrieb:
> Wenn ich die
> 2.5V Bias rausnehme, kann ich nur noch in eine Drehrichtung messen, auch
> blöd.
Sowas gehört in den ersten Post. Wie erzeugst du den Bias und ist der 
gut gefiltert? Wenn eine differentielle Messung mit Gain 1 schon hilft, 
hat vermutlich dein Bias Störungen gehabt.

Hast du die Hinweise zur Versorgung des ADC beachtet?

von was (Gast)


Lesenswert?

K. S. schrieb:
> Ändere erstmal VRef auf die internen 1.1V [...]

Sorry, aber deine Antwort geht komplett am Thema vorbei. Das Problem ist 
nicht zu geringe Auflösung des ADC und ein komplett verrauschtes Signal 
noch genauer angucken macht es auch nicht schöner.

K. S. schrieb:
>> Wenn ich die
>> 2.5V Bias rausnehme, kann ich nur noch in eine Drehrichtung messen, auch
>> blöd.
> Sowas gehört in den ersten Post. Wie erzeugst du den Bias und ist der
> gut gefiltert?

Die 2.5V Bias sind eine Eigenschaft des ACS712, war also im ersten Post, 
ich erzeuge da garnichts.

K. S. schrieb:
> Lass deinen Arduino über die Serielle Schnittstelle (Baudrate schnell
> genug einstellen) die ADC Werte ausgeben und log die am PC in eine
> Datei. Dann plottest du mal die Messwerte, dann sieht man ob das weißes
> Rauschen ist oder irgendwelche Regelmäßigkeiten hat.

Wir reden hier von Störungen durch eine 20kHz PWM, so schnell ist der 
ADC und die serielle Schnittstelle nicht als dass man da eine 
Regelmäßigkeit erkennen könnte.

K. S. schrieb:
> Dann misst du differentiell, den
> negativen Eingang legst du an GND/Bias vom Sensor bzw. dorthin wo das
> GND/Bias Kabel zum Sensor angeschlossen ist.

Was soll das bringen? Arduino GND == Sensor GND, auch ohne zweites 
Kabel. Ich würde damit einen ADC Kanal damit beschäftigen durchgehend 0V 
zu messen und dann von meinem Messwert 0 abzuziehen.

von Guest (Gast)


Lesenswert?

Man kann mich gern korrigieren aber die Sample Rate von dem Arduino ADC 
ist doch 10 KHz. Wie willst du bitte sauber ein Signal messen das 
Störungen im Bereich über 10 KHz hat? Da gabs doch mal so einen netten 
Herrn der Nyquist hieß. Selbst wenn du an dem ACS filterst fängst du dir 
garantiert über die Leitungen nochmal was ein. Filtern tut man direkt am 
ADC und nicht Meter weit weg.

von Gustl B. (-gb-)


Lesenswert?

was schrieb:
> Wir reden hier von Störungen durch eine 20kHz PWM, so schnell ist der
> ADC und die serielle Schnittstelle nicht als dass man da eine
> Regelmäßigkeit erkennen könnte.

Du könntest trotzdem mal viele Werte am Stück aufnehmen, auslesen und 
hier posten. Ich mach dir dann FFT und Histogramm daraus.
Wichtig ist aber, dass die Werte mit einer möglichst stabilen 
Abtastfrequenz aufgenommen werden, also der zeitliche Abstand zwischen 
je zwei Werten sollte konstant sein. Und die Abtastrate kannst du ruhig 
schön hoch wählen. Zuerst möglichst viele Werte am Stück und ohne Pausen 
in das interne RAM speichern und dann über UART auslesen.
Weil die Störung ja keine saubere Gleichspannung ist wird man also 
irgendwelche Frequenzen sehen können.

Macht dein Arduino sonst noch etwas was stören könnte?

Du hast das so aufgebaut wie hier 
https://www.marotronics.de/mediafiles/Sonstiges/BTS7960.pdf auf Seite 
22?

Edit:

Guest schrieb:
> Wie willst du bitte sauber ein Signal messen das
> Störungen im Bereich über 10 KHz hat?

Die Frequenz von der PWM wird man selbst nicht sehen, aber vielleicht 
sind auch andere Störungen dabei. Eine Unterabtastung ist es auch nicht, 
wenn er richtig filtert.

Guest schrieb:
> Selbst wenn du an dem ACS filterst fängst du dir
> garantiert über die Leitungen nochmal was ein. Filtern tut man direkt am
> ADC und nicht Meter weit weg.

Exakt! Und dann kann man noch die Spannungsversorgung filtern und die 
Massenverbindung zum ADC. Wenn er aber an der falschen Stelle filtert 
und sich dann auf den Leitungen was einfängt, dann könnte er die 
unterabgetastete PWM sehen.

Wolfgang schrieb:
> Das ist doof. Vielleicht schwankt dein Strom wirklich so stark.

was schrieb:
> DC Bürstenmotor

Könnten das Bürsten sein die da bei so geringer Motorlast einen 
unschönen Stromverlauf erzeugen?

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

was schrieb:
> Wir reden hier von Störungen durch eine 20kHz PWM, so schnell ist der
> ADC und die serielle Schnittstelle nicht als dass man da eine
> Regelmäßigkeit erkennen könnte.
Da schmeißt du viele Dinge in einen Topf. Natürlich kannst du ein 20kHz 
mit einer niedrigeren Frequenz abtasten. Und natürlich kann man dann 
auch Regelmäßigkeiten erkennen - nennt sich Aliasing. Ein Signal mit 
20.1kHz oder 19.9kHz, abgetastet mit 10kHz wird bspw. sauber als 100Hz 
Signal in den abgetasteten Werten auftauchen.
Bei genügend ungeschickter Programmierung und zu langsamer Ausgabe, wird 
man allerdings keine Ausgabe von Werten mit konstanter Abtastfrequenz 
erreichen und das dürfte das Problem werden.

von Wolfgang (Gast)


Lesenswert?

was schrieb:
> Die 2.5V Bias sind eine Eigenschaft des ACS712, war also im ersten Post,
> ich erzeuge da garnichts.

Quatsch, schon mal ins Datenblatt geguckt?
Der Nullpunkt vom ACS712 liegt nicht bei 2.5V, sondern - wie unter 
Common Operating Characteristics nachzulesen bei /VCC*0.5/
Jede Abweichung der VCC von den nominellen 5V schlägt also voll auf den 
Nullpunkt des ACS712 durch. Für Stabilität der Messwerte muss also im 
ADC genau AVCC als Referenz verwendet werden und genau diese saubere 
Spannung auch zur Versorgung des ACS712 heran gezogen werden.

von -gb- (Gast)


Lesenswert?

Da der Sensor nur wenige mA Strom als Versorgung braucht könnte man auch 
eine Spannungsreferenz als Quelle hernehmen. Z. B. eine Shuntreferenz 
mit 4.096 V. Dann dürfen die 5 V etwas Rippel abbekommen.

von was (Gast)


Lesenswert?

Wolfgang schrieb:
> Für Stabilität der Messwerte muss also im
> ADC genau AVCC als Referenz verwendet werden und genau diese saubere
> Spannung auch zur Versorgung des ACS712 heran gezogen werden.

So ist es auch.

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.