Arduino AccelStepper

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
AndyBig
Мастер
Сообщения: 3971
Зарегистрирован: 07 мар 2014, 04:01
Репутация: 1121
Откуда: юг России
Контактная информация:

Re: Arduino AccelStepper

Сообщение AndyBig »

Ни эти микроконтроллеры, ни тем более ардуиновские монструозные библиотеки, совершенно не заточены под такие задачи. Как-то крутить шаговик - да, хорошо и быстро крутить - нет :) Это можно сравнить с попытками сделать из конструктора лего портальный фрезер: шевелиться почти как настоящий - будет, обрабатывать материал кроме пенопласта - нет :)
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4605
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1622
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Arduino AccelStepper

Сообщение selenur »

Как-то у меня не доходили руки выяснить почему в 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/
Аватара пользователя
grakun
Мастер
Сообщения: 273
Зарегистрирован: 30 сен 2015, 02:47
Репутация: 53
Настоящее имя: Гракун
Откуда: г.Саратов
Контактная информация:

Re: Arduino AccelStepper

Сообщение grakun »

selenur писал(а):А толку то от этих 1,5 мгц?
Просто речь шла про ардуино. В остальном согласен.
Аватара пользователя
grakun
Мастер
Сообщения: 273
Зарегистрирован: 30 сен 2015, 02:47
Репутация: 53
Настоящее имя: Гракун
Откуда: г.Саратов
Контактная информация:

Re: Arduino AccelStepper

Сообщение grakun »

AndyBig писал(а):Как-то крутить шаговик - да, хорошо и быстро крутить - нет
Крутить будет хорошо, но не быстро, для большинства самодельных конструкций где шаг 1\4 или 1\8 подходит.
Tomasina
Новичок
Сообщения: 8
Зарегистрирован: 27 окт 2015, 15:06
Репутация: 0
Настоящее имя: Дмитрий
Контактная информация:

Re: Arduino AccelStepper

Сообщение Tomasina »

ALS писал(а): А то, может, ардуина там интегралы в степеня возводит, пытаясь проделать элементарные вычисления...
расчет занимает 328 мксек, вывод на дисплей - 1032 мксек.
grakun писал(а):Никак. Или ШД или индикатор.
однако в вашем контроллере, судя по видео, это происходит одновременно. Значит, это возможно. :thinking:
Morroc
Мастер
Сообщения: 202
Зарегистрирован: 22 ноя 2015, 03:17
Репутация: 22
Настоящее имя: Александр
Контактная информация:

Re: Arduino AccelStepper

Сообщение Morroc »

Конечно возможно. Но используя готовые библиотеки AccelStepper / OLED как есть и не используя прерываний... никак. Там прикручивать не долго - в инете есть статьи, шанс, что оно заработает высокий, но на паре пинов отвалится ШИМ (если это вдруг важно).

Ардуина на AVR не заканчивается, можно взять чего пожирнее и дергать ногой почаще :) (из дешевого - платка размером с Arduino Nano на stm32 или модуль esp8266 - под них среда такая же ардуинская, только совместимость не 100%)
Аватара пользователя
grakun
Мастер
Сообщения: 273
Зарегистрирован: 30 сен 2015, 02:47
Репутация: 53
Настоящее имя: Гракун
Откуда: г.Саратов
Контактная информация:

Re: Arduino AccelStepper

Сообщение grakun »

Tomasina писал(а):однако в вашем контроллере, судя по видео, это происходит одновременно. Значит, это возможно.
Там не одновременно. Индикация после каждой выполненной строки в программе.
Аватара пользователя
grakun
Мастер
Сообщения: 273
Зарегистрирован: 30 сен 2015, 02:47
Репутация: 53
Настоящее имя: Гракун
Откуда: г.Саратов
Контактная информация:

Re: Arduino AccelStepper

Сообщение grakun »

Morroc писал(а):Конечно возможно.
У меня не вышло, сделать одновременно и не потерять скорость. Если знаете как, дайте ссылки на статьи. Думаю это возможно, если поставить еще одну микросхему для подсчета импульсов непосредственно на выходах.
Аватара пользователя
AndyBig
Мастер
Сообщения: 3971
Зарегистрирован: 07 мар 2014, 04:01
Репутация: 1121
Откуда: юг России
Контактная информация:

