Arduino AccelStepper
- AndyBig
- Мастер
- Сообщения: 3971
- Зарегистрирован: 07 мар 2014, 04:01
- Репутация: 1121
- Откуда: юг России
- Контактная информация:
Re: Arduino AccelStepper
Ни эти микроконтроллеры, ни тем более ардуиновские монструозные библиотеки, совершенно не заточены под такие задачи. Как-то крутить шаговик - да, хорошо и быстро крутить - нет
Это можно сравнить с попытками сделать из конструктора лего портальный фрезер: шевелиться почти как настоящий - будет, обрабатывать материал кроме пенопласта - нет 
- selenur
- Почётный участник

- Сообщения: 4605
- Зарегистрирован: 21 авг 2013, 19:44
- Репутация: 1622
- Настоящее имя: Сергей
- Откуда: Новый Уренгой
- Контактная информация:
Re: Arduino AccelStepper
Как-то у меня не доходили руки выяснить почему в Marlin прошивках удавалось получать высокую частоту STEP, при той навороченности функционала, а оказалось: http://3dtoday.ru/blogs/eta4ever/marlin ... ep-signal/
вот небольшая выдержка от туда:
вот небольшая выдержка от туда:
но при таком раскладе ни о какой равномерности сигнала, и речи не будет.....Marlin хитрая. Она где-то внутри прикидывает, хватит ли частоты выдачи сигнала STEP при одном импульсе на прерывание. Если не хватает - то начинает выдавать по два импульса на прерывание. Эффективная частота увеличивается, но импульсы следуют не через равный промежуток. А если опять не хватает - то уже по четыре на прерывание.
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
- grakun
- Мастер
- Сообщения: 273
- Зарегистрирован: 30 сен 2015, 02:47
- Репутация: 53
- Настоящее имя: Гракун
- Откуда: г.Саратов
- Контактная информация:
Re: Arduino AccelStepper
Просто речь шла про ардуино. В остальном согласен.selenur писал(а):А толку то от этих 1,5 мгц?
- grakun
- Мастер
- Сообщения: 273
- Зарегистрирован: 30 сен 2015, 02:47
- Репутация: 53
- Настоящее имя: Гракун
- Откуда: г.Саратов
- Контактная информация:
Re: Arduino AccelStepper
Крутить будет хорошо, но не быстро, для большинства самодельных конструкций где шаг 1\4 или 1\8 подходит.AndyBig писал(а):Как-то крутить шаговик - да, хорошо и быстро крутить - нет
-
Tomasina
- Новичок
- Сообщения: 8
- Зарегистрирован: 27 окт 2015, 15:06
- Репутация: 0
- Настоящее имя: Дмитрий
- Контактная информация:
Re: Arduino AccelStepper
расчет занимает 328 мксек, вывод на дисплей - 1032 мксек.ALS писал(а): А то, может, ардуина там интегралы в степеня возводит, пытаясь проделать элементарные вычисления...
однако в вашем контроллере, судя по видео, это происходит одновременно. Значит, это возможно.grakun писал(а):Никак. Или ШД или индикатор.
-
Morroc
- Мастер
- Сообщения: 202
- Зарегистрирован: 22 ноя 2015, 03:17
- Репутация: 22
- Настоящее имя: Александр
- Контактная информация:
Re: Arduino AccelStepper
Конечно возможно. Но используя готовые библиотеки AccelStepper / OLED как есть и не используя прерываний... никак. Там прикручивать не долго - в инете есть статьи, шанс, что оно заработает высокий, но на паре пинов отвалится ШИМ (если это вдруг важно).
Ардуина на AVR не заканчивается, можно взять чего пожирнее и дергать ногой почаще
(из дешевого - платка размером с Arduino Nano на stm32 или модуль esp8266 - под них среда такая же ардуинская, только совместимость не 100%)
Ардуина на AVR не заканчивается, можно взять чего пожирнее и дергать ногой почаще
- grakun
- Мастер
- Сообщения: 273
- Зарегистрирован: 30 сен 2015, 02:47
- Репутация: 53
- Настоящее имя: Гракун
- Откуда: г.Саратов
- Контактная информация:
Re: Arduino AccelStepper
Там не одновременно. Индикация после каждой выполненной строки в программе.Tomasina писал(а):однако в вашем контроллере, судя по видео, это происходит одновременно. Значит, это возможно.
- grakun
- Мастер
- Сообщения: 273
- Зарегистрирован: 30 сен 2015, 02:47
- Репутация: 53
- Настоящее имя: Гракун
- Откуда: г.Саратов
- Контактная информация:
Re: Arduino AccelStepper
У меня не вышло, сделать одновременно и не потерять скорость. Если знаете как, дайте ссылки на статьи. Думаю это возможно, если поставить еще одну микросхему для подсчета импульсов непосредственно на выходах.Morroc писал(а):Конечно возможно.
- AndyBig
- Мастер
- Сообщения: 3971
- Зарегистрирован: 07 мар 2014, 04:01
- Репутация: 1121
- Откуда: юг России
- Контактная информация:
Re: Arduino AccelStepper
Кстати, этот кусок:
вот так будет несколько быстрее работать:
1088 тактов вместо 1513 
Код: Выделить всё
Digits[0] = (currentPositionMM / 1000) % 10;
Digits[1] = (currentPositionMM / 100) % 10;
Digits[2] = (currentPositionMM / 10) % 10;
Digits[3] = (currentPositionMM % 10);Код: Выделить всё
int tmp1 = currentPositionMM / 1000;
Digits[0] = tmp1 % 10;
tmp1 = currentPositionMM - tmp1 * 1000;
Digits[1] = tmp1 / 100;
tmp1 = tmp1 - Digits[1] * 100;
Digits[2] = tmp1 / 10;
Digits[3] = tmp1 - Digits[2] * 10;
-
Morroc
- Мастер
- Сообщения: 202
- Зарегистрирован: 22 ноя 2015, 03:17
- Репутация: 22
- Настоящее имя: Александр
- Контактная информация:
Re: Arduino AccelStepper
Чтобы прям совсем совсем не потерять... может и не выйдет если уже на предельной, хотя можно поставить вторую ардуину исключительно для шдgrakun писал(а):У меня не вышло, сделать одновременно и не потерять скорость. Если знаете как, дайте ссылки на статьи. Думаю это возможно, если поставить еще одну микросхему для подсчета импульсов непосредственно на выходах.Morroc писал(а):Конечно возможно.
Вот тут о библиотеке для работы с таймером (можно проще, но думаю так понятней)
http://robocraft.ru/blog/arduino/614.html
Нужно подобрать интервал таймера (10-100ms, как можно больше, но чтобы двигатель плавно работал при этом) и в аналог вашей функции Timer_action() добавить if (needStepper == true) stepper.run(); Функция будет вызываться автоматически через заданный интервал независимо от вывода на дисплей.
вот еще какой то вариант преобразования числа в строку с красивостями, обещали, что быстрый )
Код: Выделить всё
char buffer[12];
utoa_fast_div(rx, buffer, sizeof(buffer)); //rx - число
lcd.print(buffer);
// быстрое преобразования числа в строку с разделителем разрядов
// , uint8_t tcnt
char * utoa_fast_div(uint32_t value, char *buffer, uint8_t tcnt) {
uint8_t dcnt = 0;
uint32_t quot;
uint8_t rem;
buffer += tcnt;
*--buffer = 0;
do
{
divmodu10(value, quot, rem);
*--buffer = rem + '0';
dcnt++;
tcnt--;
if (dcnt > 2) { *--buffer = '.'; dcnt = 0; tcnt--;}
value = quot;
}
while (value != 0);
tcnt--;
while (tcnt > 0) {
tcnt--;
*--buffer = ' ';
};
return buffer;
}
- grakun
- Мастер
- Сообщения: 273
- Зарегистрирован: 30 сен 2015, 02:47
- Репутация: 53
- Настоящее имя: Гракун
- Откуда: г.Саратов
- Контактная информация:
Re: Arduino AccelStepper
Нельзя так делать, при любом прерывании частоты step двигатель "стучит". А при периодическом, получится погремушка.Morroc писал(а):Нужно подобрать интервал таймера (10-100ms, как можно больше, но чтобы двигатель плавно работал
-
Morroc
- Мастер
- Сообщения: 202
- Зарегистрирован: 22 ноя 2015, 03:17
- Репутация: 22
- Настоящее имя: Александр
- Контактная информация:
Re: Arduino AccelStepper
Так вы же именно для двигателя и будете прерывать все остальное. Насчет подбора интервала получается как то так - за время между прерываниями должен успевать выполняться .run() с запасом, но если делать это (прерывания) слишком часто - будут тормозиться остальные процессы.
- grakun
- Мастер
- Сообщения: 273
- Зарегистрирован: 30 сен 2015, 02:47
- Репутация: 53
- Настоящее имя: Гракун
- Откуда: г.Саратов
- Контактная информация:
Re: Arduino AccelStepper
Что бы что то прервать сначала это нужно запустить и в то время пока идет сигнал step этого делать нельзя(исключение команда стопа и пауза). Что бы запустить step нужно просчитать математику и потом без всяких прерываний тупо запустить командой и сделать один шаг, потом опять математика еще шаг...Процесс периодический и вмешиваться в него нельзя. Я хотел бы понять по конкретней что Вы имеете ввиду под остальным, что прерывать то нужно, если ничего больше не запущено? Это же не win.Morroc писал(а):Так вы же именно для двигателя и будете прерывать все остальное.
- AndyBig
- Мастер
- Сообщения: 3971
- Зарегистрирован: 07 мар 2014, 04:01
- Репутация: 1121
- Откуда: юг России
- Контактная информация:
Re: Arduino AccelStepper
Если хотите выжать из AVR максимум, то выкидывайте все ардуиновские библиотеки и пишите нормальный оптимальный код на Си, используя по максимуму аппаратные возможности - таймеры, прерывания
Плюс компилятор взять получше - тот же IAR 
- grakun
- Мастер
- Сообщения: 273
- Зарегистрирован: 30 сен 2015, 02:47
- Репутация: 53
- Настоящее имя: Гракун
- Откуда: г.Саратов
- Контактная информация:
Re: Arduino AccelStepper
Но это же очевидные и понятные вещи, зачем повторять их.AndyBig писал(а):Если хотите выжать из AVR максимум, то выкидывайте все ардуиновские библиотеки и пишите нормальный оптимальный код на Си, используя по максимуму аппаратные возможности - таймеры, прерыванияПлюс компилятор взять получше - тот же IAR
-
Morroc
- Мастер
- Сообщения: 202
- Зарегистрирован: 22 ноя 2015, 03:17
- Репутация: 22
- Настоящее имя: Александр
- Контактная информация:
Re: Arduino AccelStepper
step - это изменение управляющих сигналов из одного состояния в другое, происходящее достаточно быстро, между этими изменениями можно что нибудь делать.grakun писал(а): Что бы что то прервать сначала это нужно запустить и в то время пока идет сигнал step этого делать нельзя(исключение команда стопа и пауза).
Верно, это делает вызов stepper.run(). В вашем цикле он тоже постоянно вызывается.grakun писал(а): Что бы запустить step нужно просчитать математику и потом без всяких прерываний тупо запустить командой и сделать один шаг
В идеале следовало бы совсем завязать библиотеку ШД на таймер (возможно такая и готовая есть) - тогда проблемы не было бы, но я предлагаю несколько скрестить ужа с ежом - вызывать достаточно часто stepper.run() по прерыванию от таймера и если он там внутри решил, что пора шагать (тоже по таймеру, но другому) - он шагает и никакие print'ы на дисплей этому помешать не могут. Возможная неравномерность будет определяться частотой вызова.grakun писал(а): , потом опять математика еще шаг... Процесс периодический и вмешиваться в него нельзя.
Прерывать нужно обновление дисплея. Прервать, шагнуть двигателем и вернуться к дисплею. Не win, но шаг в сторону win - простейшая многозадачность. Болезнь win в виде некоторой неравномерности шагов тут тоже будетgrakun писал(а): Я хотел бы понять по конкретней что Вы имеете ввиду под остальным, что прерывать то нужно, если ничего больше не запущено? Это же не win.
Так ведь можно и в программиста превратитьсяAndyBig писал(а):Если хотите выжать из AVR максимум, то выкидывайте все ардуиновские библиотеки и пишите нормальный оптимальный код на Си, используя по максимуму аппаратные возможности - таймеры, прерыванияПлюс компилятор взять получше - тот же IAR
- AndyBig
- Мастер
- Сообщения: 3971
- Зарегистрирован: 07 мар 2014, 04:01
- Репутация: 1121
- Откуда: юг России
- Контактная информация:
Re: Arduino AccelStepper
Тут, как я понимаю, продолжают мучать ардуину в ардуиновской среде с ардуиновскими библиотеками и скетчами... Или я ошибся?grakun писал(а):Но это же очевидные и понятные вещи, зачем повторять их.
На мой взгляд все расчеты должны вестись не в вызове процедуры генерации очередного степа, а в основном цикле, пока результатами не будет заполнен некий буфер. А прерывание генерации степов должно просто брать готовый результат и выдавать его на выводы.
Дисплей же - вообще дело десятое и плевать если он будет обновляться с задержками
-
Morroc
- Мастер
- Сообщения: 202
- Зарегистрирован: 22 ноя 2015, 03:17
- Репутация: 22
- Настоящее имя: Александр
- Контактная информация:
Re: Arduino AccelStepper
Там не такие уж офигенные вычисления (в AccelStepper). Или надо шагать реально на 1.5 мГц ? oO
Tomasina писал(а):нужно отображать пройденное кареткой расстояние, а это хотя бы 1-2 раза в секунду нужно обновлять дисплей, и в это время движок замирает (по звуку слышно), а мне нужно строго равномерное движение
1 раз в секунду пропуск 1.3ms слышен ? точно он ?Tomasina писал(а): расчет занимает 328 мксек, вывод на дисплей - 1032 мксек.
-
Tomasina
- Новичок
- Сообщения: 8
- Зарегистрирован: 27 окт 2015, 15:06
- Репутация: 0
- Настоящее имя: Дмитрий
- Контактная информация:
Re: Arduino AccelStepper
точно он, без кода вывода на дисплей звук равномерный.
-
Morroc
- Мастер
- Сообщения: 202
- Зарегистрирован: 22 ноя 2015, 03:17
- Репутация: 22
- Настоящее имя: Александр
- Контактная информация:
Re: Arduino AccelStepper
Что то типа щелчка раз в секунду негромкого ? А шаг с какой частотой идет ?