STM32 - ESC: Problem mit meinem BEMF

Nov 06 2020

Ich mache einen Regler für meinen BLDC-Motor. Ich habe einen STM32 (um mein PWM zu generieren), 3 IR2101-Mosfet-Treiber (https://www.infineon.com/dgdl/ir2101.pdf?fileId=5546d462533600a4015355c7a755166c) und 6 Mosfets zur Steuerung der verschiedenen Phasen des Motors.

Mein Schaltplan:

Ich generiere meine Phase mit einem PWM auf der High-Seite und einem GPO auf der Low-Seite.

HOHE Seite meiner PWM (Phase A, B und C)

PHASE A (unter 0V!)

Das Signal scheint korrekt zu sein, aber wenn ich meinen Motor anschließe, können wir sehen, dass der BEMF im Vergleich zu einem guten BEMF rückwärts ist.

PHASE ABC

BEMF ABC

Ich versuche, die Frequenz der PWM zu ändern, den Arbeitszyklus oder die Verzögerung zwischen den einzelnen Phasen zu ändern, aber nichts ändert sich (und manchmal ist es schlimmer ...). Hast du eine Idee warum?

Mein STM läuft mit 8MHz. PWM-Frequenz: 900 Hz mit einem Tastverhältnis von 5%. Während dieses Tests verbraucht mein Motor 12 V / 0,8 A.

BEARBEITEN

Ich weiß nicht, warum mein BEMF im Vergleich zu einem guten umgekehrt ist.

Unten sehen Sie meine Phase C (gelb), die virtuelle Masse meines Motors (hellblau), die mathematische Operation Phase C - Virtuelle Masse (dunkelblau) und den Ausgang meines LM339 (pink).

Ich habe beim Stapelaustausch mehrere Themen zu diesem Problem gesehen, aber jedes Mal ist die Antwort nicht klar. ( Geben Sie hier die Linkbeschreibung ein ).

Ich denke, dass meine PWM und BEMF nicht in Phase sind. Ich brauche einige Erklärungen.

Antworten

3 slightlynybbled Nov 10 2020 at 09:10

Willkommen bei StackExchange! Gut gemacht, erster Beitrag.

Sie haben Recht, Ihre Antriebsspannung ist mit Ihrem Motor phasenverschoben.

Sieht für mich so aus, als würden Sie während Ihres PWM-Zyklus an der falschen Stelle abtasten. Stellen Sie sicher, dass Ihre ADC-Probe in der Mitte des PWM-Zyklus auftritt, wenn der PWM-Zyklus hoch ist. Möglicherweise ist ein Mindestarbeitszyklus erforderlich, um eine ordnungsgemäße Probe zu erhalten. Dies ist jedoch möglicherweise nicht der Fall, da 900 Hz eine ziemlich niedrige Frequenz sind.

Es ist schwierig, aus Ihren Scope-Screenshots zu schließen, aber es scheint, dass die Phase auf der niedrigen Seite Ihres PWM negativ und auf der Oberseite Ihres PWM positiv ist. Ihr Code tut also wahrscheinlich genau das, was Sie tun sagen es zu tun, aber an der falschen Stelle im Zyklus.

Ich möchte mein Interrupt-Timing (ungefähr) überprüfen, indem ich einen Pin einrichte, der sich einschaltet, wenn der ADC-Interrupt startet, und ausschaltet, wenn der ADC-Interrupt endet. Daraus kann ich normalerweise gute Informationen gewinnen.

Wenn Sie Ihre ADC-Abtastzeit überprüfen / korrigieren und das Problem weiterhin besteht, veröffentlichen Sie einen Screenshot einer Phase mit steigender Y-Achse in Originalgröße.

Bleib dabei! Probleme werden gelöst, indem Sie den Kopf senken und daran arbeiten. Aber denken Sie daran, wegzugehen und etwas zu schlafen. Probleme sehen morgens ganz anders aus!


bearbeitet, um hinzuzufügen

Aufgrund Ihrer Kommentare habe ich das Gefühl, dass es einige grundlegende Missverständnisse geben kann (ich kann mich irren).

Berechnung der Neutralspannung

Zunächst müssen Sie keine neutrale Spannung messen. Dies ist ein verschwendetes ADC-Modul. Sie können Ihre Neutralspannung berechnen : neutral = (phaseA + phaseB + phaseC) / 3;. Es wird empfohlen, dies für die Geschwindigkeit in eine Festkommanotation umzuwandeln, aber die Mathematik ist korrekt. Das ist ein ADC weniger, den Sie benötigen!

Ihre Neutralität sieht ziemlich korrekt aus. Wenn Sie mental die Mathematik ausführen, die ich gerade beschrieben habe, werden Sie sehen, dass die neutrale Spannung tatsächlich der Durchschnitt (oder fast) der Phasenspannungen ist.

Konfigurieren Sie die Register für die Arbeit

Wenn Sie Ihre TIM1- und ADC12-Register in der Mitte ausrichten und an der Spitze des Zählermodus auslösen, ist keine Berechnung erforderlich, um eine korrekte Abtastung durchzuführen.

Wann pendeln?

In deinem Kommentar hast du geschrieben

Wenn die schwebende Phase - der virtuelle Boden = 0. Wenn es wahr ist, dann kenne ich theoretisch die Wartezeit, bevor ich die nächste Phase auf hoch umwandle

Dies ist nur die halbe Zeit wahr und ich möchte es nur klar formulieren. Beachten Sie, dass die BEMF-Phase abwechselnd in einer Phase ansteigt und in einer anderen abfällt.

if(phaseIsRising){
    if(phaseVoltage > neutral)
        commutate();
}else{
    if(phaseVoltage < neutral)
        commutate();
}

Wenn Sie den obigen Code korrekt implementieren, können Sie den Motor bedienen, jedoch um 30 Grad vorgerückt. Glauben Sie mir, es wird viel besser aussehen als in Ihren Screenshots.

Weitere Arbeit

Wenn Sie so weit kommen, überlasse ich es Ihnen, zu bestimmen, wie das Kommutierungsereignis um 30 Grad verschoben werden soll.