Размышление о скорости и мультишагах (double, quad multistepping) в Marlin
Предположим у меня 100 шагов на 1мм по X/Y.
Значит без использования упаковывания шагов в мальтишаги получаем максимальную скорость передвижения по оси
10000/100=100мм/сек. При печати движение происходит по двум осям одновременно, т.е. реальная гарантироанная максимальная скорость печати около 50мм/сек. На самом деле чуть меньше.
Использую мультишаги вы может поднять это значение в 3 раза (не стоит рассчитывать на 40000), т.е. до 150мм/сек. Побочные эффекты при этом гарантированы, так как мультишаги неравномерны. Т.е. будет и вибрация, и шум и странные узоры на стенках.
Само по себе это уже говорит, что строить мегапрочную раму, использовать легкой голову боудена и потом на это сажать электронику на Arduino на базе atmega1284 ерунда полная.
[CODE] bool all_steps_done = false;
for (int8_t i = 0; i < step_loops; i++) {
#define _COUNTER(AXIS) counter_## AXIS
#define _APPLY_STEP(AXIS) AXIS ##_APPLY_STEP
#define _INVERT_STEP_PIN(AXIS) INVERT_## AXIS ##_STEP_PIN
// Advance the Bresenham counter; start a pulse if the axis needs a step
#define PULSE_START(AXIS)
_COUNTER(AXIS) += current_block->steps[_AXIS(AXIS)];
if (_COUNTER(AXIS) > 0) { _APPLY_STEP(AXIS)(!_INVERT_STEP_PIN(AXIS),0); }
// Stop an active pulse, reset the Bresenham counter, update the position
#define PULSE_STOP(AXIS)
if (_COUNTER(AXIS) > 0) {
_COUNTER(AXIS) -= current_block->step_event_count;
count_position[_AXIS(AXIS)] += count_direction[_AXIS(AXIS)];
_APPLY_STEP(AXIS)(_INVERT_STEP_PIN(AXIS),0);
}
#define CYCLES_EATEN_BY_CODE 240
// If a minimum pulse time was specified get the CPU clock
#if STEP_PULSE_CYCLES > CYCLES_EATEN_BY_CODE
static uint32_t pulse_start;
pulse_start = TCNT0;
#endif
#if HAS_X_STEP
PULSE_START(X);
#endif
#if HAS_Y_STEP
PULSE_START(Y);
#endif
#if HAS_Z_STEP
PULSE_START(Z);
#endif
// For a minimum pulse time wait before stopping pulses
#if STEP_PULSE_CYCLES > CYCLES_EATEN_BY_CODE
while ((uint32_t)(TCNT0 - pulse_start) < STEP_PULSE_CYCLES - CYCLES_EATEN_BY_CODE) { /* nada */ }
#endif
#if HAS_X_STEP
PULSE_STOP(X);
#endif
#if HAS_Y_STEP
PULSE_STOP(Y);
#endif
#if HAS_Z_STEP
PULSE_STOP(Z);
#endif
if (++step_events_completed >= current_block->step_event_count) {
all_steps_done = true;
break;
}
}
[/CODE]
У ардуино по умолчанию prescaler для Timer 0 = 64, т.е. они тикает с частотой 250КГц. т.. один тик 4мкс.
Т.е. STEP_PULSE_CYCLES и CYCLES_EATEN_BY_CODE измеряются в тиках этого таймера.
#define CYCLES_EATEN_BY_CODE 240
#define STEP_PULSE_CYCLES ((MINIMUM_STEPPER_PULSE) * CYCLES_PER_MICROSECOND)
#define MINIMUM_STEPPER_PULSE 0
#define CYCLES_PER_MICROSECOND (F_CPU / 1000000UL) // 16 or 20
Итого STEP_PULSE_CYCLES = 0
Т.е. задержка MINIMUM_STEPPER_PULSE отсутсвует по умолчанию и ее включать надо, только ели есть проблемы. 240 циклов по 4мкс = 1мс.
Я так понял, что это сколько времени отрабатывает код. Выходит какой-то бред, так как таким макаром больше
1000 микрошагов в секунду не получить.
Но, к счатью, по умолчаню STEP_PULSE_CYCLES = 0 и поэтому эта часть кода не выполняется и сколько выполняется то, что выполняется я посчитать не могу.
Но суть не в этом, в отсутствии каких либо задержек все эти мультишаги практически сливаются в один, но с большим резонансом и шумом.
Выбор double stepping/quad stepping в прошивки производится так:
if (step_rate > 20000) { // If steprate > 20kHz >> step 4 times
step_rate >>= 2;
step_loops = 4;
}
else if (step_rate > 10000) { // If steprate > 10kHz >> step 2 times
step_rate >>= 1;
step_loops = 2;
}
else {
step_loops = 1;
}
step_rate он считает исходя из того, на сколько надо переместится в шагах и скорости.
float inverse_millimeters = 1.0 / block->millimeters;
float inverse_mm_s = fr_mm_s * inverse_millimeters;
block->nominal_rate = ceil(block->step_event_count * inverse_mm_s); // (step/sec) Always > 0
Например, надо переместится на 200мм = 200мм*100ш/мм=20000 шагов
со скоростью 100мм/сек получается
20000*(100*1/200)=10000 шагов в сек
Для оси Z перемещение на 10мм вверх. 10мм*400ш/мм=4000 шагов, со скоростью 10мм/сек
получаем 4000/(10/10)=4000 ш/сек
В первом случае мы перешли уже в режим двойного шага.
При этом в расчетах участвует не сумма всех осей, а ось с максимальным значением
block->step_event_count = MAX4(block->steps[X_AXIS], block->steps[Y_AXIS], block->steps[Z_AXIS], esteps);
Так как все шаги отрабатывают в одном прерывании. Что, конечно, выглядит как-то очень оптимистично, так как
при высоком step rate на всех осях одновременно легко представить, что прерывание захлебнется просто и шаги не смогут идти с нужной частотой. Кроме этого при переходе одной оси в режим мультишага, все остальные тоже переходят в этот режим, так как цикл мультишаговый один на всех, т.е. точность падает сразу по всем осям и дребезг начинается сразу везде.
Я это к тому, что использование мультишага вообще не есть хорошая вещь, хотя это и даст прирост скорость, но это какая-то 'высокая скорость курильщика'. Разумнее не переходить в мультишаговый режим вообще, удерживая по всем осям количество шагов секунду менее 10000 исходя из приведенных формул. Причем даже при простом передвиженииа, а не только при печати. Если же надо повысить скорость, то лучше впаять 20МГц кристалл на плату и получим 25% прироста, только тогда исходный код надо править. Хотя там и учтена возможность использования 20Мгц платы во многих местах, именно это место никак не учитывает скорость МК.
Однако, остается открытым вопрос на сколько все-таки оптимистичная цифра 10000. На этот вопрос мне видимо ответит только осциллограф, который будет показывать скорость дрыгания ногой при движении по одной оси и по трем.
При этом надо еще учесть,что осей на самом деле минимум 4, а если добавить еще вариант с 3-ся экструдерами, то начинаются какие-то очень сильные подозрения относительно максимальной скорости нормальной работы.
Одно дело обработать быстрое перемещение по оси X, которое уже вызывать double stepping,а другое дело обработать XY+E0,E1,E2. И если там 1/32 на драйверах и 400 шагов на E, то реальная максимальная скорость должна быть примерно чуть ниже плинтуса.
Очень интересная статья по данным и другим вопросам для тех, кто английский читает:
http://www.column80.com/api.v2.php?a=3dprinting&q=623
Продолжение с реальными измерениями с осциллографа следует...
Еще больше интересных статей
Ползучий апгрейт Ender 2 в стальной CoreXY
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Квазимодо дует... и выдувает мозг.
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Последнее обновление кас...
Z-Bolt - H-bot & CoreXY 2в1. Чертежи для резки. Список деталей. Видеоинструкция по сборке.
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Часть 1.
Часть 2.
Часть 3....
Комментарии и вопросы
Все ок, инфа полезная сама по....
Так он практически сразу после...
Как грицца, it depends...Если....
Всем привет, может кто знает п...
Приветствую, начал знакомится...
Здравствуйте. Имеется стоковый...
Всем доброго! По поводу жидкой...