Страница 3 из 5

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 05:48
AndyBig
Ни эти микроконтроллеры, ни тем более ардуиновские монструозные библиотеки, совершенно не заточены под такие задачи. Как-то крутить шаговик - да, хорошо и быстро крутить - нет :) Это можно сравнить с попытками сделать из конструктора лего портальный фрезер: шевелиться почти как настоящий - будет, обрабатывать материал кроме пенопласта - нет :)

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 09:12
selenur
Как-то у меня не доходили руки выяснить почему в Marlin прошивках удавалось получать высокую частоту STEP, при той навороченности функционала, а оказалось: http://3dtoday.ru/blogs/eta4ever/marlin ... ep-signal/

вот небольшая выдержка от туда:
Marlin хитрая. Она где-то внутри прикидывает, хватит ли частоты выдачи сигнала STEP при одном импульсе на прерывание. Если не хватает - то начинает выдавать по два импульса на прерывание. Эффективная частота увеличивается, но импульсы следуют не через равный промежуток. А если опять не хватает - то уже по четыре на прерывание.
но при таком раскладе ни о какой равномерности сигнала, и речи не будет.....

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 09:48
grakun
selenur писал(а):А толку то от этих 1,5 мгц?
Просто речь шла про ардуино. В остальном согласен.

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 10:00
grakun
AndyBig писал(а):Как-то крутить шаговик - да, хорошо и быстро крутить - нет
Крутить будет хорошо, но не быстро, для большинства самодельных конструкций где шаг 1\4 или 1\8 подходит.

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 13:33
Tomasina
ALS писал(а): А то, может, ардуина там интегралы в степеня возводит, пытаясь проделать элементарные вычисления...
расчет занимает 328 мксек, вывод на дисплей - 1032 мксек.
grakun писал(а):Никак. Или ШД или индикатор.
однако в вашем контроллере, судя по видео, это происходит одновременно. Значит, это возможно. :thinking:

Re: Arduino AccelStepper

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

Ардуина на AVR не заканчивается, можно взять чего пожирнее и дергать ногой почаще :) (из дешевого - платка размером с Arduino Nano на stm32 или модуль esp8266 - под них среда такая же ардуинская, только совместимость не 100%)

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 14:19
grakun
Tomasina писал(а):однако в вашем контроллере, судя по видео, это происходит одновременно. Значит, это возможно.
Там не одновременно. Индикация после каждой выполненной строки в программе.

Re: Arduino AccelStepper

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

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 14:36
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 :)

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 15:35
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;
}

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 16:17
grakun
Morroc писал(а):Нужно подобрать интервал таймера (10-100ms, как можно больше, но чтобы двигатель плавно работал
Нельзя так делать, при любом прерывании частоты step двигатель "стучит". А при периодическом, получится погремушка.

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 16:22
Morroc
Так вы же именно для двигателя и будете прерывать все остальное. Насчет подбора интервала получается как то так - за время между прерываниями должен успевать выполняться .run() с запасом, но если делать это (прерывания) слишком часто - будут тормозиться остальные процессы.

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 17:13
grakun
Morroc писал(а):Так вы же именно для двигателя и будете прерывать все остальное.
Что бы что то прервать сначала это нужно запустить и в то время пока идет сигнал step этого делать нельзя(исключение команда стопа и пауза). Что бы запустить step нужно просчитать математику и потом без всяких прерываний тупо запустить командой и сделать один шаг, потом опять математика еще шаг...Процесс периодический и вмешиваться в него нельзя. Я хотел бы понять по конкретней что Вы имеете ввиду под остальным, что прерывать то нужно, если ничего больше не запущено? Это же не win.

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 17:26
AndyBig
Если хотите выжать из AVR максимум, то выкидывайте все ардуиновские библиотеки и пишите нормальный оптимальный код на Си, используя по максимуму аппаратные возможности - таймеры, прерывания :) Плюс компилятор взять получше - тот же IAR :)

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 18:57
grakun
AndyBig писал(а):Если хотите выжать из AVR максимум, то выкидывайте все ардуиновские библиотеки и пишите нормальный оптимальный код на Си, используя по максимуму аппаратные возможности - таймеры, прерывания :) Плюс компилятор взять получше - тот же IAR :)
Но это же очевидные и понятные вещи, зачем повторять их.

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 19:09
Morroc
grakun писал(а): Что бы что то прервать сначала это нужно запустить и в то время пока идет сигнал step этого делать нельзя(исключение команда стопа и пауза).
step - это изменение управляющих сигналов из одного состояния в другое, происходящее достаточно быстро, между этими изменениями можно что нибудь делать.
grakun писал(а): Что бы запустить step нужно просчитать математику и потом без всяких прерываний тупо запустить командой и сделать один шаг
Верно, это делает вызов stepper.run(). В вашем цикле он тоже постоянно вызывается.
grakun писал(а): , потом опять математика еще шаг... Процесс периодический и вмешиваться в него нельзя.
В идеале следовало бы совсем завязать библиотеку ШД на таймер (возможно такая и готовая есть) - тогда проблемы не было бы, но я предлагаю несколько скрестить ужа с ежом - вызывать достаточно часто stepper.run() по прерыванию от таймера и если он там внутри решил, что пора шагать (тоже по таймеру, но другому) - он шагает и никакие print'ы на дисплей этому помешать не могут. Возможная неравномерность будет определяться частотой вызова.
grakun писал(а): Я хотел бы понять по конкретней что Вы имеете ввиду под остальным, что прерывать то нужно, если ничего больше не запущено? Это же не win.
Прерывать нужно обновление дисплея. Прервать, шагнуть двигателем и вернуться к дисплею. Не win, но шаг в сторону win - простейшая многозадачность. Болезнь win в виде некоторой неравномерности шагов тут тоже будет :D
AndyBig писал(а):Если хотите выжать из AVR максимум, то выкидывайте все ардуиновские библиотеки и пишите нормальный оптимальный код на Си, используя по максимуму аппаратные возможности - таймеры, прерывания :) Плюс компилятор взять получше - тот же IAR :)
Так ведь можно и в программиста превратиться :) А хотелось то всего лишь ШД покрутить с экранчиком.

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 19:24
AndyBig
grakun писал(а):Но это же очевидные и понятные вещи, зачем повторять их.
Тут, как я понимаю, продолжают мучать ардуину в ардуиновской среде с ардуиновскими библиотеками и скетчами... Или я ошибся? :)
На мой взгляд все расчеты должны вестись не в вызове процедуры генерации очередного степа, а в основном цикле, пока результатами не будет заполнен некий буфер. А прерывание генерации степов должно просто брать готовый результат и выдавать его на выводы.
Дисплей же - вообще дело десятое и плевать если он будет обновляться с задержками :)

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 19:29
Morroc
Там не такие уж офигенные вычисления (в AccelStepper). Или надо шагать реально на 1.5 мГц ? oO
Tomasina писал(а):нужно отображать пройденное кареткой расстояние, а это хотя бы 1-2 раза в секунду нужно обновлять дисплей, и в это время движок замирает (по звуку слышно), а мне нужно строго равномерное движение
Tomasina писал(а): расчет занимает 328 мксек, вывод на дисплей - 1032 мксек.
1 раз в секунду пропуск 1.3ms слышен ? точно он ?

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 19:47
Tomasina
точно он, без кода вывода на дисплей звук равномерный.

Re: Arduino AccelStepper

Добавлено: 02 фев 2016, 19:56
Morroc
Что то типа щелчка раз в секунду негромкого ? А шаг с какой частотой идет ?