не нужен 2х ядерный процессор, нужно учиться разбивать задачи на мелкие неблокирующие кусочки.Увы.. Одноядрёная Arduino Nano...
ISR(TIMER1_COMPA_vect) {
if (stat_hal != digitalRead(AZ_HAL_PIN)) flag_hal = true; // проверка на то, что двигатель действительно крутится (датчик холла)
check = a_stepper.getCurrent() - start_pos;
if (abs(check)>41 && flag_hal == false) { // если мотор не крутится, делаем стоп и записываем текущую позицию в EEPROM
}
if (a_stepper.ready() || flag_break == true)
{
a_stepper.disable();
digitalWrite(LED_PIN , LOW);
WriteBackup(); // запись текущей позиции в EEPROM
}
}
Проект интересный, но он имеет одно существенное отличие - в нём используются серво-двигатели. В моём - шаговые...Вот пример как можно управлять пятью моторами
Ну если устраивает заведомо ущербный подход - дерзайте, что можно тут сказать. Таймер и прерывания это не "серебрянная пуля".нагружать прерывания "допами" - плохое решение, но по-другому пока не получается. Кстати, сейчас как раз обкатываю этот вариант (с "монструозным" обработчиком прерывания).
Если честно, понятия не имею. Этим занимается Gyver Stepper.С какой частотой у вас идут импульсы на моторы на максимальной скорости и на какую частоту настроен таймер?
АналогичноНо с плавным стартом я не знаю как вы выкручиваетесь.
Сейчас там собственно ничего и не осталосьВы так "допишетесь" до того что у вас обработчик прерываний от таймера
ISR(TIMER1_COMPA_vect) {
if (a_stepper.tickManual())
{
setPeriod(a_stepper.getPeriod());
}
else if (e_stepper.tickManual())
{
setPeriod(e_stepper.getPeriod());
}
else
{
stopTimer();
}
}
Их считает библиотека.Шаги мотора вы всё равно не считаете,
Нууу.. Смотря что подразумевать под этим.точность вам не нужна
Нет сенсоров! Только датчик Холла в моторчике. По нему позицию не особо вычислишь..Управляйте только положеним и оборотами от сенсоров
GStepper2<STEPPER2WIRE> a_stepper(5760, 11, 10, 12);
GStepper2<STEPPER2WIRE> e_stepper(5760, 11, 10, 12);
GStepper2<STEPPER2WIRE> a_stepper(5760, 5, 8, 9);
GStepper2<STEPPER2WIRE> e_stepper(5760, 5, 8, 10);
GStepper2<STEPPER2WIRE> a_stepper(5760, 5, 8, 9);
GStepper2<STEPPER2WIRE> e_stepper(5760, 5, 8, 10);
Никак не могу одолеть..Предыдущая "копия" GStepper держит "свой" DIR.
И получается так, что если предыдущее направление было "по часовой", а текущее "против", текущий поворот выполняется в ложном направлении..
Не понял.. Как дёрнуть DIR? Так что ли?попробуйте уже с нужной копией GStepper 2 раза дернуть DIR
void stepper_turn(int st) {
if (st == 0 && a_stepper.getStatus() == 0 && TruAzim != ComAzim)
{
a_stepper.enable();
a_stepper.dir = a_stepper.dir;
a_stepper.dir = a_stepper.dir;
a_flag_hal = false;
a_stepper.setTargetDeg(ComAzim*-1,ABSOLUTE);
az_cur_pos = a_stepper.getCurrent();
az_start_pos = az_cur_pos;
az_stat_hal = digitalRead(AZ_HAL_PIN);
setPeriod(a_stepper.getPeriod());
startTimer();
}
Эммм. А разве так можно?a_stepper.dir = !a_stepper.dir;
Если dir будет равен "-1", !a_stepper.dir сделает из него "0". Никак не "1".int8_t dir; // направление (1, -1)
Не прокатило.. Всё также "сшибается", если на одном из моторов меняется "направление" (уменьшить/увеличить).a_stepper.dir =~a_stepper.dir;
Пробовал - не прокатило.. Почему так, не понял. Может библиотека, действительно, читает пин перед стартом?сохранить состояние направления для каждого мотора и потом его восстановить.
Гм.. А этот вариант я почему-то и не рассматривал... Попробую..Управляйте одной, а моторы переключайте с помощью Enable.
GStepper2<STEPPER2WIRE> stepper(шаговНаОборот, step, dir);
А как же тогда насчёт этого -Так как шинами enable Вы будете управлять сами, вне библиотеки, то эти методы Вам в самой библиотеке не нужны.
Что здесь вообще означает, "питание"? На драйвер (А4988) всего три сигнала приходят: STEP, DIR и ENABLE.void disable(); // отключить питание и EN
void enable(); // включить питание и EN
Это мне известно.EN управляет подачей питания на обмотки, ...
я вообще не понял.. Как я смогу (в обсуждаемом варианте) НЕ трогать EN???И теоретически EN можно не трогать.
В комментарии присутствует "И", что подразумевает "и то и это". Т.е., как я понимаю, это "разные люди".отключить/включить питание и EN
Уже приступил.. Но ещё не закончил, т.к. требуется приличная правка кода..Вам проще попробовать,
Не понятно, к чему это всё для моего случая.Что не понятно я "не понятно"