Управление двумя шаговиками посредством одного таймера

Tolik4
Offline
Зарегистрирован: 05.01.2018

Здравствуйте уважаемые форумчане. Обращаюсь к вам с таким вопросом: как используя один таймер ардуино управлять двумя шаговиками по степ/дир. Одним мотором управлять легко и приятно: настраиваем канал А таймера 1 на совпадение и в прерывании присваиваем новое значение OCR (или не присваиваем если ускорение =0). И вот казалось бы: повторяем все то же для канала В и дело в шляпе, но как я понял (поправьте пожалуйста если это не так) из даташита в режиме СТС можно использовать для сравнения только OCR1A. Какая-то надежда всё ещё теплится т.к. прерывание от канала В в списке прерываний все-таки есть, осталось только понять как и вкаком режиме его применить (если это вообще возможно). 

rkit
Offline
Зарегистрирован: 23.11.2016

И как это должно работать, по-твоему? Таймер будет сбрасываться в ноль по двум разным значениям?

Tolik4
Offline
Зарегистрирован: 05.01.2018

Это уже ясно, хочется как раз послушать знающих людей как можно это ограничение обойти или, если нельзя, то как силами одного таймера решить задачу без особых велосипедов. Можно в одном прерывании таймера, например, инкрементировать 2  счетчика по одному на шаговик и при совпадении одного из них с заданным значением менять состояние соответствующего СТЕП пина. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Tolik4 пишет:

Можно в одном прерывании таймера, например, инкрементировать 2  счетчика по одному на шаговик и при совпадении одного из них с заданным значением менять состояние соответствующего СТЕП пина. 

Ну, другими словами, интервалы будет отмерять не таймер аппаратно, а сам ЦПУ в прерываниях. В принципе оно, конечно, можно. Только следует учитывать, что точность отсчета снизится примерно в 150 раз. Т.к. никаких конкретных цифр не приведено, сказать, можно ли таким образом решить поставленную задачу, не представляется возможным.

b707
Offline
Зарегистрирован: 26.05.2017

Tolik4 пишет:

Одним мотором управлять легко и приятно: настраиваем канал А таймера 1 на совпадение и в прерывании присваиваем новое значение OCR (или не присваиваем если ускорение =0). И вот казалось бы: повторяем все то же для канала В и дело в шляпе, но как я понял (поправьте пожалуйста если это не так) из даташита в режиме СТС можно использовать для сравнения только OCR1A.

неправильно поняли, можно использовать и OCR1B  (ШИМ на двух каналах ведь можно настроить свой на каждом канале?).

Только не забывайте, что счетчик у таймера один и не надо его сбрасывать на ноль. И частота у каналов будет общая :)

Tolik4
Offline
Зарегистрирован: 05.01.2018

