Кремень FMZ Реклама
Kremen FMHM Реклама

Размышление о скорости и мультишагах (double, quad multistepping) в Marlin

ArtemKuchin
Идет загрузка
Загрузка
22.02.2017
7641
35
RepRap

Подпишитесь на автора

Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.

Отписаться от уведомлений вы всегда сможете в профиле автора.

15
Во всем отсылках по описанию управляющий плат на базе atmega1284 я читаю, что максимально достигаемая частота шагов (микрошагов) около 10000 в секунду и при использовании мультишагов до 40000 для Marlin/Repetier.

Предположим у меня 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

Продолжение с реальными измерениями с осциллографа следует...

Подпишитесь на автора

Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.

Отписаться от уведомлений вы всегда сможете в профиле автора.

15
Комментарии к статье