Размышление о скорости и мультишагах (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
Продолжение с реальными измерениями с осциллографа следует...
Еще больше интересных статей
Изменения в следующей версии 3D-принтер PonyBot
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
•Порт...
Скорость, температура и перевод RAMPS 1.5 на 24В
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Собери свой Re-D-Bot
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
В представленной вашему вниманию статье, изложена по...
Комментарии и вопросы
4 независимых драйвера/мотора....
видимо вам не приходилось виде...
44-45 C... Зачем всё это? Впол...
Всем привет, хотел попросить ч...
Здравствуйте почему на некотор...
Всем доброго дня. Хочу передел...
Подскажите где купить плату уп...