Driving a three-phase brushless DC motor with Arduino - Part 1. Theory

Driving a three-phase brushless DC motor with Arduino – Part 1. Theory

Typical CD/DVD Spindle BLDC Motor With 12 Magnetic Poles and 9 Wound Cogs

Typical CD/DVD Spindle BLDC Motor With 12 Magnetic Poles and 9 Wound Cogs

This is the first part of what will probably be two (or more) posts describing one of my latest projects – an Arduino Stroboscope based on the spindle motor of a broken Xbox 360 DVD drive. I will save some practical information (like why I chose Xbox’s drive) for the second post. Here I wanted to concentrate on the theory behind using Arduino or another MCU to drive a three-phase Brushless DC electric motor such as a CD or DVD drive (or HDD for that matter) spindle motor, such as the one pictured further in the text.
A disassembled CD/DVD brushless DC spindle motor

A disassembled CD/DVD brushless DC spindle motor

The diagram above as well as the photo to the left show a typical CD/DVD drive spindle motor design with 9 cogs and 12 magnetic poles. The main principal of driving such a motor is a particular sequence of commutation of the stator windings that creates several points in which the windings attract magnetically opposite poles of the rotor with maximum force. Looking at the animation below, you’ll see that this particular configuration of the BLDC motor (12 poles, 9 cogs) creates three points of maximum attraction in each of the 36 steps that make up one complete rotation. The three points move around due to the commutation sequence and that change in magnetic field directions “drags” the poles of the rotor around with it.

It may be a little easier to watch the movement of the magnetic field on the animation that follows. The animation can be paused on any step and you can move straight to the step you want if you hover your mouse above the step’s number in the navigation menu. Go ahead, play with it! We’ll be right here when you come back :) While you’re at it, see if you can spot those three points with maximum attraction force in every step. They are always in different places but they are always there.

The south poles are marked with RED and the north poles are BLUE. The poles are so marked in accordance with the commonly accepted naming convention. The direction of the magnetic force is defined by the right hand rule: if the palm of the right hand follows the direction of the current (i.e. goes around the cog as the wire does, current flowing from HIGH to LOW), the thumb points in the direction of the magnetic field. The point where the magnetic field lines are originated from is called NORTH and the thumb is pointing in the direction of SOUTH.

The spots where the red dot on the winding corresponds with the blue pole of the rotor are the maximum attraction points.

The animation above was made based on several assumptions. One of them of course is the motor configuration – 12 poles, 9 cogs. Another one is that the least possible amount of MCU outputs is used to drive the motor and the driver circuitry is the simplest. I am going to have to save the circuitry for another post but suffice it to say here that the easiest implementation from the hardware stand point requires us to drive the winding either HIGH or LOW. That requires only three digital I/O pins and a very common H-bridge IC such as SN754410. There’s another possibility, too: we drive only two windings at a time and leave the third one open so no current is flowing through it and no magnetic force is generated, but that requires using 6 I/O pins and 6 discrete transistors. The benefit of the 6-pin scheme is better efficiency and torque due to lack of secondary, smaller magnetic forces pulling in the wrong direction.

Counting BLDC rotor poles using iron shavings on a piece of paper

Counting BLDC rotor poles using iron shavings on a piece of paper

By the way, it may not be apparent that the rotor is magnetized the way it is, with 12 poles, but using the old physics class trick with iron shavings things become much more clear. Unfortunately, this requires disassembly of the motor but if you are careful, you can easily put it back together – the permanent magnet shroud is press-fitted to the axis that sticks out of the ball bearing in the middle of the stator. If you were careful taking it off, you can always put it back in reverse.
Not all BLDC motors have 12-pole rotors and not all stators have 9 cogs, so it may help to search for relevant documentation or even open the motor if less intrusive methods are not available. Hard drive spindle motors often have 12 cogs, for example. However, for a relatively recent (~10 y.o or less) CD/DVD/Bluray spindle motor it’s pretty safe to assume 9 cogs/12 poles. This will be a crucial piece of information when we turn to the hardware and firmware implementation based on Arduino. See the next installment of this mini-series!

To continue your BLDC education and learn more than you ever wanted to know about BLDCs, head straight for Brian Mulder’s Electric Motors, Part 1-5 series of articles on the Southern Soaring Club Web site

Special thanks to Mike Alsup (malsup) for creating the JQuery Cycle plugin used in the animation

7 Responses to “Driving a three-phase brushless DC motor with Arduino – Part 1. Theory”

Leave a Reply

Or use the Forums ! If your comment is a question, please consider posting it to a matching section of our Electronics Forums. The forums allow for a more natural conversation flow, especially if multiple replies are required. Additionally, you'll be able to style your writing (bold font, italics etc.) and post images which can help with a good answer.

Notify me of followup comments via e-mail. You can also subscribe without commenting.


Coming soon ...

Recent Comments
  • admin: I think you are correct, LinuxCNC should be able to control it using a more widely available CNC servo...
  • Kunkmiester: Do you know what kind of encoders the motors use? Gecko and others make servo drivers, so if the encoder...
  • admin: Hello Dani, thanks for checking in. No, in this particular case the common wire should be left unconnected....
  • Dani: Your code worked well on my salvaged spindle motor, thanks for sharing!! By the way, I found other spindle...
  • rufz: did you take out that bulky rectangular lens?
  • Andreas Carmblad: Hi. I have some problems getting this to work. Can you help me? The code looks like this and all...
  • Andreas Carmblad: Hi again I’m trying to make this work. I have soldered everything together and I have...
  • Dovale: Hi I assamblled the system with Mercury stepper motor . The motor rotates but no response from the switches....
  • sam: sir i cant trace the Positive and negative of that LD. can u help me please??
  • Chanceleir: Hello and thanks for the detailed expalnation Actually I am trying to install energia on my 64 bit Ubunto...