Back-EMF eines Bürstenmotors mit PWM-Signal per sample&hold auslesen

Hallo,

ich bin neu hier im Forum und möchte Euch gerne um Hilfe bei einer Frage zur Motorsteuerung eines RC-Autos bitten. Ich habe die Foren-Suche und google bereits ausführlich bemüht und mir mit allen gefunden Informationen etwas abgeleitet, was ich gerne hier im Forum verifizieren möchte, bevor ich es in der Praxis teste und womöglich meine Motorsteuerung abschieße. Leider sind meine Elektronik-Kenntnisse nicht wirklich gut. Daher möchte ich mich gerne vorab schon entschuldigen, falls ich katastrophale Denk- oder Verständnisfehler habe und entsprechend „dämliche“ Fragen stelle.

Ich möchte gerne die Motordrehzahl indirekt über Back-EMF mit einem Arduino (3,3V Version) messen. Ich weiß, dass das schon öfter mal ein Thema war, aber ich konnte auch nach langer Suche keine eindeutige Lösung finden. Es handelt sich um einen 380er Bürstenmotor, der über eine H-Brücke (Bestandteil des verbauten ESC) betrieben wird. Die H-Brücke wird mit zwei ca. 2kHz PWM Signalen angesteuert. Diese versorgt somit den Motor mit Hilfe eines 2S LiPos (6,6 – 8,4V bzw. Nennspannung 7,4V). Der Motor zieht unter 100% Tastgrad des PWM Signals und Blockade des Motors ca. 30A.

Ich habe einige Varianten zur Drehzahlmessung / EMK-Bestimmung gefunden. Eine stammt von dieser Seite:

Das dort beschriebene Messprinzip mittels Bestimmung des Motorstroms scheint mir aufgrund des hohen Stroms nicht praktikabel, denn bei 30A und ca. 7,4V bräuchte es einen Messwiderstand mit einer irrsinnig hohen Nennleistung.

Bei meiner weiteren Suche bin ich über eine Seite gestoßen, die sehr viele verschiedene Varianten zur sensorlosen Drehzahlbestimmung beschreibt:

Meinen Ansatz habe ich – neben diversen Foren-Threads – von dort vom letzten Abschnitt „Switching Mode Analogue Speed Controller“ abgeleitet.
Da der Motor jedoch die Drehrichtung auch wechseln kann, habe ich die sample&hold-Schaltung zweimal eingebunden, jeweils mit Dioden für die unterschiedlichen Dreh-/Spannungsrichtungen entkoppelt.

Der Screenshot der Schaltung im Anhang zeigt, wie ich mir das ganze vorgestellt habe.
In1 und in2 sind die Eingangssignale für die H-Brücke (2kHz PWM Signal mit ca. 3,3V Pegel).

Hier meine Fragen dazu:

  • Funktioniert das ganze wie beschrieben, oder ist da ein katastrophaler Fehler (oder sogar Kurzschluss…) drin?
  • Falls es gehen könnte, welche Werte bräuchte ich für die Kondensatoren und Widerstände der sample&hold-Schaltungen (R9 bis R12, C1 und C2)? Die im Bild enthaltenen Werte habe ich blind übernommen, da ich die Berechnung einfach nicht verstehe.
  • Welchen Typ an Dioden müsste ich für D5 bis D10 nehmen?
  • Wären 22k und 10k Widerständen für den Spannungsteiler direkt vor ADC1 und ADC2 korrekt, damit ich die „Ausgänge“ EMF_on_in1 und EMF_on_in2 an einen 3,3V Arduino anschließen kann kann? Das sollte doch aus den maximal 8,4V Back-EMF bei Verwendung der 3,3 AVcc Referenz vollkommen verträgliche 2,625V mit genügen Sicherheitsabstand nach oben lassen, stimmt das? Und bei Verwendung der internen 1,1V Referenz könnte ich dann 22k und 2,2k nehmen, richtig?

Ich weiß, sehr viele Fragen… Vielen Dank im Voraus!
Tomato0815

Welchen Zweck haben D9 und D6?
Die anderen 4 Dioden: Schottky Dioden, wenn's denn Disoden sein sollen (Kennlinie beachten). Ev. MOSFET als ideale Diode einsetzen, Link z.B. "Ideale" Diode mit MOSFET - Mikrocontroller.net

Es gibt magnetische Stromsensoren mit einigen mOhm Meßstromkreis-Widerstand wie zB den ACS712-30.

