Forum: Mikrocontroller und Digitale Elektronik BLDC dreht CCW schneller als CW?


von BLDC (Gast)


Lesenswert?

Hallo Zusammen,

ich betreibe gerade einen BLDC Motor mit 3 Hall Sensoren an einem 
Atmega48.
Als Treiber verwende ich "1,5 L298". Die Enable Eingänge steuere ich mit 
Soft-PWM an um die Drehzahl des Motors zu regeln.

Ich habe einen Zustandsautomaten geschrieben, der die Anstuerung der 
Spulen in Abhängigkeit der Hall-Sensoren durchführt. Das kalppt soweit 
auch alles super. Jetzt habe ich versucht, den Motor andersrum laufen zu 
lassen. Also habe ich die 6 Ansteuerschritte invertiert. Dreht, aber 
irgendwie langsamer als in die andere Richtung.
Das verwirrt mich etwas, da ich mir das so nicht erklären kann.

Was könnte das sein?

Viele Grüße


Hier die beiden Funktionen für CW und CCW. CCW dreht schneller als CW.
1
void CW(void)
2
{
3
  if(Hall1 == 1 && Hall2 == 0 && Hall3 == 1) 
4
  {
5
      U = 1;
6
    V = 0;
7
  }
8
9
10
  if(Hall1 == 1 && Hall2 == 0 && Hall3 == 0) 
11
  {
12
      U = 1;
13
    W = 0;
14
  }
15
16
  if(Hall1 == 1 && Hall2 == 1 && Hall3 == 0) 
17
  {
18
      V = 1;
19
    W = 0;
20
  }
21
22
  if(Hall1 == 0 && Hall2 == 1 && Hall3 == 0) 
23
  {
24
      U = 0;
25
    V = 1;
26
  }
27
28
  if(Hall1 == 0 && Hall2 == 1 && Hall3 == 1) 
29
  {
30
      U = 0;
31
    W = 1;
32
  }
33
34
  if(Hall1 == 0 && Hall2 == 0 && Hall3 == 1) 
35
  {
36
      V = 0;
37
    W = 1;
38
  }
39
40
}
41
42
43
44
void CCW(void)
45
{
46
  if(Hall1 == 0 && Hall2 == 0 && Hall3 == 1) 
47
  {
48
      V = 1;
49
    W = 0;
50
  }
51
52
  if(Hall1 == 0 && Hall2 == 1 && Hall3 == 1) 
53
  {
54
      U = 1;
55
    W = 0;
56
  }
57
58
  if(Hall1 == 0 && Hall2 == 1 && Hall3 == 0) 
59
  {
60
      U = 1;
61
    V = 0;
62
  }
63
64
  if(Hall1 == 1 && Hall2 == 1 && Hall3 == 0) 
65
  {
66
      V = 0;
67
    W = 1;
68
  }
69
70
  if(Hall1 == 1 && Hall2 == 0 && Hall3 == 0) 
71
  {
72
      U = 0;
73
    W = 1;
74
  }
75
76
  if(Hall1 == 1 && Hall2 == 0 && Hall3 == 1) 
77
  {
78
      U = 0;
79
    V = 1;
80
  }
81
}

von Norbert S. (norberts)


Lesenswert?

Moin,

Hallsensoren verdreht oder haben ein Timing.
In die eine Richtung ist das Timing eben besser.

Gruß,
Norbert

von flupp (Gast)


Lesenswert?

wird der motor mit propeller oder ganz ohne last betrieben?

von BLDC (Gast)


Lesenswert?

Norbert S. schrieb:
> Hallsensoren verdreht oder haben ein Timing.

Verdreht, ich hoffe nicht ;(.
Hier das DB.
http://de.nanotec.com/fileadmin/files/Datenblaetter/BLDC/DB33/DB33S01.pdf



flupp schrieb:
> wird der motor mit propeller oder ganz ohne last betrieben?

Zur Zeit ganz ohne Last, Propeller soll auch nicht dran. Aber heißt wird 
der gute ganz schön, vllt sollte ich doch einen installieren ;).

Danke für die Antworten!

von Harald W. (wilhelms)


Lesenswert?

BLDC schrieb:

> BLDC dreht CCW schneller als CW

Muss man jetzt schon die Worte rechts und links durch
irgendwelche seltsamen englischen Abkürzungen ersetzen?