Re: Arduino AccelStepper

Сообщение AndyBig »

Кстати, этот кусок:

Код: Выделить всё

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;
1088 тактов вместо 1513 :)
Morroc
Мастер
Сообщения: 202
Зарегистрирован: 22 ноя 2015, 03:17
Репутация: 22
Настоящее имя: Александр
Контактная информация:

Re: Arduino AccelStepper

Сообщение Morroc »

grakun писал(а):
Morroc писал(а):Конечно возможно.
У меня не вышло, сделать одновременно и не потерять скорость. Если знаете как, дайте ссылки на статьи. Думаю это возможно, если поставить еще одну микросхему для подсчета импульсов непосредственно на выходах.
Чтобы прям совсем совсем не потерять... может и не выйдет если уже на предельной, хотя можно поставить вторую ардуину исключительно для шд :D

Вот тут о библиотеке для работы с таймером (можно проще, но думаю так понятней)
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

Сообщение grakun »

Morroc писал(а):Нужно подобрать интервал таймера (10-100ms, как можно больше, но чтобы двигатель плавно работал
Нельзя так делать, при любом прерывании частоты step двигатель "стучит". А при периодическом, получится погремушка.
Morroc
Мастер
Сообщения: 202
Зарегистрирован: 22 ноя 2015, 03:17
Репутация: 22
Настоящее имя: Александр
Контактная информация:

Re: Arduino AccelStepper

Сообщение Morroc »

Так вы же именно для двигателя и будете прерывать все остальное. Насчет подбора интервала получается как то так - за время между прерываниями должен успевать выполняться .run() с запасом, но если делать это (прерывания) слишком часто - будут тормозиться остальные процессы.
Аватара пользователя
grakun
Мастер
Сообщения: 273
Зарегистрирован: 30 сен 2015, 02:47
Репутация: 53
Настоящее имя: Гракун
Откуда: г.Саратов
Контактная информация:

Re: Arduino AccelStepper

Сообщение grakun »

Morroc писал(а):Так вы же именно для двигателя и будете прерывать все остальное.
Что бы что то прервать сначала это нужно запустить и в то время пока идет сигнал step этого делать нельзя(исключение команда стопа и пауза). Что бы запустить step нужно просчитать математику и потом без всяких прерываний тупо запустить командой и сделать один шаг, потом опять математика еще шаг...Процесс периодический и вмешиваться в него нельзя. Я хотел бы понять по конкретней что Вы имеете ввиду под остальным, что прерывать то нужно, если ничего больше не запущено? Это же не win.
Аватара пользователя
AndyBig
Мастер
Сообщения: 3971
Зарегистрирован: 07 мар 2014, 04:01
Репутация: 1121
Откуда: юг России
Контактная информация:

Re: Arduino AccelStepper

Сообщение AndyBig »

Если хотите выжать из AVR максимум, то выкидывайте все ардуиновские библиотеки и пишите нормальный оптимальный код на Си, используя по максимуму аппаратные возможности - таймеры, прерывания :) Плюс компилятор взять получше - тот же IAR :)
Аватара пользователя
grakun
Мастер
Сообщения: 273
Зарегистрирован: 30 сен 2015, 02:47
Репутация: 53
Настоящее имя: Гракун
Откуда: г.Саратов
Контактная информация:

Re: Arduino AccelStepper

Сообщение grakun »

AndyBig писал(а):Если хотите выжать из AVR максимум, то выкидывайте все ардуиновские библиотеки и пишите нормальный оптимальный код на Си, используя по максимуму аппаратные возможности - таймеры, прерывания :) Плюс компилятор взять получше - тот же IAR :)
Но это же очевидные и понятные вещи, зачем повторять их.
Morroc
Мастер
Сообщения: 202
Зарегистрирован: 22 ноя 2015, 03:17
Репутация: 22
Настоящее имя: Александр
Контактная информация:

Re: Arduino AccelStepper

Сообщение Morroc »

