Controlling multiple steppers synchronous using C++
I am currently working on a project on a atmega 2560 where I need to control multiple stepper motors synchronous. Meaning sometimes only one motor turns at a time and sometimes multiple motors need to turn at the exact same time for the exact same angle. While planning out my approach I ran into a problem I am not certain how to solve. So, I decided to see if anyone can give me valuable advice.
I am writing the program in C++ and I wanted to create a class for the stepper motors(see attached UML) which has a method rotate() to, u guessed it, rotate the stepper for a specific angle in a defined direction. Now of course this presents a timing issue because I need to implement the function in such a way that it does not block any other code and enables me to turn multiple motors at the same time. I came up with two possible approaches:
- Using the timers of the atmega and interrupts to create a PWM signal which turns the motors one step per interrupt. In order to be able to turn multiple motors at once I thought about creating a table for active steppers. Each time the ISR is entered it checks what steppers are supposed to move and transfers the PWM signal to the corresponding pins. Of course, I would somehow need to keep track of the number of steps still left to turn (maybe by introducing another member variable).
- Not using interrupts at all and simply avoid blocking the code as much as possible, by not using while loops and using the system time for delays.
Now my question to all of you is whatever possibility you think would work best or if there is something else, I could try? I am pretty confident that I could implement either one of the above, but I am just not quite happy with both of them. It would feel right to use counters and interrupts in order to guarantee exact timing. However, the approach of having an external table for the active steppers makes the program less easy to understand. In addition, I had my problems of fitting ISRs into the object-oriented world.
Any ideas or contributions are highly appreciated.
Best regards
Axodarap
c++ atmega stepper
add a comment |
I am currently working on a project on a atmega 2560 where I need to control multiple stepper motors synchronous. Meaning sometimes only one motor turns at a time and sometimes multiple motors need to turn at the exact same time for the exact same angle. While planning out my approach I ran into a problem I am not certain how to solve. So, I decided to see if anyone can give me valuable advice.
I am writing the program in C++ and I wanted to create a class for the stepper motors(see attached UML) which has a method rotate() to, u guessed it, rotate the stepper for a specific angle in a defined direction. Now of course this presents a timing issue because I need to implement the function in such a way that it does not block any other code and enables me to turn multiple motors at the same time. I came up with two possible approaches:
- Using the timers of the atmega and interrupts to create a PWM signal which turns the motors one step per interrupt. In order to be able to turn multiple motors at once I thought about creating a table for active steppers. Each time the ISR is entered it checks what steppers are supposed to move and transfers the PWM signal to the corresponding pins. Of course, I would somehow need to keep track of the number of steps still left to turn (maybe by introducing another member variable).
- Not using interrupts at all and simply avoid blocking the code as much as possible, by not using while loops and using the system time for delays.
Now my question to all of you is whatever possibility you think would work best or if there is something else, I could try? I am pretty confident that I could implement either one of the above, but I am just not quite happy with both of them. It would feel right to use counters and interrupts in order to guarantee exact timing. However, the approach of having an external table for the active steppers makes the program less easy to understand. In addition, I had my problems of fitting ISRs into the object-oriented world.
Any ideas or contributions are highly appreciated.
Best regards
Axodarap
c++ atmega stepper
Sounds like you want a state machine.
– user4581301
Jan 1 at 18:16
@user4581301 I dont't see how a state machine would silve my timing issue. :/
– Axodarap
Jan 1 at 20:43
Option 2 sounds like the AccelStepper library.
– David Grayson
Jan 2 at 18:35
add a comment |
I am currently working on a project on a atmega 2560 where I need to control multiple stepper motors synchronous. Meaning sometimes only one motor turns at a time and sometimes multiple motors need to turn at the exact same time for the exact same angle. While planning out my approach I ran into a problem I am not certain how to solve. So, I decided to see if anyone can give me valuable advice.
I am writing the program in C++ and I wanted to create a class for the stepper motors(see attached UML) which has a method rotate() to, u guessed it, rotate the stepper for a specific angle in a defined direction. Now of course this presents a timing issue because I need to implement the function in such a way that it does not block any other code and enables me to turn multiple motors at the same time. I came up with two possible approaches:
- Using the timers of the atmega and interrupts to create a PWM signal which turns the motors one step per interrupt. In order to be able to turn multiple motors at once I thought about creating a table for active steppers. Each time the ISR is entered it checks what steppers are supposed to move and transfers the PWM signal to the corresponding pins. Of course, I would somehow need to keep track of the number of steps still left to turn (maybe by introducing another member variable).
- Not using interrupts at all and simply avoid blocking the code as much as possible, by not using while loops and using the system time for delays.
Now my question to all of you is whatever possibility you think would work best or if there is something else, I could try? I am pretty confident that I could implement either one of the above, but I am just not quite happy with both of them. It would feel right to use counters and interrupts in order to guarantee exact timing. However, the approach of having an external table for the active steppers makes the program less easy to understand. In addition, I had my problems of fitting ISRs into the object-oriented world.
Any ideas or contributions are highly appreciated.
Best regards
Axodarap
c++ atmega stepper
I am currently working on a project on a atmega 2560 where I need to control multiple stepper motors synchronous. Meaning sometimes only one motor turns at a time and sometimes multiple motors need to turn at the exact same time for the exact same angle. While planning out my approach I ran into a problem I am not certain how to solve. So, I decided to see if anyone can give me valuable advice.
I am writing the program in C++ and I wanted to create a class for the stepper motors(see attached UML) which has a method rotate() to, u guessed it, rotate the stepper for a specific angle in a defined direction. Now of course this presents a timing issue because I need to implement the function in such a way that it does not block any other code and enables me to turn multiple motors at the same time. I came up with two possible approaches:
- Using the timers of the atmega and interrupts to create a PWM signal which turns the motors one step per interrupt. In order to be able to turn multiple motors at once I thought about creating a table for active steppers. Each time the ISR is entered it checks what steppers are supposed to move and transfers the PWM signal to the corresponding pins. Of course, I would somehow need to keep track of the number of steps still left to turn (maybe by introducing another member variable).
- Not using interrupts at all and simply avoid blocking the code as much as possible, by not using while loops and using the system time for delays.
Now my question to all of you is whatever possibility you think would work best or if there is something else, I could try? I am pretty confident that I could implement either one of the above, but I am just not quite happy with both of them. It would feel right to use counters and interrupts in order to guarantee exact timing. However, the approach of having an external table for the active steppers makes the program less easy to understand. In addition, I had my problems of fitting ISRs into the object-oriented world.
Any ideas or contributions are highly appreciated.
Best regards
Axodarap
c++ atmega stepper
c++ atmega stepper
asked Jan 1 at 17:54
AxodarapAxodarap
11
11
Sounds like you want a state machine.
– user4581301
Jan 1 at 18:16
@user4581301 I dont't see how a state machine would silve my timing issue. :/
– Axodarap
Jan 1 at 20:43
Option 2 sounds like the AccelStepper library.
– David Grayson
Jan 2 at 18:35
add a comment |
Sounds like you want a state machine.
– user4581301
Jan 1 at 18:16
@user4581301 I dont't see how a state machine would silve my timing issue. :/
– Axodarap
Jan 1 at 20:43
Option 2 sounds like the AccelStepper library.
– David Grayson
Jan 2 at 18:35
Sounds like you want a state machine.
– user4581301
Jan 1 at 18:16
Sounds like you want a state machine.
– user4581301
Jan 1 at 18:16
@user4581301 I dont't see how a state machine would silve my timing issue. :/
– Axodarap
Jan 1 at 20:43
@user4581301 I dont't see how a state machine would silve my timing issue. :/
– Axodarap
Jan 1 at 20:43
Option 2 sounds like the AccelStepper library.
– David Grayson
Jan 2 at 18:35
Option 2 sounds like the AccelStepper library.
– David Grayson
Jan 2 at 18:35
add a comment |
1 Answer
1
active
oldest
votes
I would like to recommend you to use ISR.
- Using ISRs let you adding new feature easier. Whenever you want to add new functionality, you write it and your ISRs still execute at the same situation/time/synchronus/asynchronus.
- Working with motors force you to use time reliant system, especially when there is no feedback from position/angle.
Whats the problem with storing data about steppers? You don't need external table for active steppers or I misunderstand you. You can use static variables in ISR to prevent them from disappear after executing.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53997662%2fcontrolling-multiple-steppers-synchronous-using-c%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
I would like to recommend you to use ISR.
- Using ISRs let you adding new feature easier. Whenever you want to add new functionality, you write it and your ISRs still execute at the same situation/time/synchronus/asynchronus.
- Working with motors force you to use time reliant system, especially when there is no feedback from position/angle.
Whats the problem with storing data about steppers? You don't need external table for active steppers or I misunderstand you. You can use static variables in ISR to prevent them from disappear after executing.
add a comment |
I would like to recommend you to use ISR.
- Using ISRs let you adding new feature easier. Whenever you want to add new functionality, you write it and your ISRs still execute at the same situation/time/synchronus/asynchronus.
- Working with motors force you to use time reliant system, especially when there is no feedback from position/angle.
Whats the problem with storing data about steppers? You don't need external table for active steppers or I misunderstand you. You can use static variables in ISR to prevent them from disappear after executing.
add a comment |
I would like to recommend you to use ISR.
- Using ISRs let you adding new feature easier. Whenever you want to add new functionality, you write it and your ISRs still execute at the same situation/time/synchronus/asynchronus.
- Working with motors force you to use time reliant system, especially when there is no feedback from position/angle.
Whats the problem with storing data about steppers? You don't need external table for active steppers or I misunderstand you. You can use static variables in ISR to prevent them from disappear after executing.
I would like to recommend you to use ISR.
- Using ISRs let you adding new feature easier. Whenever you want to add new functionality, you write it and your ISRs still execute at the same situation/time/synchronus/asynchronus.
- Working with motors force you to use time reliant system, especially when there is no feedback from position/angle.
Whats the problem with storing data about steppers? You don't need external table for active steppers or I misunderstand you. You can use static variables in ISR to prevent them from disappear after executing.
edited Jan 22 at 6:42
answered Jan 22 at 6:35


dunajskidunajski
11416
11416
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53997662%2fcontrolling-multiple-steppers-synchronous-using-c%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Sounds like you want a state machine.
– user4581301
Jan 1 at 18:16
@user4581301 I dont't see how a state machine would silve my timing issue. :/
– Axodarap
Jan 1 at 20:43
Option 2 sounds like the AccelStepper library.
– David Grayson
Jan 2 at 18:35