von BLDC (Gast)


Lesenswert?

Muss man nicht, aber UZS und NUZS fand ich nicht so passend. Immerhin 
hast du ja auch verstanden was mit CW und CCW gemeint war.

Aber ja, mein Motor kann nicht nur CW und CCW, sondern auch rechts und 
links.

Er dreht linksrum schneller als rechtsrum und das kann ich mir nicht so 
recht erklären.

von Karl (Gast)


Lesenswert?

Norbert S. schrieb:
> Hallsensoren verdreht oder haben ein Timing.
Genau das! (Um nicht "This!" zu schreiben ;-))

Wodurch auch immer verursacht, wird der Motor in die schnellere Richtung 
feldgeschwächt. Manche Motoren haben auch konstruktiv bedingt eine 
Vorzugsrichtung.

Wenn es wichtig ist, dass er in beide Richtungen gleich schnell dreht 
(wobei das ohne Last irgendwie witzlos ist), muss der Zeitpunkt der 
Kommutierung richtungsabhängig angepasst werden. Verzögern ist ja 
einfach, wenn man früher Kommutieren muss als das Sensorsignal anliegt, 
kommt man um einen Beobachter der Rotorposition nicht herum. Im 
einfachsten Fall heißt das, die Rotorposition an Hand der zuletzt 
aufgetretenen Signale zu extrapolieren.

von Erwin D. (Gast)


Lesenswert?

Norbert S. schrieb:
> Hallsensoren verdreht oder haben ein Timing.
> In die eine Richtung ist das Timing eben besser.

Gibt's das tatsächlich?
Wird das unter Umständen nur bei bestimmten Motortypen gemacht?
Bis jetzt hatte ich immer mit BLDC zu tun, bei denen es keinen 
Unterschied bezüglich Drehrichtung gab.

von Gruebler (Gast)


Lesenswert?

@ BLDC

Ich sehe in dem Code zwar eine Umschaltung der In-Eingänge (das es sich 
darum handelt, schliesse ich daraus, das Du von der Steuerung der 
Enables durch eine PWM schreibst), aber keine Abschaltung der PWM der 
jeweils dritten Wicklung.

Hast Du die tatsächlich an den Wicklungen liegenden Pegel mit dem Oszi 
nachgeprüft? Der vollständige Code und der Schaltplan wäre vielleicht 
hilfreich. (Du müsstest eigentlich auch 1 1/2 L298 gebrauchen, richtig)?

von Rolf Magnus (Gast)


Lesenswert?

Erwin D. schrieb:
> Norbert S. schrieb:
>> Hallsensoren verdreht oder haben ein Timing.
>> In die eine Richtung ist das Timing eben besser.
>
> Gibt's das tatsächlich?

Warum nicht? Ist bei Gleichstrommotoren ja auch oft so.

> Bis jetzt hatte ich immer mit BLDC zu tun, bei denen es keinen
> Unterschied bezüglich Drehrichtung gab.

Hatten die denn überhaupt Sensoren? Bei einem sensorlosen Motor hast du 
schließlich gar keine Sensoren, die du verdrehen könntest, um dem Motor 
eine Vorzugsrichtung geben zu können.

von BLDC (Gast)


Angehängte Dateien:

Lesenswert?

Hallo, danke für die Antworten!

Ich komme leider erst jetzt wieder zum basteln.

Gruebler schrieb:
> Ich sehe in dem Code zwar eine Umschaltung der In-Eingänge (das es sich
> darum handelt, schliesse ich daraus, das Du von der Steuerung der
> Enables durch eine PWM schreibst), aber keine Abschaltung der PWM der
> jeweils dritten Wicklung.

Ist das nötig? Ich ging davon aus das die dritte Wicklung egal ist, 
solange ich die anderen beide beachte? Zuminest versteh ich das DB so. 
Das X steht doch für don't care, oder?


Gruebler schrieb:
> Hast Du die tatsächlich an den Wicklungen liegenden Pegel mit dem Oszi
> nachgeprüft? Der vollständige Code und der Schaltplan wäre vielleicht
> hilfreich. (Du müsstest eigentlich auch 1 1/2 L298 gebrauchen, richtig)?