Частота у каналов общая наверное не пойдет( Движки должны крутиться с разной скоростью, и иметь возможность ускорятся и замедлятся, правда последнее, скорее всего, - синхронно.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Tolik4 пишет:

Частота у каналов общая наверное не пойдет( Движки должны крутиться с разной скоростью, и иметь возможность ускорятся и замедлятся, правда последнее, скорее всего, - синхронно.

Ну тогда надо идти за средствами к Управлению.  Без средств не выйдет.  Или будет так https://youtu.be/a27YCMFsob0?t=219

rkit
Offline
Зарегистрирован: 23.11.2016

Делай ускорение кратным циклу максимальной скорости, пиши логику в прерывании.

b707
Offline
Зарегистрирован: 26.05.2017

Tolik4 пишет:

Частота у каналов общая наверное не пойдет( Движки должны крутиться с разной скоростью, и иметь возможность ускорятся и замедлятся, правда последнее, скорее всего, - синхронно.

общая частота этому никак не мешает.

Logik
Offline
Зарегистрирован: 05.08.2014

Tolik4 пишет:

Частота у каналов общая наверное не пойдет( Движки должны крутиться с разной скоростью, и иметь возможность ускорятся и замедлятся, правда последнее, скорее всего, - синхронно.

Пойдет. Если частота эта будет довольно большой. На каждом тике к 2-м счетчикам прибавляешь к каждому свою "скорость". Когда счетчик переполнится - пора делать шаг. Но будет много бесполезных прерываний, при которых переполнений нет. А это сожрет процессорное время. Потому правильней, но намного сложней, в прерывании рассчитать сколько времени до следующего шага каждого движка и настроить таймер для формирования минимального из этих времен. Так таймер можно расшарить на много разных задач, но много "подводных камней" у подхода.

Бери китайский клон, там на один таймер больше.

b707
Offline
Зарегистрирован: 26.05.2017

Logik пишет:

Пойдет. Если частота эта будет довольно большой. На каждом тике к 2-м счетчикам

каким двум счетчикам, Логик? У таймера два регистра сравнения. а счетчик у него ОДИН

Logik
Offline
Зарегистрирован: 05.08.2014

програмным разумеется))) переменные - счетчики. А аппаратный счетчик таймера - он для прерывания.

 

Tolik4
Offline
Зарегистрирован: 05.01.2018

Я как раз о первом подходе думал.

Tolik4 пишет:

Можно в одном прерывании таймера, например, инкрементировать 2  счетчика по одному на шаговик и при совпадении одного из них с заданным значением менять состояние соответствующего СТЕП пина. 

Да много "пустых" прерываний, но в скетче во время движения моторов особо ничего другого не происходит, может экран 1602 несколько раз в секунду обновится  и всё.

b707
Offline
Зарегистрирован: 26.05.2017

Logik пишет:

програмным разумеется))) переменные - счетчики. А аппаратный счетчик таймера - он для прерывания.

что мешает управлять на каждом канале своим мотором? Вместо "счетчиков" просто в прерывании устанавливаем новые значения регистра сравнения и ждем следующего прерывания. И никаких лишних прерываний не будет.

Tolik4
Offline
Зарегистрирован: 05.01.2018

b707 пишет:

что мешает управлять на каждом канале своим мотором? Вместо "счетчиков" просто в прерывании устанавливаем новые значения регистра сравнения и ждем следующего прерывания. И никаких лишних прерываний не будет.

Можно, пожалуйста, кусок кода для проверки?

Logik
Offline
Зарегистрирован: 05.08.2014

//Да много "пустых" прерываний, но в скетче во время движения моторов особо ничего другого не происходит, может экран 1602 несколько раз в секунду обновится  и всё.

 

 

аппетит приходит во время еды))) Я бы таки про это думал http://arduino.ru/forum/apparatnye-voprosy/obzor-klona-megi328-lgt8f328p. Там на предпоследних страницах как раз его за таймер 3 дергали

Logik
Offline
Зарегистрирован: 05.08.2014

b707 пишет:

Logik пишет:

програмным разумеется))) переменные - счетчики. А аппаратный счетчик таймера - он для прерывания.

что мешает управлять на каждом канале своим мотором? Вместо "счетчиков" просто в прерывании устанавливаем новые значения регистра сравнения и ждем следующего прерывания. И никаких лишних прерываний не будет.

так ты ж дочитай #11 до конца)))

b707
Offline
Зарегистрирован: 26.05.2017

Tolik4 пишет:

Можно, пожалуйста, кусок кода для проверки?

нельзя

b707
Offline
Зарегистрирован: 26.05.2017

Logik пишет:

так ты ж дочитай #11 до конца)))

не, у тебя не так - у тебя там все в одном прерывании делается. А я предлагаю для каждого мотора - свое прерывание. Тогда не надо будет рассчитывать "минимальное из двух времен". И прерываний лишних не будет

Logik
Offline
Зарегистрирован: 05.08.2014

Такое не получится при большой разнице скоростей. А мы про это ниче не знаем.

sadman41
Offline
Зарегистрирован: 19.10.2016

Да может он оверинжинирингом занимается, а на самом деле хватит блинка без дилэя.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

b707 пишет:

Logik пишет:

програмным разумеется))) переменные - счетчики. А аппаратный счетчик таймера - он для прерывания.

что мешает управлять на каждом канале своим мотором? Вместо "счетчиков" просто в прерывании устанавливаем новые значения регистра сравнения и ждем следующего прерывания. И никаких лишних прерываний не будет.

