I'm running into a problem right now with a project I'm working on.
I have to control the position of 2 DC motors and therefore have attached an encoder (HEDM-5500) with 1000 counts per revolution to each one of them.
I'm running my motor control loop at 1kHz (Timer interrupt), where I generate my position setpoint, handle the PID calculation and measure some data with the ADC.
If I'm only ever reading one of the encoders using the Encoder (https://github.com/PaulStoffregen/Encoder) library from Paul Stoffregen everything works fine, but If I start to control both motors and therefore read both encoder values one of the starts to temporarily not count steps.
I think I'm running into a problem with the interrupts not being called, but I don't know.
My PID calculation stuff is definitely fast enough, it takes at max. 750 µs out of the 1000 µs available, but even if I lower the control loop frequency and therefore give the system more idle time nothing changes with the encoder behaviour.
I hope someone can help me out with my problem.
You could consider using the 2 hardware quadrature decoders of the DUE. They are capable of handling a very high number of encoder edges per second.
The Arduino DUE has two hardware quadrature decoder QDEC0 and QDEC1
Timer Counter 0 channel 0 / TIOA and TIOB of channel 0
PHA TIOA0 = pin 2
PHB TIOB0 = pin 13
Timer Counter 0 channel 1 / TIOB of channel 1
INDEX TIOB1 = pin A6
Timer Counter 2 channel 0 / TIOA and TIOB of channel 0
PHA TIOA6 = pin 5
PHB TIOB6 = pin 4
Timer Counter 2 channel 1 / TIOB of channel 1
INDEX TIOB7 = pin 10
For example sketches to record position or speed (from reply 84):
I have tried the hardware quadrature decoder, but was only successful with the one on TC0, additionally I was not yet able to properly reset the counter whenever I want to.
Have you tried "resetting" the output register before?
I have tried the hardware quadrature decoder, but was only successful with the one on TC0