How can we find the RPM of DC motor using the given voltage?. To be clear, I need to find out rpm of a motor using the pwm signal sent from Arduino Uno. In my case i'm using a BO motor, the link is here: http://www.coretechnologies.co.in/index.php?route=product/product&path=64_83&product_id=753

I'm doing this for my tachometer project, for proving theoretical values and practical values are correct. For getting practical values i'm using this: http://playground.arduino.cc/Learning/Tachometer

  • \$\begingroup\$ The problem is that different motors will have different RPM/Volt characteristics, there isn't some universal ratio that's the same for every motor. You'll need to measure at least the unloaded speed (unless the motor has a datasheet value for RPM/Volt or something like that) \$\endgroup\$
    – Sam
    May 4 '16 at 3:38

The RPM of the motor cannot be found using voltage and motor ratings alone. You can estimate, but the load will directly affect the speed of the motor.

There is a way to measure the speed of the motor based on the current waveform. Most DC motors have a 2-pole stator and a 3-pole rotor, so 6 current peaks can be observed for each rotation.

DC Motor Current

Run the current waveform into your ADC and write some slick software or use a comparator circuit to peak detect and you will have your speed. You can see the measurement made and described on for(embed).

  • \$\begingroup\$ Can L298 current sense pins do that? \$\endgroup\$
    – Assazzin
    May 4 '16 at 7:30
  • \$\begingroup\$ This will work for a known motor .I prototyped this and showed good operation on a car windscreen wiper motor .The hardware used to clean up the waveform was simple and cheap .I have not done this for a real product .What would happen if the brushes worn ? \$\endgroup\$
    – Autistic
    May 4 '16 at 12:04
  • \$\begingroup\$ @Autistic As long as the motor is turning, this method will work. Worn brushes are a maintenance issue more than a current-sensing issue. \$\endgroup\$ May 4 '16 at 13:47
  • \$\begingroup\$ @Assazzin With the caveat that I haven't actually used the L298, yes, I believe that any current-sensing method will work so long as the output isn't filtering out the signal. \$\endgroup\$ May 4 '16 at 13:50

Each motor has a BEMF constant. So if it runs with no load, you can say that velocity equals voltage times k. Since each motor has some minimal load always (and usually it's not minimal, motors exist to drive loads), actual voltage has another component, the current times motor resistance. So if you measure the current, you can calculate it too. And the best way to know the BEMF constant is to measure it. The one given in datasheet may vary between motors.


Back emf is directly proportional to speed. The back emf constant is numerically equal to the torque constant and this is normally given in the data sheet. Alternatively, calibrate the motor speed vs back emf by measurement.

Then measure the back emf during the PWM off-periods via an ADC to get the instantaneous speed.


A brushed DC machine can be modeled as


simulate this circuit – Schematic created using CircuitLab

  1. voltage source
  2. stator winding inductance
  3. stator winding resistance

The voltage source will have a voltage proportional to rotor velocity, the \$K_e\$ voltage constant: Volts per RPM (or rads depending on the datasheet). The faster the rotor rotates, the higher this value.

There will equally be voltage due to current flowing through the resistance and equally changing current will cause a voltage across the inductance.

Higher load --> more current draw --> more additional voltage due to the R.

As long as the load & speed is assumed constant (maybe not...) and as long as the PWM frequency is high enough, the L contribution could be ignored.

All this can be measured at the motor's terminals.

How to use PWM to determine speed? The minimum prerequisite is knowing the \$K_e\$ of the motor in use.

If the motor is UNLOADED and you are just energising it with a fixed PWM duty, the rotor velocity can be estimated via:

\$ \omega = V_{cc} * D * K_e \$

\$V_{cc}\$ being the voltage being PWM'ed onto the Motor's stator

D being the fixed duty

\$K_e\$ being the backEMF constant in \$V/\omega\$

If however some form of speed control is required (sensorless) some means to measure the terminal voltage is required.

You can then sample this DURING the off period's of the PWM so you are aware of the motor's terminal voltage.

How much you then compensate for iR (current sensing or ignore if unloaded) or wL (can it be argued its negligible for a DCmachine?) is down to your system considerations.

enter image description here



Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.