Die Spannungen sehen soweit ok aus. 24V Amplitude und ca 120° 
verschoben. (hab nur 2 Oszi Kanäle)
Ja, es sind 1,5 L298 in Verwendung.

Schaltplan habe ich leider keinen, aber die Beschaltung ist 1:1 so, wie 
es im Code steht.

Interessanterweise habe ich was rausgefunden.
Bei CCW beträgt die Stromaufnahme nur 450mA, bei CW gleich mal doppelt 
so viel!
Da muss doch der Fehler liegen.

Code hänge ich an

von Norbert S. (norberts)


Lesenswert?

Moin,

Mach mal bei jedem State die Enable für die nicht genutzte Phase aus. 
Für die genutzten natürlich dann immer an.
Die nicht genutzte Phase muss offen sein und nicht irgendwas von gerade 
vorher.
Eigentlich müsste das aber in beide Richtungen gleich beschissen 
funktionieren, so wie Du das umgesetzt hast.

Gruß,
Norbert

von BLDC (Gast)


Lesenswert?

Norbert S. schrieb:
> Eigentlich müsste das aber in beide Richtungen gleich beschissen
> funktionieren, so wie Du das umgesetzt hast.

Das würde mich ja auch nicht so sehr wundern, aber in die eine Richtung 
geht es recht flüssig, in die Andere eben nicht.

Also EN jeweils abschalten und die ungenutzte Phase als Eingang mit 
aktivierten Pull-Ups?

Danke und viele Grüße

von Norbert S. (norberts)


Lesenswert?

Moin,

Enable aus.
Die ungenützte Phase ist H oder L, wenn der Enable aus ist ist sie offen 
am L298.
Wenn der Pull-up an ist, wäre die Phase H, wenn der Enable an ist.
Ist der Enable aus, ist es wurscht.

Gruß,
Norbert

von Erwin D. (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Erwin D. schrieb:
>> Norbert S. schrieb:
>>> Hallsensoren verdreht oder haben ein Timing.
>>> In die eine Richtung ist das Timing eben besser.
>>
>> Gibt's das tatsächlich?
>
> Warum nicht? Ist bei Gleichstrommotoren ja auch oft so.
>
>> Bis jetzt hatte ich immer mit BLDC zu tun, bei denen es keinen
>> Unterschied bezüglich Drehrichtung gab.
>
> Hatten die denn überhaupt Sensoren? Bei einem sensorlosen Motor hast du
> schließlich gar keine Sensoren, die du verdrehen könntest, um dem Motor
> eine Vorzugsrichtung geben zu können.

Also ich bitte dich :-)
Ich kann gerade so noch 3 Drähte von 8 Drähten unterscheiden.
Und die Software, die eine Kommutation durchführt und dazu die Halls 
abfragt, sieht auch anders als eine sensorlose Kommutation aus. Und und 
und...

Kurzum: Ja, ich bin sicher, daß die Motoren Hallsensoren hatten :-)

von BLDC (Gast)


Angehängte Dateien:

Lesenswert?

Danke, jetzt rennt er in beide Richtungen gleich schnell!

Stromaufnahme ist gesunken auf 175mA (beide Richutungen).

