|
|
|
![]() |
|
|||||||
|
||||||||
![]() |
| Thread Tools | Rate Thread | Display Modes |
|
#1
|
|||
|
|||
|
Finding RPMs with encoder
I am trying to set up an encoder to tell me the RPM of a shooter, the encoder is a US digital s4t - 120 - 250 encoder and 4x decoding. I see the multiple ways to get information from an encoder (getRate(), getPeriod(), get()) but what should I use to find RPMs with this encoder. Also, I don't know what to set as my setDistanceperpulse(), is it asking for how far the motor will move per pulse and if so by what unit of measurement is it asking?
|
|
#2
|
||||
|
||||
|
Re: Finding RPMs with encoder
Quote:
120 is the Counts Per Revolution (CPR). That's the resolution of the encoder per 360 degrees of rotation. So it will provide 120 counts/pulses/ticks per 360 degrees... or one count per every 3 degrees. I'm not sure what language you're using, but I'm only familiar with the LabVIEW libraries. The getRate() function will provide you with a counts / second value while getPeriod() will return the inverse, seconds / count. I imagine get() returns the total counts since the encoder count value was reset. The setDistancePerPulse() function should take in either degrees or radians equal to 3 degrees. Finally, 250 is rather boring to this control mentor. It's just the shaft size, 250 mils or 1/4" shaft diameter. |
|
#3
|
||||
|
||||
|
Re: Finding RPMs with encoder
Quote:
![]() |
|
#4
|
|||
|
|||
|
Re: Finding RPMs with encoder
Quote:
Thank you for replying. |
|
#5
|
||||
|
||||
|
Re: Finding RPMs with encoder
CPR is cycles per revolution. One cycle has a rising edge and a falling edge on each channel. The number of "counts" per rev depends on the way you decode it. Counting rising and falling edges on both channels will give you 480 counts per rev Counting rising and falling edges on one channel only will give you 240 counts per rev Counting only rising - or falling - edges on one channel only will give you 120 counts per rev |
|
#6
|
|||
|
|||
|
Re: Finding RPMs with encoder
Quote:
Last edited by Sparx030 : 04-02-2016 at 11:30. |
|
#7
|
||||
|
||||
|
Re: Finding RPMs with encoder
Quote:
Quote:
|
|
#8
|
|||||
|
|||||
|
Re: Finding RPMs with encoder
Quote:
Quote:
Quote:
Quote:
Quote:
Also, if possible, would you be able to provide a brief generalization of what each decoding type is used for? |
|
#9
|
||||
|
||||
|
Re: Finding RPMs with encoder
Quote:
And did you consider using bang-bang instead of PID? This is the perfect application for it. And there's no tuning required. A 250 CPR encoder spinning at 3000 RPM is easily decoded by the roboRIO at 4X or 2X or 1X. It samples for edges much faster than the cRIO did, which removes many of the considerations which came into play in the cRIO days with high-RPM high-CPR encoder use. But, there are still some things you need to know to be successful. I will expound on that and answer the rest of your questions in a few minutes. EDIT: Oh, and what is the period of your control loop (e.g. 20ms, 10ms, etc). Last edited by Ether : 04-02-2016 at 14:50. |
|
#10
|
|||
|
|||
|
Re: Finding RPMs with encoder
They are Victor 888.
Quote:
|
|
#11
|
||||
|
||||
|
Re: Finding RPMs with encoder
What is the period of your control loop (e.g. 20ms, 10ms, etc)? |
|
#12
|
|||
|
|||
|
Re: Finding RPMs with encoder
20ms
|
|
#13
|
||||
|
||||
|
Re: Finding RPMs with encoder
OK, doing the calculations for 1X decoding: rpm=3000; CPR=250; X=1; secondsPerControlLoop=0.020; So 250 edges fly by every 20ms, which should be plenty enough to get a nice accurate and clean speed signal at 1X decoding. I recommend setting the FPGA sample size to something greater than the default value of "1"... say maybe 64. If you like your code to be super efficient you can compute the edge period time once outside your control loop: secondsPerEdge: float((1/rpm) * 60 * 1/(X*CPR)) = 80e-6 ... and use that as the setpoint in your PID to compare to the getPeriod() process variable which returns the edge period in seconds. When using PID to control shooter wheel speed there are some additional considerations to be aware of in order to be successful. Things like do you want to apply dynamic braking or reverse motor commands when wheel speed exceeds setpoint. I will leave it to shooter-wheel-PID gurus to fill in the details and recommendations. You may be able to get better speed regulation at 10ms. Last edited by Ether : 04-02-2016 at 21:45. Reason: typo |
|
#14
|
|||
|
|||
|
Re: Finding RPMs with encoder
alright, thanks for the help. I don't have means for testing anything right now but all of this was very helpful.
|
|
#15
|
|||
|
|||
|
Re: Finding RPMs with encoder
Update: everything is working perfectly, thanks again for the help.
|
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|