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?
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.
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.
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.
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
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?
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?
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?
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.
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.
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?
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.
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.
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.
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!
Ä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?
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.
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.
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?
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.
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.
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.
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.