Damit M1 und M2 gesteuert werden können muß eine Spannung zwischen Gate und Source gelegt werden. In diesem Fall ist das Spannungspotential an Source nicht genau definiert. Das Potential wird durch die Collektor-Emittorspannung von Q1 bzw Q2 und dem Spannungsabdfall an D7 bzw D10 bestimmt. und ist keinesfalls 0V der GND.

Zu was brauchst Du M1 und M2?

Ich beschränke meine Antwort mal auf einen der Zweige, analog gilt es natürlich auch für den anderen.

Die Antworten auf die Fragen von zwieblum und von uwefed hängen zusammen. Soweit ich die Erklärungen bei AB-026: Sensorless Speed Stabiliser For A DC Motor - Precision Microdrives verstanden habe, ist die Idee wie folgt:

(Ich beziehe mich übrigens immer auf die Ansteuerung der H-Brücke bei Vorwärts- oder Rückwärtsfahrt, also entweder in1 PWM-pulse und in2 dauerhaft low, oder in1 dauerhaft low und in2 PWM-pulse.)

M1 ist durchlässig, wenn das PWM-Signal in1 high ist. D.h., wenn am Motor in dem Bild links über die H-Brücke "+" (7,4V) und rechts "-" anliegt, dann ist M1 ON und schaltet somit den D6-C1-R10-Zweig gegen 0, damit der Kondensator C1 nicht durch die am Motor von der H-Brücke anliegenden Spannung geladen wird. Erst wenn der PWM Puls low ist und sich Back-EMF aufbaut, ist auch M1 nicht mehr geschlossen und der Kondensator C1 wird nur durch die Back-EMF geladen. Bei ansteigender Flanke ab PWM-Signal in1 würde ich dann den Wert EMF_on_in1 im arduino auslesen.

@uwefed:
Das Spannungspotential zwischen Gate und Source an M1 sollte, wenn ich das richtig verstanden habe, der am Motor anliegenden Spannung entsprechen (abgesehen vom Spannungsabfall an den Dioden). Es sei denn, der ganze Zweig ist wegen D5 + D7 "abgeschaltet", weil die Drehrichtung des Motors sich ändert (in1 dauerhaft low und in2 pwm pulse), also im Bild links am Motor "-" und rechts "+". Dann greift die sample&hold Schaltung auf der rechten Seite im Bild.

So hatte ich das zumindest verstanden. Aber immer wenn ich denke, so langsam habe ich es kapiert, weiß ich im nächsten Moment nicht mal mehr, wo oben und wo unten ist...

Tomato0815:
@uwefed:
Das Spannungspotential zwischen Gate und Source an M1 sollte, wenn ich das richtig verstanden habe, der am Motor anliegenden Spannung entsprechen (abgesehen vom Spannungsabfall an den Dioden). Es sei denn, der ganze Zweig ist wegen D5 + D7 "abgeschaltet", weil die Drehrichtung des Motors sich ändert (in1 dauerhaft low und in2 pwm pulse), also im Bild links am Motor "-" und rechts "+". Dann greift die sample&hold Schaltung auf der rechten Seite im Bild.

So hatte ich das zumindest verstanden. Aber immer wenn ich denke, so langsam habe ich es kapiert, weiß ich im nächsten Moment nicht mal mehr, wo oben und wo unten ist...

Du steuerst M1 mit 0V und +5V gegen GND. Ist das richtig?
Das ist dann die Spannung am Gate.
Welches ist dann die Spannung am Source an M1? nicht GND.
Welches ist dann die Spannung zwischen Gate und Source? nicht 0 bzw 5V

Grüße Uwe

Sorry, habe mich vertan. Ich hatte mich fälschlicherweise auf Source-Drain bezogen, du hattest nach Gate gefragt.

M1 wird am Gate mit 0V und 3.3V (nicht 5V) gegen GND gesteuert.
Ich habe aber das von dir angesprochene Problem des nicht eindeutigen Spannungspotentials verstanden (denke ich). Ich habe die Schaltung angepasst und nehme statt dem zweiten Pol am Motor jetzt GND. Somit ist auch in der in1 LOW Phase das Spannungspotential eindeutig (siehe neuer Anhang).

Durch die Dioden D5 (und D8) sollte das mit den zwei Zweigen ja auch bei Richtungswechsel trotzdem einwandfrei funktionieren, oder übersehe ich da etwas?