grakun писал(а): Что бы что то прервать сначала это нужно запустить и в то время пока идет сигнал step этого делать нельзя(исключение команда стопа и пауза).
step - это изменение управляющих сигналов из одного состояния в другое, происходящее достаточно быстро, между этими изменениями можно что нибудь делать.
grakun писал(а): Что бы запустить step нужно просчитать математику и потом без всяких прерываний тупо запустить командой и сделать один шаг
Верно, это делает вызов stepper.run(). В вашем цикле он тоже постоянно вызывается.
grakun писал(а): , потом опять математика еще шаг... Процесс периодический и вмешиваться в него нельзя.
В идеале следовало бы совсем завязать библиотеку ШД на таймер (возможно такая и готовая есть) - тогда проблемы не было бы, но я предлагаю несколько скрестить ужа с ежом - вызывать достаточно часто stepper.run() по прерыванию от таймера и если он там внутри решил, что пора шагать (тоже по таймеру, но другому) - он шагает и никакие print'ы на дисплей этому помешать не могут. Возможная неравномерность будет определяться частотой вызова.
grakun писал(а): Я хотел бы понять по конкретней что Вы имеете ввиду под остальным, что прерывать то нужно, если ничего больше не запущено? Это же не win.
Прерывать нужно обновление дисплея. Прервать, шагнуть двигателем и вернуться к дисплею. Не win, но шаг в сторону win - простейшая многозадачность. Болезнь win в виде некоторой неравномерности шагов тут тоже будет :D
AndyBig писал(а):Если хотите выжать из AVR максимум, то выкидывайте все ардуиновские библиотеки и пишите нормальный оптимальный код на Си, используя по максимуму аппаратные возможности - таймеры, прерывания :) Плюс компилятор взять получше - тот же IAR :)
Так ведь можно и в программиста превратиться :) А хотелось то всего лишь ШД покрутить с экранчиком.
Аватара пользователя
AndyBig
Мастер
Сообщения: 3971
Зарегистрирован: 07 мар 2014, 04:01
Репутация: 1121
Откуда: юг России
Контактная информация:

Re: Arduino AccelStepper

Сообщение AndyBig »

grakun писал(а):Но это же очевидные и понятные вещи, зачем повторять их.
Тут, как я понимаю, продолжают мучать ардуину в ардуиновской среде с ардуиновскими библиотеками и скетчами... Или я ошибся? :)
На мой взгляд все расчеты должны вестись не в вызове процедуры генерации очередного степа, а в основном цикле, пока результатами не будет заполнен некий буфер. А прерывание генерации степов должно просто брать готовый результат и выдавать его на выводы.
Дисплей же - вообще дело десятое и плевать если он будет обновляться с задержками :)
Morroc
Мастер
Сообщения: 202
Зарегистрирован: 22 ноя 2015, 03:17
Репутация: 22
Настоящее имя: Александр
Контактная информация:

Re: Arduino AccelStepper

Сообщение Morroc »

Там не такие уж офигенные вычисления (в AccelStepper). Или надо шагать реально на 1.5 мГц ? oO
Tomasina писал(а):нужно отображать пройденное кареткой расстояние, а это хотя бы 1-2 раза в секунду нужно обновлять дисплей, и в это время движок замирает (по звуку слышно), а мне нужно строго равномерное движение
Tomasina писал(а): расчет занимает 328 мксек, вывод на дисплей - 1032 мксек.
1 раз в секунду пропуск 1.3ms слышен ? точно он ?
Tomasina
Новичок
Сообщения: 8
Зарегистрирован: 27 окт 2015, 15:06
Репутация: 0
Настоящее имя: Дмитрий
Контактная информация:

Re: Arduino AccelStepper

Сообщение Tomasina »

точно он, без кода вывода на дисплей звук равномерный.
Morroc
Мастер
Сообщения: 202
Зарегистрирован: 22 ноя 2015, 03:17
Репутация: 22
Настоящее имя: Александр
Контактная информация:

Re: Arduino AccelStepper

Сообщение Morroc »

Что то типа щелчка раз в секунду негромкого ? А шаг с какой частотой идет ?
Ответить

Вернуться в «LinuxCNC»