Forum: Mikrocontroller und Digitale Elektronik BLDC mit konstanter Drehzahl


von Stefan H. (cheeco)


Lesenswert?

Ich plane gerade einen sehr einfachen Prüfstand basierend auf einem 
Raspberry Pi und einem Festplattenmotor. Dabei wird ein Prüfling mit 
einem Festplattenmotor gedreht und einer Frequenzanalyse unterzogen. 
Damit meine Messung funktioniert, muss dieser absolut synchron laufen 
(d.h. über mehrere Stunden Messung muss die Software wissen, wie viele 
Umdrehungen der Motor gemacht hat). Eine Drift in der Drehzahl würde die 
Messung zerstören.

Alternativ könnte der Motor auch mit schwankenden Drehzahlen arbeiten, 
solange das aktuelle Geschwindigkeitssignal (Tacho) in der Software 
bekannt ist.

Zu allem Überfluß sollte das ganze auch noch einfach nachzubauen und 
billig sein, am besten mit fertigen Modulen, und ohne größere 
Spezialkenntnisse.

Die erste Idee ist es, einen Modellbau-Brushless-Controller (Turnigy 
o.ä.) zu nehmen und mit dem RPi anzusteuern. Damit läuft der Motor 
schön, aber die Drehzahl ist weder konstant noch leicht zu messen.

Im Moment überlege ich mir gerade, mit Halbrückenmodulen (L298) den 
Motor direkt über den RPi blind zu kommutieren. Dann kenne ich zwar die 
Geschwindigkeit genau, allerdings läuft der Motor nicht besonders schön, 
außerdem ist es Aufwand.


Kennt jemand von euch eine Idee, wie man einen Festplattenmotor stabil 
mit einer Frequenz ansteuern kann, oder wie man alternativ die Drehzahl 
direkt bestimmen kann?


Stefan

von John P. (brushlesspower)


Lesenswert?

Stefan H. schrieb:
> Die erste Idee ist es, einen Modellbau-Brushless-Controller (Turnigy
> o.ä.) zu nehmen und mit dem RPi anzusteuern. Damit läuft der Motor
> schön, aber die Drehzahl ist weder konstant noch leicht zu messen.

Die Drehzahl ist sehr schön zu messen, einige Controller haben einen 
Telemetrie Ausgang wo die Drehzahl via UART übertragen wird.
Schwanken tut sie allerdings weiterhin.

Stefan H. schrieb:
> Kennt jemand von euch eine Idee, wie man einen Festplattenmotor stabil
> mit einer Frequenz ansteuern kann, oder wie man alternativ die Drehzahl
> direkt bestimmen kann?

Wenn die Drehzahl absolut stabil sein soll, musst du den Motor 
zwangskommutieren. Sobald die kommutierung in einer geschlossenen 
Regelschleife (Blockkommutierung der FOC) läuft hast du Schwankungen!
Wenn der Motor ruhig laufen soll, kannst du eine 3 Phasen Sinus PWM 
generieren und die Frequenz via Mikrocontroller oder RPi einstellen. Der 
Motor wird dieser Frequenz folgen. (Sofern Strom und Spannung 
ausreichend vorhanden sind ;))
Sowas habe ich schon gemacht. Ist ein ähliches Prinzip wie bei Gimbal 
motoren, nur das du sie dann 360° drehen lässt.

: Bearbeitet durch User
von ÄXl (Gast)


Lesenswert?

Alles Richtig soweit! Bis auf "Gimbal". Darauf hätte ich jetzt nicht 
referenziert.
beim GIMBAL werden Brushless-Motore verbaut. Das ist dann aber auch 
schon die einzige Gemeinsamkeit.(Sowas hab ich auch schon mal gebaut. 
Zwar nur xy-Betrieb mit zwei Motörchen: aber funktioniert)

Du hingegen brauchst quasi einen Frequenzumrichter, welcher eine feste 
Frequenz vorgibt. Der Motor muss also gesteuert werden und es muss 
sichergestellt sein, das alles so dinmensioniert ist, dass er dem 
Wechselfeld auch folgen kann.
Schrittmotor mit drei Phasen mit "nanomikroschrittbetrieb".
So hätte ich es umschrieben.
Sinusmodulierte PWM mit 120° Phasenversatz, Rampe und langsam auf 
Nenndrehzahl hoch. Zwangskommutiert dort belassen. Sparst Du dir das 
Tachosignal.
Oder über ne PLL doch übers Tachosignal geregelt.
"Aber einfach und Billg ohne Fachkenntnis" wird das dann nix.

von Stefan H. (cheeco)


Lesenswert?

Hallo brushlesspower,

der UART-ausgang hört sich prinzipiell gut an. Allerdings weiß ich 
nicht, ob eine interne Geschwindigkeitsmessung genau genug ist (im 
Endeffekt interessiert mich die Anzahl der Umdrehungen nach vielen 
Stunden), und beim zurückrechnen können Fehler entstehen. Kennst du 
billige (ca. 10-20€) komerzielle ESCs die einen solchen Ausgang haben, 
und die man eventuell umprogrammieren kann? Gibt es auch welche, die 
einen direkten Tachoausgang haben(Pulsausgang)?

