Управление двумя шаговиками посредством одного таймера
- Войдите на сайт для отправки комментариев
Пт, 10/12/2021 - 21:07
Здравствуйте уважаемые форумчане. Обращаюсь к вам с таким вопросом: как используя один таймер ардуино управлять двумя шаговиками по степ/дир. Одним мотором управлять легко и приятно: настраиваем канал А таймера 1 на совпадение и в прерывании присваиваем новое значение OCR (или не присваиваем если ускорение =0). И вот казалось бы: повторяем все то же для канала В и дело в шляпе, но как я понял (поправьте пожалуйста если это не так) из даташита в режиме СТС можно использовать для сравнения только OCR1A. Какая-то надежда всё ещё теплится т.к. прерывание от канала В в списке прерываний все-таки есть, осталось только понять как и вкаком режиме его применить (если это вообще возможно).
И как это должно работать, по-твоему? Таймер будет сбрасываться в ноль по двум разным значениям?
Это уже ясно, хочется как раз послушать знающих людей как можно это ограничение обойти или, если нельзя, то как силами одного таймера решить задачу без особых велосипедов. Можно в одном прерывании таймера, например, инкрементировать 2 счетчика по одному на шаговик и при совпадении одного из них с заданным значением менять состояние соответствующего СТЕП пина.
Можно в одном прерывании таймера, например, инкрементировать 2 счетчика по одному на шаговик и при совпадении одного из них с заданным значением менять состояние соответствующего СТЕП пина.
Одним мотором управлять легко и приятно: настраиваем канал А таймера 1 на совпадение и в прерывании присваиваем новое значение OCR (или не присваиваем если ускорение =0). И вот казалось бы: повторяем все то же для канала В и дело в шляпе, но как я понял (поправьте пожалуйста если это не так) из даташита в режиме СТС можно использовать для сравнения только OCR1A.
неправильно поняли, можно использовать и OCR1B (ШИМ на двух каналах ведь можно настроить свой на каждом канале?).
Только не забывайте, что счетчик у таймера один и не надо его сбрасывать на ноль. И частота у каналов будет общая :)
Частота у каналов общая наверное не пойдет( Движки должны крутиться с разной скоростью, и иметь возможность ускорятся и замедлятся, правда последнее, скорее всего, - синхронно.
Частота у каналов общая наверное не пойдет( Движки должны крутиться с разной скоростью, и иметь возможность ускорятся и замедлятся, правда последнее, скорее всего, - синхронно.
Делай ускорение кратным циклу максимальной скорости, пиши логику в прерывании.
Частота у каналов общая наверное не пойдет( Движки должны крутиться с разной скоростью, и иметь возможность ускорятся и замедлятся, правда последнее, скорее всего, - синхронно.
общая частота этому никак не мешает.
Частота у каналов общая наверное не пойдет( Движки должны крутиться с разной скоростью, и иметь возможность ускорятся и замедлятся, правда последнее, скорее всего, - синхронно.
Пойдет. Если частота эта будет довольно большой. На каждом тике к 2-м счетчикам прибавляешь к каждому свою "скорость". Когда счетчик переполнится - пора делать шаг. Но будет много бесполезных прерываний, при которых переполнений нет. А это сожрет процессорное время. Потому правильней, но намного сложней, в прерывании рассчитать сколько времени до следующего шага каждого движка и настроить таймер для формирования минимального из этих времен. Так таймер можно расшарить на много разных задач, но много "подводных камней" у подхода.
Бери китайский клон, там на один таймер больше.
Пойдет. Если частота эта будет довольно большой. На каждом тике к 2-м счетчикам
каким двум счетчикам, Логик? У таймера два регистра сравнения. а счетчик у него ОДИН
програмным разумеется))) переменные - счетчики. А аппаратный счетчик таймера - он для прерывания.
Я как раз о первом подходе думал.
Можно в одном прерывании таймера, например, инкрементировать 2 счетчика по одному на шаговик и при совпадении одного из них с заданным значением менять состояние соответствующего СТЕП пина.
Да много "пустых" прерываний, но в скетче во время движения моторов особо ничего другого не происходит, может экран 1602 несколько раз в секунду обновится и всё.
програмным разумеется))) переменные - счетчики. А аппаратный счетчик таймера - он для прерывания.
что мешает управлять на каждом канале своим мотором? Вместо "счетчиков" просто в прерывании устанавливаем новые значения регистра сравнения и ждем следующего прерывания. И никаких лишних прерываний не будет.
что мешает управлять на каждом канале своим мотором? Вместо "счетчиков" просто в прерывании устанавливаем новые значения регистра сравнения и ждем следующего прерывания. И никаких лишних прерываний не будет.
Можно, пожалуйста, кусок кода для проверки?
//Да много "пустых" прерываний, но в скетче во время движения моторов особо ничего другого не происходит, может экран 1602 несколько раз в секунду обновится и всё.
аппетит приходит во время еды))) Я бы таки про это думал http://arduino.ru/forum/apparatnye-voprosy/obzor-klona-megi328-lgt8f328p. Там на предпоследних страницах как раз его за таймер 3 дергали
програмным разумеется))) переменные - счетчики. А аппаратный счетчик таймера - он для прерывания.
что мешает управлять на каждом канале своим мотором? Вместо "счетчиков" просто в прерывании устанавливаем новые значения регистра сравнения и ждем следующего прерывания. И никаких лишних прерываний не будет.
так ты ж дочитай #11 до конца)))
Можно, пожалуйста, кусок кода для проверки?
нельзя
так ты ж дочитай #11 до конца)))
не, у тебя не так - у тебя там все в одном прерывании делается. А я предлагаю для каждого мотора - свое прерывание. Тогда не надо будет рассчитывать "минимальное из двух времен". И прерываний лишних не будет
Такое не получится при большой разнице скоростей. А мы про это ниче не знаем.
Да может он оверинжинирингом занимается, а на самом деле хватит блинка без дилэя.
програмным разумеется))) переменные - счетчики. А аппаратный счетчик таймера - он для прерывания.
что мешает управлять на каждом канале своим мотором? Вместо "счетчиков" просто в прерывании устанавливаем новые значения регистра сравнения и ждем следующего прерывания. И никаких лишних прерываний не будет.
Молодец! Не сарказм. Именно так и можно управлять двумя моторами на одном таймере. будут некие очевидные ограничения по скорости.
Примерно такой пример я писал на форуме на то, как на один таймер подвесить штук 7-8 LED, каждый со своим ШИМом. Использовать A и B каналы - сам Б..г велел. В прерывании переставляешь OCRх на следующее значение. Можно на одном канале сделать, но вычислений больше будет, чтобы найти точку следующего прерывания и указать - какому каналу она принадлежит. Но не то, чтобы очень сложно.
Садман41 прав. На таймере получается почти как на "блинк без делей" просто чуть сложнее. на оверфлоу вешаешь инкремент оборотов и вместе со счетчиком таймера получаешь просто счетчик тиков длинный, очень длинный! ;)) В прерывании вычисляешь тик следующего прерывания и переставляешь OCR на него. Номер канала, которому принадлежит текущее действие, естественно хранишь отдельно. Прерывание такое получится тактов на 100 примерно, со всеми блэкджеками и шл...ми. То есть точность фронта 6 мкс примерно. Что для скоростей шаговика - вполне пристойно, ИМХО.
//Но не то, чтобы очень сложно.
Сложно. Там много "подводных камней". Когда времена для нескольких совпадают, когда почти совпадают, т.е. различаются на время менее чем исполнение обработчика прерываний, когда основной код меняет скорость (ШИМ для светодиодов в твоем случае), а таймер уже настроен и нужно бы перенастроить и т.д. Там куча возни, а вычисления следующего прерывания само время занимает и это в учет идет для приличных скоростей.
//Но не то, чтобы очень сложно.
Сложно. Там много "подводных камней". Когда времена для нескольких совпадают, когда почти совпадают, т.е. различаются на время менее чем исполнение обработчика прерываний, когда основной код меняет скорость (ШИМ для светодиодов в твоем случае), а таймер уже настроен и нужно бы перенастроить и т.д. Там куча возни, а вычисления следующего прерывания само время занимает и это в учет идет для приличных скоростей.
Это проверяется при установке следующего OCR. Но в целом да, задачка не для начинающего, но решаемая. Я бы - не стал решать для себя и взял бы другой контроллер с достаточным количеством таймеров.
Мои "поделки" у меня немножно газом и киловаттными ТЭНами управляют. И, как я уже писал неоднократно, я не готов испытывать себя на поприще строительства крематориев! ;))) Некоторые железяки, как раз с таймерами, работают не выключаясь месяцами, а я спать спокойно хочу, не думая о случайных накладках.
А я 5 лет как решил и пользуюсь для 1ware (только так и работаю), сервомашинок(как правило) и ШИМ(все реже, нечего шимовать, WS2812B вытеснила напрочь обычные светодиоды).
Допустим, скорость мотора1 в несколько раз больше скорости мотора2. Тогда таймер считает не сбрасываясь вплоть до прерывания канала мотора2 и уже в нем сбрасывается, за это время успевают произойти несколько прерываний канала мотора1 в каждом из которых этому каналу присваивается новый OCR, который каждый раз увеличивается на некое фиксированное значение, верно? Как тогда будут выглядеть регистры настройки таймера для такого режима?
Сколько уже раз писали что не надо натягивать сову на глобус. Взять нормальный МК под задачу и все проблемы уйдут. Блю пил с его четырьмя таймерами полностью покроет задачу и ещё останется на что нибудь красивое.
в меге тоже куча таймеров
Мда. Напоминает мне это анекдот:
Выходит девка с зоны - интиму хочется, а вокруг поле...Русское поле. А вдалике косит кто-то. Подошла поближе, а там мужик в ластах, маске и с трубкой поле косит. Она к нему с нескромным преложением, а он:
- Давай, но только стоя в гамаке - я трудности люблю....