Ich habe außerdem R10 (und äquivalent den WIderstand im anderen Zweig) durch einen Spannungsteiler ersetzt, der aus den maximal 8.4V (abzüglich Spannungsabfall durch die Dioden) auf Arduino-verträgliche 3V (3.3V Arduino Version) senken sollte.

Ich habe noch ein paar Fragen zu den weiteren Dimensionierungen:

  1. Als MOSFET habe ich z.B. den hier gefunden: SSM3K15AFU
    Soweit ich das sehe, sollte der ab 2.5V sicher schalten. Die Drain-Source Spannung wird nicht überschritten und auch der max Drain-Source-Strom reicht locker aus, wenn ich mich nicht verrechne.

  2. Spricht etwas dagegen, R9 auf sagen wir mal 10k zu senken? Dadurch lädt doch C1 schneller auf und kann auch bei hohem Duty Cycle an in1 die Back-EMF schneller erfassen, oder nicht? Der maximale Strom für M1 liegt dadurch ja immer noch bei unter 1mA, oder stimmt meine Rechnung da nicht?

  3. Letztendlich sind R9 + C1 doch ein RC-Tiefpass, wenn ich mir das richtig angelesen habe. Ich habe auch diverse Rechner dafür gefunden, verstehe aber die Thematik einfach nicht ausreichend, um die zu bedienen. Ich möchte natürlich so nahe wie möglich an die 100% Duty Cycle rankommen. Natürlich kann man bei 100% nichts mehr messen, weil keine Pulspause für die Back-EMF mehr existiert, aber mal so über den Daumen bis 95% Duty Cycle würde ich gerne erfassen können. Bei ca. 2kHz PWM Frequenz habe ich eine Pulslänge von 500us. Bei 95% Duty cycle, bleiben 5%, also 25us mit Back-EMF, wobei sich diese ja auch erst noch aufbauen muss, also erst ca. im letzten Drittel dieser Zeit wirklich anliegt (ca. 8us).
    Wie gesagt handelt es sich um einen 380er Bürstenmotor, der mit maximal 8,4V betrieben wird. bei ca. 8V zieht dieser unter Volllast (Bockade) ca. 30A.
    Was wären denn sinnvolle Werte für R9 und C1 (und äquivalent im zweiten Zweig), um in meinem Fall die Back-EMF zu messen?

Ich hoffe, ich habe nicht zuviel Unsinn von mir gegeben. Ich gebe mir wirklich Mühe, das Thema zu verstehen und nachzulesen um euch nicht mit zu viel Unsinn zu nerven. :wink:

Edit: Anhang vergessen...

Wie willst Du C1 über den Transistor entladen wenn D6 dazwischen ist?

Die Messung ist immernoch falsch weil der negative Pol des Motors während des Ladens des Kondensators C1 kein Massepotential hat Bzw der Motor Kurzgeschlossen ist.

M1 ist durchlässig, wenn das PWM-Signal in1 high ist. D.h., wenn am Motor in dem Bild links über die H-Brücke "+" (7,4V) und rechts "-" anliegt, dann ist M1 ON und schaltet somit den D6-C1-R10-Zweig gegen 0, damit der Kondensator C1 nicht durch die am Motor von der H-Brücke anliegenden Spannung geladen wird. Erst wenn der PWM Puls low ist und sich Back-EMF aufbaut, ist auch M1 nicht mehr geschlossen und der Kondensator C1 wird nur durch die Back-EMF geladen. Bei ansteigender Flanke ab PWM-Signal in1 würde ich dann den Wert EMF_on_in1 im arduino auslesen.

Wie willst Du die Generatorspannung des Motors messen wenn Du den Motor entweder mit Spannung versorgst in1:H und in2:L oder in1:L und in2:H oder kuzschließt in1:h und in2:H oder in1:L und in2:L.

Du brauchst eine H-Brücke wo alle 4 Leitungstransistoren unabhängig voneinander geschaltet werden können.

Grüße Uwe

C1 soll nicht über M1 entladen werden, sondern über R10+R13.
M1 ist dafür da, dass C1 nicht geladen wird, währen eine Spannung am Motor anliegt, also während in1 H und ln2 L, so zumindest habe ich die Erklärung in diesem Abschnitt "Switching Mode Analogue Speed Controller verstanden"

