erickone96

Quadrature Decoder

6 posts in this topic

Hey there,

I have been working in a dc motor control project. So far I got the motor running open loop pretty good (clockwise and counter clockwise), and now I wanna implement a closed loop speed feedback. I tried using the quadrature decoder to read the pulses coming from an quadrature incremental encoder. So this is what I read at approx. 1720 rpm

Pulse Count
33133033
Speed 
-17034
 Speed Radians: 
-36.43

Pulse Count
33130475
Speed 
-17296
 Speed Radians: 
-36.16

Pulse Count
33127931
Speed 
-17003
 Speed Radians: 
-36.05

Pulse Count
33125396
Speed 
-16801
 Speed Radians: 
-37.98

Pulse Count
33122854
Speed 
-17035
 Speed Radians: 
-36.73

Pulse Count
33120307
Speed 
-16784
 Speed Radians: 
-36.69

 

It is negative because its rotating counter clockwise. Why is it too inaccurate? I have attached my project just in case someone wants to take a look at it. 

Thanks,

code02.zip

P.D. The motor runs at 4000 rpm max. Encoder specs: 1000 ppr. A, B, and I.

Share this post


Link to post
Share on other sites

Is it counting steps accurately? Can you have your stepper spin for a certain amount of steps and see if the count matches what you sent?

Jack.

Share this post


Link to post
Share on other sites

Hey Jack,

The decoder is giving me a good reading of getSpeed function type 0 (96MHz clock ticks for 5 A_clock pulses). I am able to compute the RPM and then average 40 readings giving me a pretty good and fast RPM reading. The only issue now is that I get an average RPM = 0 everynow and then. Not sure what could be causing it since decoder seems to be working properly.

I'm using this method to average the RPM: https://www.arduino.cc/en/Tutorial/Smoothing

And this is how Im computing the RPM for example:

Robot_Control_Library.getSpeed(0): 37366

Time for the 5 pulses: 37366 x 10.4ns

5 pulsles out of 1000 ppr = 0.005

V = 0.005 rev / 387us = 12.9 rev/s x 60 = 774 rpm.

In my code, Im computing it as: 

rpmreading = 28846153/ Robot_Control_Library.getSpeed(0).

Im guessing that the prob is because of the large numbers in the computation ? 

Any suggestions ?

 

Thanks,

 

Ruben

rpm01.jpg

IMG_2050.JPG

rpm0.jpg

Share this post


Link to post
Share on other sites

Nevermind, I was reading the rpm value from the register where I was sending it. I changed the Serial.print(RPM) and didnt show any 0 anymore lol.

Thanks though!

 

Share this post


Link to post
Share on other sites

Awesome! Looks like you are making steady progress with this. Can you share with us what project you are working on? Pictures would be even better!

Jack.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now