I am working with a MEGA2560 trying to implement velocity ramps for three steppers at the same time. The goal is to move to different positions applying accelerations and decelerations while finishing all of them at the same time.
In order to do so, from the distances to move of each of the motors, I calculate the amount of steps to do and the velocities for each of those steps in order to ensure that all the motors finish at the same time. For so, I use timers 3, 4 and 5 in compare mode. This way, at each interruption, I make the motors do one step and, after that, I set the new compare value for the timer in order to reach the new velocity to move at.
My problem is that, at some point, my interruptions crash and one of the motors stops working. This only happens under one condition: when motor 1 has to do 18 steps and motor 2, 34. In this case, both motors 1 and 3 finish but motor 2 gets stuck and does not move any more. Although, if its motor 1 who has to do 34 steps and motor 2, 18, everything works. Motor 1 is related to timer 3 and motor 2 to timer 4. This makes me think this must be related to the priorities of the interruptions.
In the following code you can see my interruptions:
ISR(TIMER3_COMPA_vect) {
m1_step();
m1_steps_done++;
m1_configure_vel();
}
ISR(TIMER4_COMPA_vect) {
m2_step();
m2_steps_done++;
m2_configure_vel();
}
ISR(TIMER5_COMPA_vect) {
m3_step();
m3_steps_done++;
m3_configure_vel();
}
While, in the velocity configuration I have:
void m1_configure_vel() {
if (m1_steps_done < m1_acceleration_steps) {
m1_temp_vel = m1_temp_vel + acceleration;
}
else if (m1_steps_done <= (m1_steps - m1_acceleration_steps)) {
m1_temp_vel = m1_temp_vel;
}
else if (m1_steps_done < m1_steps) {
m1_temp_vel = m1_temp_vel - acceleration;
}
else {
m1_temp_vel = 0;
m1_finished = true;
}
if (m1_temp_vel <=0){
m1_temp_vel = 0;
}
OCR3A = frequency_to_compare_value(m1_temp_vel);
}
As you can see, all I do here is, depending on the steps done by the motor and the amount of steps to do, I increase, maintain or decrease the motor's velocity and set the compare value for the timer.
The whole thing is that this code works fine, the ramps are calculated properly and motors move correctly. The problem is that, under the condition I explained before, interruptions may collide due to their priorities and one of them just stops to happen.
I was wondering if anyone had any idea or have faced something like this before.