Introduction: Arduino CDROM BLDC Motor Driver, Enhanced Performance

In the last BLDC project "Run-A-CDROM-Brushless-Motor-With-Arduino" I've used a L293 to drive a brushless DC motor. There were two important problems in that project as follow:

- Low speed and torque of the motor due to minimal signaling.
- IC overheating due to signal feedback.

In this project I solve these problems via additional L293 and corresponding hi impedance state. According to grand Wikipedia, Hi-Z (or High-Z or high impedance) refers to an output signal state in which the signal is not being driven. The signal is left open, so that another output pin (e.g. elsewhere on a bus) can drive the signal or the signal level can be determined by a passive device.

As I mentioned before, each BLDC complete turn, needs 36 steps that each 6 steps are similar as next 6 steps. So you have a sequence of 6 which repeated 6 times.

Due to having just one IC, I've used the (110, 100, 101, 001, 011, 010) signals with two states 1=high, 0=low in last project. But the correct signaling for each step is to drive two of three phases and leave the third one open (hi-z).

With three phase A, B and C:
A: 1 1 - 0 0 -
B: - 0 0 - 1 1
C: 0 - 1 1 - 0

In this table the "-" state means hi-z. So there one low and one high signal in each step. Having multiple low or high in each step will lead to wrong signal feedback and IC overheat.

Step 1: Circuit

In this project I used the chip enable pin to make hi-z state. According to l293 schematic, there is two enable pins, each one for each side. So we can make four hi-z pins via two l293 (three of them are enough).

So this circuit is a little bit different from the last one. The pins 2, 3, 4 are enable signals and 5, 6, 7 are motor input signals. Whenever the enable pin be low, the signals will be hi-z.

Step 2: Code

As the code has written optimized, some hints maybe helpful.

- In signals array, first index is the number of hi-z pin. Remaining 3 values are signal values.
- Wait value is used to make a delay after each step.
- Serial monitor window is used to get "+" or "-" to increase or decrease wait value and it will changes the motor speed.



* *




Muhin555 (author)2017-05-04

This project can be used in 3D foto.

ReconIII (author)2016-10-29

I have a HDD motor powered using this, is there any way increase the RPM more? I am only getting 500rpm, it would be great to get 3,000 or so. I have a small hdd controller board that with the same amount of power can easily get several thousand rpm.

ateebhassan000 (author)ReconIII2017-04-13

I am also working to control HDD motor with Arduino....Will you please help me in this...?

p7ge (author)2016-06-02

Hello m-shams,

thank you very much for this, but I think there is a mistake in the arduino code, which cause not reaching all signalstates. The double for-loop in the loop() function are constraint by phases and pinmodes which reaches at least only the third signalstate of six states.

To reach all states the first loop has to be constraint by sigcycle and the second one by phases. Is it right?

m-shams (author)p7ge2016-06-04

Thanks a lot for your attention. There was a problem in loop.

I've attached the correct source code: brushless_motor_2ic.ino

DavidP227 (author)2015-12-31

Thanks, this is very helpful.

m-shams (author)2014-08-26

3 tips:
1. Change the motor pin order to find the correct state.
2. Change the wait value to find if it's enough.
3. Increase the voltage as by your motor type maybe needed.

kavish laxkar (author)m-shams2015-07-21

plz sir rply...i stucked at one.:( :( made 3 times but still not working.plz answer.

-->how can i find the correct pin order.?

->how can i connect the motor directly using power supply...there r three pins...but d power supply has only two.?

Samiran (author)kavish laxkar2015-09-17

Dear Kavish, I think you have a star connecyion of 4 wires with RYBN sequence. use a multimeter to see resistance between them . The pin with which all other pins will have the lowest resistance is the neutral or ground pin. I will get back with the correct operating sequence. hope fully use the eairlier instructable of M-shams and keep the neutral pin grounded.

kavish laxkar (author)Samiran2015-09-27

ok let me try to find it out..and if had prob again i will get back to u.:)

snoop911 (author)2015-08-12

What's the maximum voltage these set-top-box motors can take? It'd be nice to use TI"s DRV8301, but the minimum voltage is 6V.. similar with other drivers (BD7959EFV, MC33033 , KA3080, etc)

There is also a nice write up of a custom igbt inverter driver here:

kavish laxkar (author)2015-07-08

great instructable --> i have did the same like schematic even my motor is not working...sir plz help..:(

m-shams (author)kavish laxkar2015-07-08

Actually it depends on your motor type. You may need more external power to drive the motor or maybe you have used a wrong pinout on motor.

Attach a closeup photo of your motor.

kavish laxkar (author)m-shams2015-07-10

i think i am using as is the attachment.

m-shams (author)kavish laxkar2015-07-10

Are you sure you use a correct pinout?
Use a power supply and connect the voltage directly to your motor pins,
for correct 3 pins it should be a sudden movement.

I suggest you to remove the ribbon cable and use a better cable because it may have a lose connection to your breadboard.

kavish laxkar (author)m-shams2015-07-11

-->how can i find the correct pin order.?

->how can i connect the motor directly using power supply...there r three pins...but d power supply has only two.?


plz sir rply...i stucked at one.:( :( made 3 times but still not working.plz answer.
-->how can i find the correct pin order.?

->how can i connect the motor directly using power supply...there r three pins...but d power supply has only two.?

m-shams (author)kavish laxkar2015-07-21

If your motor has just 3 pins, you dont need to find correct pins by direct power supply.

Change pin order to find the correct pinout.

Increase external voltage.

zumpappero (author)2014-08-26


i've tried to follow your instructions but my cd rom motor doesn't work. It only vibrates a little bit without rotation. what could be the problem?

Thanks in advance

throbscottle (author)2014-08-22

This is really nice - I wondered what to do with these things!

But that breadboard layout is hard to follow - can you get Fritzing to do a proper schematic as well please?

m-shams (author)2014-07-21

I didn't use monitoring. As you can see in the schematic, the forth (bemf) pin left unused.
I will postpone it to the next project, having a better performance via motor feedback.

carlos66ba (author)2014-07-21

Very interesting, but can you explain how the monitoring of the motor actually is done? Thanks.

m-shams (author)2014-07-20

I've added some details to intro

Mojo_JoJo (author)2014-07-20

Just what I needed. I happen to have an HDD spindle motor and was wondering how to drive it. Can you elaborate the signal feedback issue and also provide a circuit diagram if possible of the driver circuit.