What is the minimum resolution recommended for low acceleration motion control?
Maximum Velocity can range between 2 rev/sec to 50 rev/sec. Acceleration could be as low as 0.01 rev/sec/sec. Precision is important (as the motor will need to decelerate at the right point to reach it's target position without overshooting) and the motion should appear as smooth as possible.
Motor is 12VDC with a 64:1 gearbox. Encoder will attached to either shaft or after the gear box. Motor is controlled via the Arduino PWM pin, with a pin to indicate direction.
As a rule of thumb, is higher resolution required for very slow motion?
-
1\$\begingroup\$ Really need to see some requirements on this, resolution is dependent on velocity and how much velocity resolution you need. And how much is 'low acceleration'? \$\endgroup\$Voltage Spike– Voltage Spike ♦2018年02月12日 18:38:16 +00:00Commented Feb 12, 2018 at 18:38
-
1\$\begingroup\$ "Incredibly slow" and "medium-high" are not recognised engineering units (and you're on an engineering Q&A site). Use terms such as "0.2 to 100 RPM" and "resolution of 3.7°", etc. Your question is already on the way to being closed because it is so vague. \$\endgroup\$Transistor– Transistor2018年02月12日 18:43:47 +00:00Commented Feb 12, 2018 at 18:43
-
\$\begingroup\$ @Transistor, please see edit. \$\endgroup\$M-R– M-R2018年02月12日 18:44:20 +00:00Commented Feb 12, 2018 at 18:44
-
\$\begingroup\$ We still know nothing about your motor and controller (DC motor, AC motor on VFD with slip compensation, servo motor, BLDC motor) whether it's unidirectional or forward / reverse, if there's a gearbox and the encoder can be put on the high-RPM shaft and what error you can tolerate on the shaft speed. \$\endgroup\$Transistor– Transistor2018年02月12日 18:53:35 +00:00Commented Feb 12, 2018 at 18:53
-
\$\begingroup\$ @Transistor, hope that's enough info. :) \$\endgroup\$M-R– M-R2018年02月12日 19:17:22 +00:00Commented Feb 12, 2018 at 19:17
2 Answers 2
One bit would suffice for some applications. A simple proximity switch sensing a screw-head on a rotating shaft might be adequate in some industrial applications provided the system ran only one way.
If direction sensing is required then two bits are required. Quadrature encoders are the norm for this.
It would be a waste of time to elaborate as your question is so short of details.
-
\$\begingroup\$ Is there anything else you need to know? :) \$\endgroup\$M-R– M-R2018年02月13日 02:11:04 +00:00Commented Feb 13, 2018 at 2:11
Arduino is poor in terms of calculation, and it is not made for motor control. If you need a precise velocity, then you need a MCU or DSP with QEI - Quadrature Encoder Interface. It measures frequency and period of pulse train, then uses the information of the method which is more plausible.
For motion control you would need a fast MCU, not a legacy 8-bit MCU. An integrated FPU is welcome, but not mandatory if it has enough speed.
You better find some other platform.
P.S.:
You probably use the interrupt to calculate the speed from difference of counted pulses, so called frequency measuring method.
There is also a period measurement method. The error of frequency method is small at high frequencies and large at low frequencies, meanwhile the error of period measurement method is small at low frequency and large at high frequency.
Your control, is jerking at low speed because the speed measurement has a large error at encoder low frequency output (low motor speed).
-
\$\begingroup\$ I thought that may be the problem, however the motion runs smoother as the velocity increases. There's only jerkiness at the very beginning. Can you explain why this might be? Thanks \$\endgroup\$M-R– M-R2018年02月12日 20:13:19 +00:00Commented Feb 12, 2018 at 20:13
-
\$\begingroup\$ I don't actually use the speed at all. I calculate the position, based on acceleration (and velocity) and feed that into the PID loop. \$\endgroup\$M-R– M-R2018年02月12日 20:39:29 +00:00Commented Feb 12, 2018 at 20:39
-
\$\begingroup\$ Should say that the current resolution is 12cpr attached to the motor shaft, which should amount to 12*64 = 768 encoder counts/rev. \$\endgroup\$M-R– M-R2018年02月12日 21:23:57 +00:00Commented Feb 12, 2018 at 21:23
-
\$\begingroup\$ But the D-term does the differentiation, isn't it? \$\endgroup\$Marko Buršič– Marko Buršič2018年02月13日 17:50:27 +00:00Commented Feb 13, 2018 at 17:50
-
\$\begingroup\$ As in the derivative term? Yes (using the standard Arduino PID library). \$\endgroup\$M-R– M-R2018年02月13日 18:23:12 +00:00Commented Feb 13, 2018 at 18:23