Ich hatte aus "Rechtsrum – linksrum" entnommen, dass In1 L und In2 L keinen Kurzschluss bedeutet und ich daher in den low Phasen des PWM Signals die EMF messen kann.
Wie eingangs beschrieben sieht die H-Brücke in meinem ESC vermutlich ohnehin anders aus. So ist sie z.B: auch mit MOSFETs aufgebaut und nicht mir Transistoren. Aber sie wird auf jeden Fall nur mit zwei PWM Signalen gesteuert, eins für links-Lauf und einfs für rechts-Lauf. Dabei ist bspw. in2 dauerhaft low und in1 pulst, oder andersrum. Und beide sind high für DC-Bremse. Im Oszi sehe ich in den Low-Phasen des PWM auch ein Back-EMF, daher dachte ich, könnte ich in diesen Momenten messen.

Die Messung ist immernoch falsch weil der negative Pol des Motors während des Ladens des Kondensators C1 kein Massepotential hat

Ok, das verstehe ich. Also muss mein M1 zwar gegen GND gehen, damit dieser auch wirklich abschaltet, wenn der negative Pol des Motors kein Massepotential hat, aber C1 muss gegen den negativen Pol des Motors gehen, richtig?

P.S.: Vielen Dank für deine Geduld! :wink:

So, ich habe jetzt die Schaltung noch einmal umgestellt.
Ich habe verifizieren können, dass der ESC die H-Brücke mit 4 Signalen ansteuert. Es ergibt sich folgendes Bild:

in1 in2 in3 in4
H L H L bremsen
PWM L L H vorwärts
L H PWM L rückwärts
L L L L leerlauf

Den Aufbau und die Zuordnung zu den Eingängen der H-Brücke habe ich daraus abgeleitet. Könnte gut sein. Ich hoffe, dass passt jetzt so.

Wie sieht es denn hierbei mit der Anbindung meiner EMF-Messschaltung aus? Könnte das ganze so funktionieren?
Könnte zusätzlich bitte einer von euch nochmal auf die Fragen zu den Größen der Widerstände und Kondensatoren aus meinem letzten Post gucken?

Herzlichen Dank!

Wenn Du willst daß wir Dir helfen mußt Du uns die genaue Schaltung geben nicht einen Prinzipaufbau.

Grüße Uwe

Grmpf, hab mal wieder den Anhang vergessen...
Sorry. Irgendwie ist in diesem Projekt echt der Wurm drin. :confused:

IMO wurde das alles schon gelöst, bei Schrittmotorsteuerungen mit Stromeinprägung. Dort wird ein Shunt nach Masse benutzt, der den aktuellen Strom liefert der dann zur PWM Steuerung benutzt wird. Man muß nur noch den Soll-Strom vorgeben, ab dem die Regelung zu macht.

Ich kapier's noch immer nicht. Warum verwendest du den MOSFET nicht, um damit direkt den Ladestrom für C1 zu schalten? Warum die Konstruktion mit D5 R9 D6 und MOSGET gegen Masse?

Das funktioniert so nicht.
Du willst einen 1µF Kondensator über einen 47 kOhm Widerstand laden (R9) wo ein Widerstand von 10,7 kOhm (R10 und R13) ihn entlädt. Da hast Du nie die Motorgeneratorspannung.

Grüße Uwe

DrDiettrich:
IMO wurde das alles schon gelöst, bei Schrittmotorsteuerungen mit Stromeinprägung. Dort wird ein Shunt nach Masse benutzt, der den aktuellen Strom liefert der dann zur PWM Steuerung benutzt wird. Man muß nur noch den Soll-Strom vorgeben, ab dem die Regelung zu macht.

Das will er ja nicht. Er will den Motor in den PWM Pausen als Generator nutzen und die Leerlaufspannung messen, die proportional zur Drehzahl ist. Also anstatt einen Servogenerator am Motor zu haben alles mit dem gleichen Motor machen.
Grüße Uwe

Da ist es doch weit einfacher, den Strom zu messen, der durch den Motor fließt. Aufgrund seiner Induktivität ist der Strom ziemlich konstant, egal ob er von der Stromversorgung oder dem Motor als Generator kommt. Und wie das Diagramm zeigt, ist die Drehzahl umgekehrt proportional zum Strom, während die Generatorspannung von der externen Beschaltung abhängt.

Vielen Dank für die zahlreichen Anmerkungen!

@DrDiettrich
Danke für den Hinweis bezüglich Schrittmotorsteuerungen mit Stromeinprägung, das scheint mir aber tatsächlich, wie von uwefed angemerkt, etwas anderes zu sein.
Macht die Ableitung der Drehzahl über die Strommessung nicht eventuell Probleme? Ich konnte nicht ganz nachvollziehen, wie ich damit unterscheide, ob aus dem Stromfluss eine höhere Drehzahl resultiert oder ob nicht einfach nur ein höherer mechanischer Widerstand den höheren Stromfluss hervorruft.