Allerdings habe ich jetzt das Problem, dass ich ihn nicht mehr in der 
Geschwindigkeit regeln kann ;(.

Wie könnte ich das am Besten lösen?

Ich hänge den aktuellen Code nochmal mit an, habe ENA1, ENB1 und ENA2 in 
ENU, ENV, ENW umbenannt, liest sich gleich viel besser.

von Toxic (Gast)


Lesenswert?

Harald W. schrieb:
> BLDC schrieb:
>
>> BLDC dreht CCW schneller als CW
>
> Muss man jetzt schon die Worte rechts und links durch
> irgendwelche seltsamen englischen Abkürzungen ersetzen?

Ich bin mir ziemlich sicher,dass die meisten wissen wofuer die 
Abkuerzungen "CW" und "CCW" stehen aber fuer die,die noch am raetseln 
sind (was weiter auch nicht schlimm ist):

CW = clockwise (im Uhrzeigersinn)
CCW = counterclockwise/anticlockwise (gegen den Uhrzeigersinn)

von BLDC (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe es mit der PWM jetzt hinbekommen, leider brummt der Motor im 
PWM Betrieb ganz schön. Bei 100% läuft er sehr sehr ruhig.

Wenn ich die PWM abdrehe, dann steigt auch die Stromaufnahme sofort auf 
350mA statt der 175mA im 100% Betrieb.

Ich hänge den Code noch mal mit an, eventuell seht ihr ja das Problem.

Viele Grüße und Danke für die vielen hilfreichen Antworten.

von hauspapa (Gast)


Lesenswert?

>Allerdings habe ich jetzt das Problem, dass ich ihn nicht mehr in der
>Geschwindigkeit regeln kann ;(.

Du machst da zwar eine mässig gute Soft PWM,

nur mässig gut weil die Häufigkeit der Ausführung durch die 
Wandlungsdauer des ADCs massgeblich bestimmt wird. Das wird auf deinem 
AVR wohl nicht so besonders schnell sein.

aber vor allem machst Du die Ausführung dieser PWM sofort zunichte indem 
du direkt danach
CW();
aufrufst wo ENU, ENV und ENW sofort überschrieben werden.

Die beiden Signale ENU nach Motorstellung und ENU nach PWM müssen 
logisch verundet werden damit das prinzipiell laufen kann.
Wie man die PWM Frequenz evtl. höher schrauben kann hängt davon ab ob Du 
vom ADC noch andere Kanäle verwenden willst und wofür.

viel Erfolg
hauspapa

von hauspapa (Gast)


Lesenswert?

Sorry das bezog sich auf den früheren Code, ist jetzt besser gelöst.

von hauspapa (Gast)


Lesenswert?

Was passiert wenn Du

ADC_Read(5) auskommentierst und pwm_soll = 50; setzt?

viel Erfolg
hauspapa

von Norbert S. (norberts)


Lesenswert?

Moin,

Der ganze Schrott besteht vermutlich nur aus Jitter bei der Ansteuerung.
- Sinnlos alle Hallsensoren pollen für die Kommutierung
- Darauf noch eine Soft-PWM

Rechne mal aus, wie zufällig da kommutiert wird.

Sehe ich das etwa richtig, daß die PWM 16MHz  256  8 / 100 = 78Hz 
rumkriecht?
Das kann nicht Dein Ernst sein.

Diese Software ist irreparabel, setze das nochmal komplett neu an.
Mit Soft-PWM wird das sowieso nichts brauchbares.

Gruß,
Norbert

von S. K. (hauspapa)


Lesenswert?

Eine kleine Anmerkung noch:
Wenn du alles volatile dekarierst machst Du dem Compiler die Arbeit 
unnötig schwer. Nach meinem (durchaus bescheidenen) Verständnis ist das, 
so wie der Code dasteht, nur für "PWMCounter" nötig.

Wenn die Flaschenhälse raus sind kann man ja auch mal Optimierung mit o2 
oder o3 probieren. Obwohl es da vermutlich nicht viel zu optimieren 
gibt.

von Norbert S. (norberts)


Lesenswert?

Moin,

Das kann so nicht funktionieren.
Die PWM-Frequenz ist viel zu langsam.
Das kriegt man mit Soft-PWM vielleicht hin aber nicht so primitiv.
Besser wäre Hardware-PWM, was der Controller durchaus hergibt.

Gruß,
Norbert

von Gruebler (Gast)


Lesenswert?

@ BLDC

Na gut.

Der Lerneffekt war ja erstmal, dass die Enable der nicht benutzten Phase 
abgeschaltet werden; und X nicht don't care sondern "don't bestrom" 
heisst.

Siehe meinen Beitrag "Re: BLDC dreht CCW schneller als CW?" und 
Norberts nachfolgenden Post, der meinen Hinweis nochmal in eine 
Anweisung umformuliert hat. (Tut mir leid Norbert, aber mein Ego braucht 
das. Danke).

Jetzt machst Du das nochmal von vorne und nun, in dem Du die 
Hall-Sensoren per Interrupt erledigst und die PWM mit dem PWM-Modus 
eines der Timer. Dann klappt das auch schon rund.

von Gruebler (Gast)


Lesenswert?

Die 78Hz, da hat Norbert ganz recht, sind zu langsam. Da würde ich als 
Motor auch rumwürgen.

Und in meinem letzten Post habe ich diesmal Norbert paraphrasiert. 
Hoffe das gleicht die Bilanz ein wenig aus. :-)

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.