Молодец! Не сарказм. Именно так и можно управлять двумя моторами на одном таймере. будут некие очевидные ограничения по скорости.

Примерно такой пример я писал на форуме на то, как на один таймер подвесить штук 7-8 LED, каждый со своим ШИМом. Использовать A и B каналы - сам Б..г велел. В прерывании переставляешь OCRх  на следующее значение. Можно на одном канале сделать, но вычислений больше будет, чтобы найти точку следующего прерывания и указать - какому каналу она принадлежит. Но не то, чтобы очень сложно.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Садман41 прав. На таймере получается почти как на "блинк без делей" просто чуть сложнее. на оверфлоу вешаешь инкремент оборотов и вместе со счетчиком таймера получаешь просто счетчик тиков длинный, очень длинный! ;)) В прерывании вычисляешь тик следующего прерывания и переставляешь OCR на него. Номер канала, которому принадлежит текущее действие, естественно хранишь отдельно. Прерывание такое получится тактов на 100 примерно, со всеми блэкджеками и шл...ми. То есть точность фронта 6 мкс примерно. Что для скоростей шаговика - вполне пристойно, ИМХО.

Logik
Offline
Зарегистрирован: 05.08.2014

//Но не то, чтобы очень сложно.

Сложно. Там много "подводных камней". Когда времена для нескольких совпадают, когда почти совпадают, т.е. различаются на время менее чем исполнение обработчика прерываний, когда основной код меняет скорость (ШИМ для светодиодов в твоем случае), а таймер уже настроен и нужно бы перенастроить и т.д. Там куча возни, а вычисления следующего прерывания само время занимает и это в учет идет для приличных скоростей. 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Logik пишет:

//Но не то, чтобы очень сложно.

Сложно. Там много "подводных камней". Когда времена для нескольких совпадают, когда почти совпадают, т.е. различаются на время менее чем исполнение обработчика прерываний, когда основной код меняет скорость (ШИМ для светодиодов в твоем случае), а таймер уже настроен и нужно бы перенастроить и т.д. Там куча возни, а вычисления следующего прерывания само время занимает и это в учет идет для приличных скоростей. 

Это проверяется при установке следующего OCR. Но в целом да, задачка не для начинающего, но решаемая. Я бы - не стал решать для себя и взял бы другой контроллер с достаточным количеством таймеров.

Мои "поделки" у меня немножно газом и киловаттными ТЭНами управляют. И, как я уже писал неоднократно, я не готов испытывать себя на поприще строительства крематориев! ;))) Некоторые железяки, как раз с таймерами, работают не выключаясь месяцами, а я спать спокойно хочу, не думая о случайных накладках.

Logik
Offline
Зарегистрирован: 05.08.2014

А я 5 лет как решил и пользуюсь для 1ware (только так и работаю), сервомашинок(как правило) и ШИМ(все реже, нечего шимовать, WS2812B вытеснила напрочь обычные светодиоды).

Tolik4
Offline
Зарегистрирован: 05.01.2018

Допустим, скорость мотора1 в несколько раз больше скорости мотора2. Тогда таймер считает не сбрасываясь вплоть до прерывания канала мотора2 и уже в нем сбрасывается, за это время успевают произойти несколько прерываний канала мотора1 в каждом из которых этому каналу присваивается новый OCR, который каждый раз увеличивается на некое фиксированное значение, верно? Как тогда будут выглядеть регистры настройки таймера для такого режима?

nik182
Offline
Зарегистрирован: 04.05.2015

Сколько уже раз писали что не надо натягивать сову на глобус. Взять нормальный МК под задачу и все проблемы уйдут. Блю пил с его четырьмя таймерами полностью покроет задачу и ещё останется на что нибудь красивое. 

vvadim
Offline
Зарегистрирован: 23.05.2012

в меге тоже куча таймеров

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Мда. Напоминает мне это анекдот:

Выходит девка с зоны - интиму хочется, а вокруг поле...Русское поле. А вдалике косит кто-то. Подошла поближе, а там мужик в ластах, маске и с трубкой поле косит. Она к нему с нескромным преложением, а он:

- Давай, но только стоя в гамаке - я трудности люблю....