Back-EMF speed detection in motors

Mar 22, 2013 95 Replies

I'm working on a project that involves replacing some existing electronics with some that I've designed. It's controlling the speed of DC brushed motors. Since the original equipment uses a knowledge of the applied voltage and the motor current to infer back EMF and therefor motor speed, that's what I've done, too.



My problem is that my equipment is consistently sensing the speed as being faster than it really is, by a constant amount -- except when the motor is stalled, when the reading is correctly zero. So I end up servoing the motor speed to a figure that's a 20-30 RPM higher than desired.



It's not just a mis-calibration of the motor torque constant or the resistance -- if that were the case, then the motor speed error would depend on the command speed or the applied torque. I can easily calibrate out any dependence on torque (by adjusting the calibrated motor resistance) and I can get a 1:1 correspondence between increments in the commanded speed and increments in the actual speed. But I'm left with this @#$% offset.



Has anyone seen this? Anyone care to hazard a guess at what's going on?



Thanks.


Brush noise trashing an opamp?

How, specifically, are you "inferring" the back EMF from the applied voltage and the current? ...Jim Thompson

Measuring the zero crossing point too close to the commutation time while commutation noise is still affecting the reading (and/or your cables are on the long side) or there's enough capacitance in the leads / circuit for the initial jump during commutation to push the BEMF zero crossing time forward for just the right amount of time?

Wait - are you reading it sooner than anticipated or later? trying to wrap my head around the description you posted while caffeine hasn't fully kicked in. If it's sooner, then you're probably reading it too soon and there may actually be yet another (real) zero crossing in the same period .

Take anything I say on the subject with a huge grain of salt - I've never actually dealt with anything brushed that did not have an encoder attached to it. Do you still do it in a way similar to what you would have done for a sensorless brushless? I would imagine brushed commutation would be *way* noisier than brushless so would require long[er] ZC hold-off times, perhaps even too long for high RPMs.

Sorry, not offering a solution here, just trying to think along ...

Back EMF = voltage - current * R

where R is the calibrated armature resistance (and yes, it changes discernibly when the motor heats -- that's not my immediate problem).

DC _brushed_ motors. One doesn't have access to the zero crossing time (if I did, I'd know the motor speed). One measures current and voltage, then one takes the (theoretically known) resistance, and backs out a number for the back EMF. Then one uses that to determine motor speed.

I was once told by my lecturer many, many years ago, that the gap between brushes and the commutator require a small voltage to produce a plasma to carry the commutator current.

Have you worked out this "offset" voltage?

Stray inductance.

Vladimir Vassilevsky DSP and Mixed Signal Designs

formatting link

The idea of computing back EMF, and using that to improve speed regulation, is pretty much equivalent to driving the armature from a power supply with a negative output resistance.

That can get unstable, with intertial issues, so it sometimes makes sense to tweak the dynamics of that negative resistance.

Tim - is the voltage supplied from a pulse width modulated source? If so, is it measured or calculated?

Hul

Hi, Tim:-

To control a brushed PM DC motor using IR compensation, you apply a voltage proportional to the desired speed, plus a compensation term equal to the product of the motor (and series wiring) resistance and the measured armature current.

To get a fixed RPM error implies to me that either your current sensor or your voltage DAC (or whatever) has a DC offset.

Picking some numbers out of the air:- If the motor is a 24V motor that goes 5000 RPM at full voltage Say maximum operating current is 1A, and resistance is 2.4 ohm (LRA of 10A)

Voltage error for 25 RPM is 120mV

Current error for 25 RPM is 0.12/2.4 = 50mA

--sp

My WAG is that your "armature resistance" is not really a constant. There will be times when (depending on the commutator) the brushes will likely be connected to two separate windings; other times only one. Given sufficient rpm you could probably use some time-averaged value; is that what you've done?

Seconded, although on gut feeling. Not sure I can explain it.

Would that not contribute to an effective R? Perhaps the "offset" (which isn't a true offset -- it's still zero at zero!) is a polynomial correction instead (leakage's offset being proportional to RPM)?

Tim

Ah, that's a good one too...

Tim, you say it's zero at zero (locked rotor), but is it always zero? Does the offset change with position..?

Tim

Here is something that might help, although they use a PWM drive and measure the back EMF during the OFF period:

formatting link

The following seems to use an encoder, but may have some helpful info:

formatting link

More info:

formatting link

And this:

formatting link

I have heard that it may be possible to sense the change in current and/or voltage caused by the commutation but it tends to be noisy and dependent on things like brush and commutator condition.

Paul

You've received a number of hints already. One more: Could it be that this motor is arcing? Then you would not see any effect when at standstill.

Tip 7? That only works if there's no current in the shunt diode, which has nasty implications.

In the past I've done really good with just using an external resistor equal to the winding resistance, so I'm not quite sure what setup Tim is using. ...Jim Thompson

Hmm, I had to scroll up there to see what type of motor you are using..

If that is a shunt/PM style motor, I don't quite understand how that will work? Maybe I am missing something.

I have a pretty good understanding of DC brushed motors and I just don't see it happening that way.

Dynamic(R) = Varm / Iarm.

Now since the motor has some DC R in it, this must be treated like a series R with an ideal motor.

Most drive electronics knows the size of the motor and knows ~ what the DC R should be, along with the expected dynamic current from the motor. The drive will advance the arm voltage above the set point when current is building to calculate for this offset. When monitoring feedback for an external reference for example, this offset should be removed. Many high end drives have the ability to adjust this.

So, output arm voltage must be offset (increased) as current increases, to over come the DC R. much like satisfying a voltage need at a divider node, the motor being the point of the dropping R and DC R in the motor being the series R.

I've played around with lots of small motor drive circuits and that is how I've done it. The feed back circuit uses the current to scale the voltage reading back so that output voltage will raise above set point to satisfy the offset requirements. This will make the motor spin a little faster and match your readings.

That's my blog for the day, and long winded as it is. Most likely nothing you can use. :)

P.S. Flux density in the field is going to effect your speed at specific arm voltages, just incase you didn't think of that.

Have a good day..

Jamie

Here's the way I've done it in the past...

formatting link
...Jim Thompson

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required