BLDC Motor aus alter HDD ansteuern

  • Hallo,

    hier das neue Thema aus: Stepper / BLDC Motor - was kaufen?


    Mein Ziel ist es immer noch, den aktuellen Magnetrührer der auf dem einfachen Schubladenmotor eines DVD Laufwerks und einer extrem einfachen Verbindung von Batterie, Poti und Motor besteht zu verbessern.

    Denn zu zu verbessern gibt es da einiges. ;)


    Jetzt geht es erst mal darum grundsätzlich zu klären ob und wie ich den Motor durch den (gefühlt) besseren BLDC Festplattenmotor ersetzen könnte.


    Hier habe ich mir bisschen was in Arduino und nem Breadboard zusammengestoppelt.


    Meine Hauptquelle ist:

    https://www.youtube.com/watch?v=tPME_zv0vOU


    Warum? Weil ich das mit meiner hier bestehenden Hardware- und Komponentenssammlung nachmachen konnte.

    Keine Driver-Platine, keine MOSFETs oder ICs.


    Wenn ich das 1:1 nachbaue und den im Video verlinkten Code auf den Arduino spiele läuft das ziemlich gut und wie im Video gezeigt.

    (Code kommt unten)


    Wenn ich diesen Code jedoch erweitere um das Poti auszulesen und das Display zu steuern, verhält sich der Motor sehr anders.

    Er ruckt und zuckt, gerade bei Tempowechseln, dazu mache ich gleich mal Videos.


    Zusätzlich bekomme ich die Poti-Werte nicht so schön in 10er Prozentwerte übersetzt, das ist aber eher ein Skill-Problem meinerseits. ;)


  • Auf Anhieb kann ich nix erkennen, mir fehlt gerade aber auch etwas die Zeit.


    Interessant finde ich, dass die für die "direction" tatsächlich Strings verwenden. Normalerweise würde ich da eine enum verwenden, strings auszuwerten kostet sehr viel CPU-Zeit.


    Du hast nicht nur das Display hinzugefügt, sondern auch den Analogeingang. Mach mal wirklich eines nach dem anderen. Evtl. wackelt dein Analogeingang kräftig rum. Ggf. könntest du auch mal probieren, deinen Analogeingang einfach immer auf die Serielle Schnittstelle zu schreiben. Wenn der kräftig wackelt, hast du ein Problem mit der Beschaltung. Wenn der etwas wackelt, dann ist das rauschen. Da könnte es helfen, z.B. über 100 Durchläufe den Mittelwert zu bilden.

    Code
    if(abs(intProzentOld - intProzent) >= 10 ) {

    Hier wertest du aus, ob sich der Wert des Analogeinganges weit genug geändert hat, dass es Wert ist, die Motordrehzahl anzupassen und das Display neu zu schreiben?

    Mach das doch mit dem RAW-Wert und spar dir die CPU-Zeit für die Umrechnung vorher.


    BTW:

    die Arduino-IDE hat m.W. einen Menüpunkt "Autoformat". Wenn die Einrückungen schöner sind, lässt sich das auch wieder einfacher lesen.

  • Das Video sieht wirklich sehr nach einem Timing Problem aus. Eine "quick n dirty" Lösung wäre folgenden Code in eine Funktion zu packen und an verschiedenen Stellen innerhalb von loop() aufzurufen



    also mehrfach zwischen display.clearDisplay() und display.display() und natürlich an die Stelle wo er original steht.

  • Danke für eure Antworten!


    Folgende Tipps habe ich umgesetzt:

    • Direction Strind in boolean gewandelt, geht das schneller im Vergleich?
    • Warteschleife eingebaut, nur noch jedes 1000ste Mal wird der Input gelesen und die Prozente gerechnet
    • Den If Running Teil als Funktion ausgelagert und mehrfach aufgerufen


    Leider hat es überhaupt keine spürbaren Unterschiede erbracht.

    Hier mal der neue Code - habt ihr noch Tipps?


  • Also, ich gebs erst mal auf.

    Ich habe gestern Nacht noch bisschen experimentiert, mir andere Steuerungs-Codes angeschaut die auf Transistoren zum BLDC Ansteuerung basieren.

    Der Effekt ist überall ähnlich, sobald man dem Code etwas hinzufügt, geht es in die Grütze.


    Soweit ich das verstehe, ist Timing hier (BLDC Steuerung) wirklich alles, und das ist für "puren Code" wohl nur möglich wenn absolut nichts dazwischen kommt.

    Irgendwie läuft dass auf nen eigenen IC raus der das dann regeln sollte.


    Scheint so, als hätte ich mir das Schwierigste zuerst ausgesucht um was zu lernen.


    Also ein Schritt zurück, Stepper Motor, nein besser gleich 2 Schritte zurück: Gleichstrom-Motor. Reicht völlig für meinen Rührer und ich kann erst mal Basics lernen.

  • Ich denke, dass vor allem display.println(), display.drawRoundRect() und display.fillRoundRect() relativ lange dauern, daher würde ich ifrunning() nach jeder solchen Zeile einfügen. Vielleicht ist es aber auch einfach display.display() was besonders lange dauert (ich vermute erst da werden alle Daten übertragen), dann hilft am ehesten noch herauszufinden, wie man nur einzelne Abschnitte des Bildschirms ändert. Im Prinzip ändert sich ja immer nur die Prozentzahl und der Balken.

  • Direction Strind in boolean gewandelt, geht das schneller im Vergleich?

    Arbeiten mit Strings sind immer sehr CPU-Aufwendig. Hier wurde immerhin die "String"-Klasse verwendet (statt "string"), dass ist ggf. schonmal effizienter.

    Du musst aber einfach bedenken:

    Bei einem Vergleich muss die CPU jedes Byte vergleichen. Bei einem String "forward" sind das schonmal mindestens 7 Byte, bei einem bool eines und du bist hier auf einer 8/16MHz 8-bit CPU unterwegs.


    Soweit ich das verstehe, ist Timing hier (BLDC Steuerung) wirklich alles, und das ist für "puren Code" wohl nur möglich wenn absolut nichts dazwischen kommt.

    Irgendwie läuft dass auf nen eigenen IC raus der das dann regeln sollte.

    Du könntest auch zwei µCs (Arduinos) dafür verwenden.

    Einer der sich um das HMI kümmert (Human-Maschine-Interface - also Display und Eingabe) und der die Soll-Werte - am besten schon gut aufbereitet - z.B. per I2C an deinen zweiten µc weitergibt welcher den Motor steuert. Das geht dann in die Richtung vom ersten Beispiel, aber statt der seriellen Schnittstelle (und deren Auswertung) die I2C-Kommunikation.


    Also,.. um mal mit Kanonen auf Spatzen zu schießen... ;-)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!