@zwieblum
Ich habe die Konstruktion mit MOSFET gegen GND so von hier: Switching Mode Analogue Speed Controller übernommen. Das habe ich zumindest verstanden, auch wenn es mit ebenfalls etwas umständlich erschien. Da die Transistor / MOSFET Ansteuerung einfasch nicht in mein Hirn rein will, habe ich bei den wechselnden Potentialen in den Low-Phasen des PWM Signals und bei Richtungswechsel des Motors nicht mehr folgen können.
Geht es denn auch direkt mit dem MOSFET, wie von dir vorgeschlagen? Dann kann ich den aber nicht mehr mit den 3,3V schalten, sondern brauche noch ein Step-Up vornedran, oder?

@uwefed
Ok, das leuchtet ein. Wie geschrieben habe ich mit der Dimensionierung von dem ganzen Probleme. Welche Werte wären denn für R9, R10, R13 und C1 praktikabel? Wie gesagt geht es um eine 2kHz PWM Frequenz zur Steuerung der nominal 7,4V (2s LiPo, also 6,6 bis 8,4V) Antriebsspannung, bei der ich gerne auch bei nur noch sehr kurzen LOW-Phasen (falls realistisch gerne bis ca. 95% Duty Cycle) die EMF erfassen möchte. Das Verhältnis für den Spannungsteiler basiert auf dem max 3,3V Inputs am Arduino. C1 soll zwar schnell genug (bzw. überhaupt...) geladen werden können in den ggf sehr kurzen Back-EMF Phasen, muss aber ja auch wieder entladen werden (bzw. etwas an Ladung verlieren), falls sich die Drehzahl verringert und die Back-EMF des nächsten Intervalls geringer ausfällt.

Im Moment versuche ich an dem sehr stark verklebten ESC mit teilweise unkenntlich gemachten IC-Beschriftungen noch herauszufinden, ob das PWM Signal tatsächlich die High-Side steuert und die Low-Side das Permanent-Signal bekommt, oder ob es andersrum geschaltet ist. Wäre das ein Problem, wenn der Motor im Generator-Betrieb mit M1 (bzw. M3 bei der anderen Richtung) noch nach Vdd durchgeschaltet wäre und nur die Verbindung zu GND "pulst"?

DrDiettrich:
Da ist es doch weit einfacher, den Strom zu messen, der durch den Motor fließt. Aufgrund seiner Induktivität ist der Strom ziemlich konstant, egal ob er von der Stromversorgung oder dem Motor als Generator kommt. Und wie das Diagramm zeigt, ist die Drehzahl umgekehrt proportional zum Strom, während die Generatorspannung von der externen Beschaltung abhängt.

Ist bei einem Gleichstrommotor mit Bürsten nicht die Generatorspannung ohne Belastung (Motor dreht sich, Spannung an Klemmen hochohmig abgenommen) proportional zur Drehzahl, während der Motorstrom proportional zur Last sprich abgegebenes Drehmoment ist?

Ja, den Strom zu messen wäre einfacher.
Grüße Uwe

Tomato0815:
Im Moment versuche ich an dem sehr stark verklebten ESC mit teilweise unkenntlich gemachten IC-Beschriftungen noch herauszufinden, ob das PWM Signal tatsächlich die High-Side steuert und die Low-Side das Permanent-Signal bekommt, oder ob es andersrum geschaltet ist. Wäre das ein Problem, wenn der Motor im Generator-Betrieb mit M1 (bzw. M3 bei der anderen Richtung) noch nach Vdd durchgeschaltet wäre und nur die Verbindung zu GND "pulst"?

Hat das Ding keine Typenbezeichnung?

Tomato0815:
Macht die Ableitung der Drehzahl über die Strommessung nicht eventuell Probleme? Ich konnte nicht ganz nachvollziehen, wie ich damit unterscheide, ob aus dem Stromfluss eine höhere Drehzahl resultiert oder ob nicht einfach nur ein höherer mechanischer Widerstand den höheren Stromfluss hervorruft.

Die Drehzahl ist umgekehrt proportional zum Strom, da muß nichts unterschieden werden. Der maximale Strom fließt im Stillstand, wenn der Motor zu stark gebremst wird.