Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

BLDC Motor Control without ESC or Drivers

Status
Not open for further replies.

S P

New Member
Hi all,

I am essentially working on a research project in a lab where we would like to synchronize multiple Brushless DC motors or offset their phases (30 degrees offset, perfectly synchronized, etc.). Therefore, we are attempting to control a BLDC motor by powering the 3 coils in the proper sequence with a set time delay between each phase. The proper way to control a BLDC motor is to either sense the back EMF or use Hall Effect sensors to determine the position of the rotor and energize the next coil at the perfect time. In our case, this is not an option because having sensors determine when to energize the next coil would take away the ability to precisely control the motor's rotation or know its exact position.

Our current approach is this: Using an Arduino Mega 2560 and a circuit assembled according to the schematic below (without the IGBT/MOSFET drivers), we have Arduino code which uses the six-phase commutation sequence shown in the second image. Instead of waiting for a sensor to trigger the next phase, we have each phase occur after a set time delay that can be altered in the code. For example, I can set the time delay to 900 microseconds, so that each phase in the sequence stays on for 900 microseconds before switching to the next. Using this approach, we have successfully gotten the motor to rotate, but are facing two main problems:



1) The motor requires a "kick" to begin rotation. Meaning that I have to spin it by hand and then it continues rotation based on the powering of the coils; if left on its own to start, it usually just twitches or moves erratically.
2) The motor only reaches about 10% of its rated RPM. The datasheet estimates about 10K RPM with no load (motor is a 980 KV BLDC) but we have only obtained about 1100 RPM. This is more confusing because increasing the voltage (i.e. from 6 to 12V) and reducing the time delay to compensate for the expected increase in speed from the higher voltage (higher voltage to the coils should make them snap from one to the next faster, so the time delay must be decreased) does not increase RPM whatsoever. It just makes the electric noise from the motor louder, and the vibration of the motor intensifies.
Is there any advice you have or any additional info that would help? If there is anything I have left out, please let me know. Also, if there are viable alternatives to achieving our goal of precisely controlling a motor's rotation, please let me know.

3-phase-Bldc-Motor-Control-With-Sensorless-Back-emf-Adc-Zero-Crossing-Detection-Using-56f80x-circuits.jpg

Schematic for BLDC control

**broken link removed**
Sequence to energize coils of BLDC
 
Your first problem sounds as though you are not allowing sufficient time for the motor to accelerate (given its mechanical inertia) and/or for current to build up in the motor coils (given their inductance).
 
The proper way to control a BLDC motor is to either sense the back EMF or use Hall Effect sensors to determine the position of the rotor and energize the next coil at the perfect time. In our case, this is not an option because having sensors determine when to energize the next coil would take away the ability to precisely control the motor's rotation or know its exact position.

Your missing the main point of running a BLDC motor. The sensors are needed. You can't just randomly send pulses to the stator poles and hope for the best, they need to be timed to the position of the stator and rotor poles. How are you synchronizing the two shafts of the motors? If they are just free turning and not tied together if one is looser than the other it could get out of sync when shutting down(coasting to a stop). Too many things are not being explained in your question.
 
+1 one on sensors.
You also need to know the pole count/rev.
The PDF show the AC produced relative to the commutation sensors produced by a back fed motor to generate the sine wave for each phase.
The pole count can be acquired by shorting all three phases and turn the motor shaft and count the 'bumps' .
If you use feedback to acquire the rotor position, you have to exercise the motor slightly to find the position electronically.
Max.
 

Attachments

  • commutation.pdf
    136.6 KB · Views: 468
You dont need to know the actual position of the motor, however you need to know the electrical position, the 2 are not necessarily the same.
It ought to be possible to do what you say, though one arduino might not be enough, you might be better with a attiny85 for each motor and a sync signal input to each one or something like that.
I've been playing with the idea of driving a bldc with software, and recently found this:
https://electronoobs.com/eng_circuitos_tut4.php
The code as you can see is remarkably simple, and this code senses the electrical position of the motor using back emf from the undriven winding.
I havent got around to putting a circuit togther and testing this yet, however I reckon I can improve on the code a bit, writing individual bits on the i/o port is slow with the 'duino, better to do them all at once.
If you modded the code you might be able to sync more than one motor to each other, exact speed shouldnt be too hard, exact position would be really tricky but still probably doable, you'd need some kind of phase lock technique.
 
1) The motor requires a "kick" to begin rotation. Meaning that I have to spin it by hand and then it continues rotation based on the powering of the coils; if left on its own to start, it usually just twitches or moves erratically.

I suggest starting out with a longer delay between pulses and progressively decreasing the delay to accelerate the motor.

2) The motor only reaches about 10% of its rated RPM. The datasheet estimates about 10K RPM with no load (motor is a 980 KV BLDC) but we have only obtained about 1100 RPM. This is more confusing because increasing the voltage (i.e. from 6 to 12V) and reducing the time delay to compensate for the expected increase in speed from the higher voltage (higher voltage to the coils should make them snap from one to the next faster, so the time delay must be decreased) does not increase RPM whatsoever. It just makes the electric noise from the motor louder, and the vibration of the motor intensifies.

If possible, try experimenting with varying the driving pulse width in addition to varying the delay between pulses.
 
Status
Not open for further replies.

New Articles From Microcontroller Tips

Back
Top