I’m currently working on a project that requires very high precision and very consistent homing capabilities. The project already is using an ODrive S1 and the D6374 dual shaft motor. I’m currently using a US Digital E6 (quadrature encoder with max CPR of 40k), but there isn’t a clean or consistent way for me to do homing. Ideally I want something at or above that resolution (so I believe 16 bit and above) and is an all in one or kit encoder solution that works with the rear 8mm shaft of the motor. Are there any particular encoders that you’d recommend for my situation?
Edit: On further discussion with my partner, we would likely be fine with 14 bit absolute encoders as well.
MT6835 is hard to beat. As with most magnetic encoders, it has around ±0.5° nonlinearity that you need to calibrate out (not sure if ODrive has any functionality for that, but the encoder itself has an auto-calibration function to get it to ±0.07°). The raw value is 21-bit, but only 15 are 100% reliable. It has built-in filtering to improve the stability at the cost of response time, and hysteresis setting to reduce jitter. From my testing with hysteresis 0, each of the 7 bandwidth settings gives this many units of variation while holding still:
0: Usually 5, max 7
1: Usually 7, max 9
2: Usually 9, max 11
3: Usually 11, max 15
4: Usually 16, max 21
5: Usually 22, max 29
6: Usually 31, max 43
7: Usually 40, max 55
So bandwidth 7 is 100% reliable to 15 bits, 5 is reliable to 16 bits, 3 is reliable to 17 bits, 0 is reliable to 18 bits.
If 14-bit is fine, then the E6 should be great (log2(40000) = 15.3bit) as long as you use the variant that has an index pin, so you can do an index search on startup (instead of always having to re-run encoder offset calibration). You could also just do the AMT21 (14-bit, absolute).
My rule of thumb is that – with proper tuning – you can do a position hold (under load) down to around +/- 20 counts. So a 14-bit encoder would give about 20/2^14 * 360 = +/- 0.44° of position hold under load. Under light load / no load / static load, this usually goes down to around +/- 5-10 counts.
If you need more than 14-bit, it may be a bit tricky to get with an 8mm bore encoder. There are some fairly nice shaft-mount encoders if you’re open to a bit of Alibaba trawling. The RLS AksIM-2 is also always a great pick, but the mounting is tricky – it’s very sensitive to misalignment, so you need some well-machined parts.
Could also configure a RLS MR020 + RL2HD with 13-bit interpolation for about 17.7 bits at around $110/ea. It’s incremental-only, so you’d want some sort of additional absolute encoder or index pulse for commutation (and just use the incremental for load), but it’s probably one of the more cost effective solutions.
The MT6835 is definitely nice, but the noise is a bit killer – they don’t publish that on the datasheet for a reason. You’d have to sample at a full 8kHz rate and calculate the RMS noise from there, and RMS noise is typically what directly influences control loop stability.
As described above, you still have 15 to 18 stable bits after discarding the noisy ones. Much better than a 14-bit encoder with one or two noisy bits. For most uses (such as my CNC machine) I’d recommend the default bandwidth 5, and 16-bit reading.