Zur Sinus-Zwangskommutierung:

Bei meiner (relativ kurzen) Recherche habe ich Diagramme gesehen, wie 
die Waveformen aussehen müssen, allerdings habe ich keinen Beispielcode 
gefunden. Kennst Du eine Quelle, wo jemand sowas schon gemacht hat und 
den Code zur Verfügung stellt?


Danke!

Stefan

von Jonny O. (-geo-)


Lesenswert?

Alternativ kannst du auch die Spannung an einer Phase messen und somit 
auf die Drehzahl schließen oder schlicht und einfach die Umdrehungen 
zählen. Das ist jetzt nicht besonders kompliziert. Nach einer Zeit t 
hättest du dann eine Zahl y, welche die Anzahl der Umdrehungen 
wiedergibt. Die Drehzahl muss dann ja nicht konstant sein, wenn es dir 
nur um die Anzahl der Umdrehungen geht.

von John P. (brushlesspower)


Lesenswert?

Stefan H. schrieb:
> Kennst du
> billige (ca. 10-20€) komerzielle ESCs die einen solchen Ausgang haben,
> und die man eventuell umprogrammieren kann?

https://n-factory.de/Betaflight-BLHeli_32-35A-2-6S-ECS


(Fast?!) Alle Blheli_32 Controller haben Telemetrie. Je nach Modell mit 
oder ohne Spannung/Strom. Aber immer mit Drehzahl.
Du musst nur einen Controller nehmen wo der Telemetriepim als Lötpad zu 
verfügung steht.

Stefan H. schrieb:
> Allerdings weiß ich
> nicht, ob eine interne Geschwindigkeitsmessung genau genug ist

Besser als der Motorcontroller selber wird es niemand wissen. Er 
kommutiert ja schließlich mit dieser Drehzahl. Alles was du extern 
irgendwie misst, wird ungenauer sein.

Stefan H. schrieb:
> Kennst Du eine Quelle, wo jemand sowas schon gemacht hat und
> den Code zur Verfügung stellt?

Puh...kommt halt auf deine Hardware an.
Habe das mal mit einem STM32 gemacht. Aber eigentlich sind das auch 
"nur" 10-20 Zeilen Code? Je nach Hardware mehr oder weniger Zeilen. ich 
versuche es mal grob zu erklären:

erzeuge dir ein Array mit 360 Werten (oder mehr oder weniger)

Array[0] = sin (0)
Array[1] = sin (1)

generiere 3 PWM ausgänge und ändere ständig die pulsbreite
for(i=0, i<359, i++){
PWM1 = Sin(i+0°) bzw Array[i+0]
PWM2 = Sin(i+120°) bzw Array[i+120]
PWM3 = Sin(i+240°) bzw Array[i+240]
delay(x);
}

je kleiner dein Delay desto höher ist die drehzahl

Achtung...sehr grober pseudo code



Stefan H. schrieb:
> (im
> Endeffekt interessiert mich die Anzahl der Umdrehungen nach vielen
> Stunden)

Dann einfach einen Interrupt eingang der hochzählt bei jeder umdrehung.
Entweder mit einem Hallsensor, oder einem Komperator an einer der 
Phasen.
Das ist das einfachste

: Bearbeitet durch User
von John P. (brushlesspower)


Lesenswert?

ÄXl schrieb:
> Alles Richtig soweit! Bis auf "Gimbal". Darauf hätte ich jetzt nicht
> referenziert.
> beim GIMBAL werden Brushless-Motore verbaut. Das ist dann aber auch
> schon die einzige Gemeinsamkeit.(Sowas hab ich auch schon mal gebaut.
> Zwar nur xy-Betrieb mit zwei Motörchen: aber funktioniert)

Die Referenz war vielleicht nicht ideal. Aber von der funktion her passt 
es weil brushless gimbal motore auch mit einer Sinusmodulation in 
position gebracht werden.
und dazu gibts viel open source code.

von Pat P. (tsag)


Lesenswert?

Hi,

ich habe das (bzw. bin dabei) das ganze mit einem Arduino und dem 
DRV8313 aufzubauen. Auf dem Steckbrett funktioniert es bereits.

Als Code referenz habe ich diesen hier genutzt, funktioniert (soweit ich 
das noch im Koopf habe) out of the box.

https://github.com/cmasenas/3-Phase-Sine-Arduino

Angefangen habe ich mit diesem Board: 
https://www.ebay.de/itm/Storm32-BGC-32Bit-3-Axis-Brushless-Gimbal-Controller-V1-31-DRV8313-Motor-Driver/282734517878?hash=item41d44a5e76:g:CAsAAOSwH09ZECSM:rk:1:pf:0

und dort meinen Arduino zwischen gehangen.

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.