Как устроена программная начинка 3D принтеров и других CNC машин
kayo — Чт, 30/01/2014 - 14:24
В своё время появление устройств с ЧПУ (CNC) было очередным закономерным шагом качественного развития индустрии в сторону повышения производительности труда. Это стало возможным благодаря достижениям цифровой микроэлектроники. В настоящее время наблюдается интересная тенденция: устройства с ЧПУ становятся всё доступнее рядовому пользователю. Потребность была всегда, однако возможности имели серьёзные ограничения. Появление 3D принтеров более 20 лет назад сыграло в реализации этой потребности далеко не последнюю роль. Промышленность получила возможность быстрее прототипировать новую продукцию. Популяризация 3D принтеров во многом обязана проекту RepRap. Конечный пользователь получил не просто инструмент прототипирования, а средство производства. Пусть несовершенное, и ограниченное в применении. Стало возможным за короткое время получать изделия из пластика по технологии вытягивания. В этой статье мы будем разбираться с технологией управления оборудованием таких машин изнутри.
Система управления
Верхний уровень
Машина может работать как в связке с управляющим хостом, так и автономно. В любом случае имеется некоторый источник управляющей программы, состоящей из команд так называемого G-кода, которые подаются и обрабатываются устройством в порядке следования. Задача программы на этом уровне — обработка управляющих команд в соответствии с возможностями нижнего уровня.
Команды делятся на несколько типов: одни влияют на внутренние состояния машины, другие управляют процессом обработки, активируя операции.
Примеры состояний:
- Способ задания координат (абсолютные, относительные)
- Единицы измерения (миллиметры, дюймы)
- Температуры нагревателей
- Скорости вращения шпинделей
- Параметры регуляторов
- Типы выводимых отладочных сообщений
Примеры операций:
- Позиционирование в начало координат
- Установка рабочего тела в заданную позицию
- Прямолинейное перемещение с заданной скоростью в заданную позицию
- Перемещение рабочего тела по дуге с заданным радиусом в заданную позицию
Наборы поддерживаемых команд отличаются для разных программ, поэтому нет смысла их здесь рассматривать. Ограничимся лишь основными классами команд и их параметрами (n - число):
- M<n> — команды контроля состояния (опрос/установка)
- T<n> — команды выбора инструмента
- G<n> — команды настройки (выбора единиц, типа координат) и операций (перемещения рабочего тела)
Принимаемые параметры (n, m - числа):
- X<n>, Y<n>, Z<n>, E<n> — линейные координаты
- R<n> — радиус дуги (или другие параметры для некоторых Mn команд)
- F<n> — скорость подачи (feed rate)
- N<n> — номер текущей строки
- P<n> S<m> — установки регуляторов, где n - номер регулятора, m - целевое значение (например, скорость вращения шпинделя, температуры нагревателя)
- I<n>, J<n>, Q<n> — прочие параметры (редко используются)
Все команды делятся ещё на два класса:
- Буферизуемые — выполнение которых требует монопольного использования ресурсов железа
- Небуферизуемые — выполнение которых может быть произведено без коллизий
Буферизация нужна, чтобы исключить простои. Если команда выполняется долго, а результат выполнения для хоста не важен, её можно буферизовать. К буферизуемым как правило относятся G-команды операций, другие команды обычно не буферизуются. При поступлении нескольких буферизуемых команд, они предварительно обрабатываются и попадают во внутреннюю очередь, откуда затем забираются и выполняются, чем гарантируется, что каждая следующая операция будет выполнена непосредственно после завершения предшествующей без длительных задержек, связанных с ожиданием передачи/приёма.
Программа сама вправе решать, какие действия могут выполняться одновременно, а какие нет. Можно запустить homing, установить все значения нагревателей и отдельной командой активировать цикл ожидания момента, когда значения будут достигнуты регуляторами. На протяжении этого цикла ожидания можно производить позиционирование, однако, печатать нельзя.
Для обеспечения контроля целостности передаваемых данных строки обычно оборачивают в N<ln><команды>*<cs>, где ln — номер строки, а cs — контрольная сумма, которая вычисляется от всего содержимого между N и *, последовательным применением операции исключающего или.
Программа должна возвращать хосту статус выполнения небуферизуемых команд сразу в виде ok или rs, если возникла ошибка приёма команды, чтобы хост переслал её заново. Статус небуферизуемых — не возвращается, хотя есть другие варианты. Например, предлагается возвращать статус в виде ok Q:<n>, где n — количество свободных ячеек во внутренней очереди буферизуемых команд. В этом случае запрос переотправки будет включать номер строки rs <ln> Q:<n>, где ln — номер строки, которую необходимо переотправить, а n — количество свободных ячеек в очереди. Совместимость с обычным форматом ответов достигается тем, что ответы без Q:<n> рассматриваются как ответы с Q:1.
Нижний уровень
Система управления на нижнем уровне состоит из программной и аппаратной части. Через аппаратную часть программа связана с объектом управления (то есть «механикой») двумя типами связей: прямыми, через которые программа воздействует на исполнительные механизмы, и обратными, через которые программа получает информацию о результатах этого воздействия. Здесь можно привести классическую схему системы управления, которую мне лень рисовать. Поэтому, лучше рассмотрим реальный пример.
В 3D принтерах, использующих технологию вытягивания расплавленного пластика, есть нагреватель, и связанный с ним датчик температуры. Система управления должна непрерывно поддерживать заданную для технологического процесса температуру, для чего необходимо периодически с достаточно малым интервалом измерять температуру и корректировать мощность нагревательного элемента. Это происходит в меняющихся условиях воздействия окружающей среды (температура вокруг меняется при перемещении и внешнем обдуве) и внутреннего состояния исполнительного механизма (при подаче в зону плавления порций пластика, она остывает). В алгоритме управления учитывается динамика протекания этих процессов, чтобы максимально быстро реагировать на ошибку управления и корректировать воздействие.
Обратные связи в аппаратной части могут отсутствовать в случае, когда воздействие однозначно определено. При этом считается, что обратная связь организована программно. Простой пример такой ситуации: управление перемещением с использованием шаговых двигателей. Каждый шаг в заданном направлении имеет как правило вполне определённый результат в виде перемещения на константную длину. Конечно, можно возразить, что внешняя среда может оказывать сопротивление данному перемещению, что обычно и происходит при фрезеровании. Но это воздействие обычно учитывается при генерировании управляющей программы так, чтобы сила сопротивления материала при обработке была много меньше силы подачи. С другой стороны потеря или проскакивание шагов возможны при слишком резком ускорении или торможении ввиду инертности механики, но этот момент учитывается как при генерации управляющей программы, так и самой прошивкой.
Алгоритмы управления
Регулирование
Выше мы рассмотрели пример системы регулирования температуры. Здесь остановимся подробнее на широко распространённом алгоритме регулирования, называемом PID. Пропорционально-интегрально-дифференциальный регулятор имеет дело с тремя составляющими:
- Пропорциональной, которая пропорциональна отклонению регулируемой величины от заданного значения, то есть ошибке регулирования или разности между целевым значением, и измеренным. Эта составляющая призвана противодействовать отклонению измеряемой величины от заданного значения.
- Интегральной, которая пропорциональна накопленной ошибки регулирования, то есть интегралу от отклонения измеренной величины от заданной или ошибки регулирования. Эта составляющая призвана обеспечить устойчивость регулирования путём учета статической ошибки.
- Дифференциальной, которая пропорциональна разности отклонений или другими словами темпу изменения ошибки регулирования. Эта составляющая должна противодействовать отклонениям регулируемой величины от целевого значения в будущем.
$$C(t) = P + I + D = K_p e(t) + K_i \int \limits _0^t e(\tau) d\tau + K_d \frac{de}{dt}$$
Как видим, управляющее воздействие, то есть значение на выходе регулятора, формируется сложением этих трёх составляющих в заданных пропорциях, оптимальные значения которых определяются динамикой системы. Динамика системы зависит от множества факторов, к примеру, для экструдера: это и мощность нагревателя, теплопроводность, температура среды, это и скорость поступления прутка и даже, в какой-то мере, задержка обратной связи.
Обычно значения коэффициентов для каждой из составляющих находят опытным путём. Сначала задают некоторые усреднённые значения коэффициентов. Затем тестируют штатные режимы работы с целью сбора статистики. Статистику управляющих воздействий и обратной связи подвергают обработке с использованием некоторых алгоритмов оптимизации. Здесь часто применяют подходы, относящиеся к так называемое машинному обучению. Весь этот цикл повторяют несколько раз. Цель — получить оптимальные коэффициенты для каждой из трёх составляющих, при которых ошибка управления будет минимальной, а значит динамика системы будет учтена наиболее точно.
В случае, если коэффициент какой-либо из составляющих равен нулю, то регулятор получается пропорционально-интегральный (Kd = 0), пропорционально-дифференциальный (Ki = 0) или просто пропорциональный (Kd = 0 и Ki = 0). ПИД способен работать как с отрицательной, так и с положительной обратной связью, главное правильно учесть знак при выборе коэффициента для пропорциональной составляющей.
Вот псевдокод, показывающий, как может быть реализовано дискретное ПИД-регулирование программно:
предыдущая_ошибка = 0 интеграл = 0 выполнить_раз_в шаг_времени: ошибка = целевое_значение - измеренное_значение интеграл = интеграл + ошибка × шаг_времени дифференциал = (ошибка - предыдущая_ошибка) / шаг_времени управление = Kp × ошибка + Ki × интеграл + Kd × дифференциал предыдущая_ошибка = ошибка
Этот алгоритм может не менее успешно обслуживать и другие потребности регулирования, например, управление скоростью вращения шпинделя фрезы. Для каждой операции и типа инструмента программой задаётся скорость вращения, которую необходимо поддерживать не смотря на меняющееся сопротивление обрабатываемого материала. Так, например, при фрезеровании дерева, сопротивление сильно отличается при прохождении фрезы вдоль и поперёк волокон, необходимо как можно быстрее реагировать на изменения скорости вращения и менять соответствующим образом мощность двигателя.
На валу двигателя установлен угловой датчик, энкодер. Обратная связь в таком случае осуществляется путём подсчёта времени одного оборота и определения частоты (при использовании прерываний на изменение уровня на входе MCU) или непосредственного измерения частоты оборотов (при использовании аппаратных таймеров, считающих импульсы на входе MCU).
Организация обратной связи
Большинство датчиков выдают сырое необработанное значение, которое не может быть непосредственно использовано для формирования управляющего воздействия, поскольку целевое значение задаётся в конкретных единицах, к которым сырое значение необходимо привести. Так, например, широко распространённые датчики температуры — термисторы (терморезисторы) для съёма показаний ставят в качестве одного из плечей делителя напряжения. Чтобы получить показания температуры в градусах Кельвина, необходимо произвести преобразование измеренного с помощью ADC значения в сопротивление, а затем с учетом нелинейной зависимости сопротивления от температуры, получить значение последней.
Самую быструю и наименее гибкую обработку сырых значений обеспечивают так называемые lookup таблицы. Весь диапазон возможных результатов измерений делится на небольшое число интервалов, на концах которых измеряемое сырое значение сопоставляется с предварительно вычисленным преобразованным значением. Преобразование в этом случае сводится к тому, чтобы найти интервал, в который попадает измеренное значение, затем, используя результирующие значения на концах путём интерполяции найти соответствующий этому измеренному значению результат. Приведём пример псевдокода с использованием линейной интерполяции (подразумевается, что элементы в таблице отсортированы по возрастанию сырых значений):
пока индекс < размер(таблица) и измеренное_значение < таблица[индекс].сырое_значение индекс = индекс + 1 начало_интервала = таблица[индекс] конец_интервала = таблица[индекс + 1] обработанное_значение = (сырое_значение - начало_интервала.сырое_значение) / (конец_интервала.сырое_значение - начало_интервала.сырое_значение) × (конец_интервала.обработанное_значение - начало_интервала.обработанное_значение) + начало_интервала.обработанное_значение
В обработке нуждаются практически любые значения датчиков обратной связи, даже чтобы получить частоту оборотов, необходимо пересчитывать интервалы времени в тиках таймера или процессора в секунды, а затем в частоту в Герцах. Но существует большое число аппаратных конверторов, которые могут быть как объединены с датчиком в одном корпусе, так и просто содержать в себе ADC и сами выполнять все вычисления. Тогда готовое значение можно просто считывать через один из стандартных интерфейсов периферийных устройств, которые поддерживает используемый датчик. Такие конверторы целесообразно применять когда получать сырые данные с датчика непосредственно представляет затруднение. Например, термопары дают очень малую разность потенциалов, которую необходимо усиливать, чтобы подать на вход ADC, с другой стороны на измерения могут сильно повлиять сторонние шумы.
Устранение шумов
Идеальных датчиков не существует, каждое непосредственно измеренное значение, как правило, отклоняется от реального. Искажения в сигнал вносят как конструктивные особенности датчика, так и сторонние воздействия на линии связи от других устройств и внешнего мира. Кроме того, искажения вносит и сам процесс измерения, например, ADC имеет так называемый цифровой шум. Шумы подавляют на сколько это возможно аппаратными средствами, дальнейшую фильтрацию необходимо выполнять программно.
Благо всевозможных типов программных фильтров разработано достаточно много, чтобы покрыть все возникающие потребности. Наиболее универсальный фильтр носит название «скользящее среднее» (MA). Вместо непосредственного значения берут среднее значение величины на некотором интервале, максимальная длина которого определяется минимально допустимой задержкой измерений. Как несложно понять, просто усреднённое значение будет давать большую задержку изменения величины при резких её изменениях, поэтому часто используют модификации, называемые «взвешенное скользящее среднее» (WMA), в которых измеренные на интервале значения входят с разными коэффициентами в зависимости от их удалённости во времени от текущего момента. Так «экспоненциально взвешенное скользящее среднее» (EWMA) использует функцию экспоненты, чтобы последнее измеренное значение имело наибольшую значимость, а значимость всех остальных экспоненциально снижалась.
Гистерезис
Искусственное внесение гистерезиса в систему бывает необходимо, чтобы подавить дрожания. Например, регулятор температуры должен отслеживать моменты, когда температура достигла требуемого значения, и когда она отклонилась от него. Значение температуры никогда не будет строго держаться на одном уровне, даже когда регулятор работает вполне устойчиво. Значение может прыгать на пару-тройку градусов больше-меньше требуемого, что вызовет непрерывную генерацию событий настроено и не настроено. Чтобы этого избежать, вводят гистерезис в виде двух параметров:
- Максимально приемлемое по модулю отклонение измеренной величины от заданной [1]
- Минимальный интервал времени, в течении которого величина не должна выходить за пределы отклонения [2]
Как только будут соблюдены оба условия, регулятор сгенерирует событие настроено. Для генерации события не настроено, можно поступить аналогично, введя два параметра:
- Минимально неприемлемое по модулю отклонение измеренной величины от заданной (>= [1])
- Максимальный интервал времени, в течении которого величина должна выходить за пределы отклонения (>= [2])
Как только будут соблюдены оба условия, регулятор сгенерирует событие не настроено.
Гибридное программно-аппаратное регулирование
Управляющее воздействие регулятора подаётся на выход PWM или DAC в зависимости от требований к латентности управления. Так, например, широтно-импульсная модуляция недопустима, когда скорость изменения управляющего воздействия сравнима с максимальной частотой модуляции. В этом случае спасает прямое цифро-аналоговое преобразование. Однако, когда для осуществления управления в реальном времени с требуемой задержкой не достаточно уже скорости периферии или ядра микроконтроллера, прибегают к гибридным вариантам.
Например, для поддержания мощности лазера на заданном уровне необходимо строго выдерживать заданный ток. Протекающие внутри лазерного диода процессы могут резко менять сопротивление канала, поэтому целесообразно организовать аппаратное регулирование, например, с применением регулирующего каскада из последовательно включенных импульсного и линейного регуляторов. Первый будет грубо задавать напряжение, а второй быстро реагировать на резкие изменения тока.
Значение разности напряжения до и после линейного регулятора можно использовать как обратную связь для программного управления импульсным регулятором. Напряжение на шунтирующем резисторе подавать на вход обратной связи полностью аппаратного линейного регулятора тока, который получает от программы только его целевое значение, который необходимо выдерживать. Программа с много большей задержкой чем линейный регулятор осуществляет поддержание напряжения на нём в районе близкого к нулю значения с запасом в обе стороны так, чтобы снизить нагрузку на линейный регулятор и повысить его эффективность.
Позиционирование
Каждая машина имеет по крайней мере одно рабочее тело, будь то экструдер или фреза, которое при обработке может перемещаться относительно рабочей плоскости или объёма в двух или трёх измерениях соответственно.
Существует несколько типов позиционирования, которые решают разные задачи.
- Быстрое позиционирование или холостой ход (G0: Rapid Move) используется для перемещения рабочего тела к назначенному месту, где должна происходить дальнейшая обработка.
- Контролируемое перемещение (G1: Controlled move) используется на этапах обработки. Позволяет выполнять операцию с определённой линейной скоростью поступательного или угловой скоростью вращательного движения.
- И наконец, позиционирование к началу координат или парковка (G28: Move to origin или Homing).
С командами позиционирования передаются параметры значений координат (X<n> Y<n> Z<n> E<n>), которые затрагивает данная операция, если значение какой-либо координаты не передано, считается, что она не изменилась и используется текущее значение. Также может быть передано значение подачи (F<n> feedrate), с которой должна быть выполнена операция.
Во многих машинах нет датчиков абсолютного положения рабочего тела, однако, необходимо знать, где она находится в каждый момент времени. Поэтому до начала работы выполняют позиционирование к началу координат, где установлены граничные датчики (End-Stops). При парковке рабочего тела, значения абсолютных координат в программе сбрасываются в 0. Эту операцию также рекомендуется проделывать периодически во время работы, потому что при резких манёврах (движении с ускорением, о котором будет сказано ниже) могут возникать ошибки позиционирования.
Кроме того в некоторых прошивках реализовано контролируемое перемещение по дуге:
- По часовой стрелке (G02)
- Против часовой стрелки (G03)
Эти режимы позволяют рабочему телу проходить гладкие дуги. С такими командами передаются координаты начала дуги (X<n> Y<n>), координаты конца дуги (I<n> J<n>) и радиус (R<n>). Значение подачи (F<n>) применяется по длине дуги. При отсутствии поддержки операции построения дуг, процессор G-кода вынужден предварительно интерполировать каждое такое перемещение в виде последовательности отрезков, приближенных к форме дуги, которых в зависимости от размера шага может быть достаточно много.
Интерполяция
Задача интерполяции сводится к преобразованию примитивов в физических координатах в перемещения в координатах платформы. Самый простой примитив, из последовательности которых может быть построено любое перемещение, — это отрезок. Любая прошивка должна уметь выполнять этот тип интерполяции. Более сложный примитив — это дуга, но в сущности — это тот же отрезок, только в полярных координатах. Из известных мне на момент написания статьи интерполировать дуги умеет только Marlin.
Существуют специальные алгоритмы, которые ещё на заре развития вычислительной техники были применены для растеризации векторных данных, например, для представления геометрических примитивов в виде точек на экране монитора. Эти алгоритмы решают задачу: какие точки растра надо закрасить при рисовании контурных примитивов. Они вполне применимы для интерполяции в случае координатной платформы, поскольку перемещение рабочего тела дискретно. Минимальное перемещение по каждой из осей равно минимальному размеру шага, который способен обеспечить привод соответствующей оси.
Один из самых старейших и широко распространённых — алгоритм Брезенхэма. Также есть вариант этого алгоритма для интерполяции дуг. Другой известный алгоритм интерполяции носит название DDA.
Абсолютные и относительные координаты
G-Code программа может выбрать метод преобразования координат при перемещениях. При использовании абсолютных координат, положение инструмента задаётся относительно начала координат, а при использовании относительных — относительно текущего положения, которое является результатом обработки предыдущих команд.
При перемещении координаты в дюймах или миллиметрах преобразуются в шаги через величину разрешающей способности, определяемой количеством шагов на миллиметр. Как мы знаем, ошибка имеет свойство накапливаться, поэтому на нижнем уровне, то есть на уровне шагов, перемещения должны вычисляться абсолютные, чтобы держать ошибку в некоторых пределах, определяемых предельным разрешением и точностью позиционирования.
Вот небольшой пример, чтобы понять выше изложенное. Предположим, наша платформа имеет разрешение 4 шага на миллиметр, мы хотим переместиться на 3.15 мм, затем на 1.45 мм, и после на 5.4 мм. Если просто вычислять относительные шаги с округлением (ведь мы можем перемещаться только на целое число шагов), то нам необходимо переместиться на 3.15×4=12.6~=13 шагов, на 1.45×4=5.8~=6 шагов, на 5.4×4=21.6~=22 шага соответственно. Суммарно мы переместимся на 13+6+22=41 шаг. Если теперь прикинуть, что в конце операции мы должны были оказаться на 3.15+1.45+5.4=10 мм дальше относительно положения до неё, то есть 10×4=40 шагов, то получится, что мы сделали 1 лишний шаг, а это в нашем случае 0.25 мм ошибки.
Мы рассмотрели, чем плохи относительные координаты на нижнем уровне, но почему их всё же используют в управляющих программах? Так уж исторически сложилось. Поскольку программа передаётся в текстовом виде, то чем больше числа, тем больше байт они занимают, а относительные координаты как правило всегда числа небольшие.
Управление перемещением
Кроме собственно типов позиционирования существуют различные стратегии управления перемещением, также решающие разные задачи. Основная проблема заключается в том, как учесть физические свойства реальной механики машины в управляющих алгоритмах. Механика, как известно, обладает инерцией, а значит скорость не может меняться мгновенно. Попытки делать это приведут к быстрому износу подшипников, шкивов и ремней. С другой стороны, технологии печати/обработки тоже вносят свою лепту: свойства материалов необходимо учесть. Частично за последнее отвечает процессор G-кода, генерирующий управляющую программу, но более проработанные алгоритмы работы машины гораздо эффективнее устраняют множество мелких проблем.
Режим постоянного ускорения (Constant Acceleration) является наиболее универсальным.
Стратегии касаются принципа изменения скорости работы двигателей. В Teacup Firmware реализованы следующие стратегии:
- RepRap стиль, впервые реализован в официальной прошивке FiveD машины Darwin и Mendel. В начале каждой операции перемещения движение начинается с текущей скорости, во время движения ускоряется или замедляется и достигает целевой скорости к концу. Эта стратегия позволяет процессору G-кода вычислять гладкие перемещения, однако, если связь внезапно прервётся или произойдёт некоторая задержка, это приведёт к резкой остановке и последующему резкому старту перемещения, когда связь будет восстановлена.
- Постоянное ускорение к началу и постоянное замедление к концу перемещения (Acceleration Ramping). В начале каждого перемещения происходит линейный прирост скорости от нуля, пока целевая скорость не будет достигнута, далее движение с постоянной скоростью, и затем начинается линейное снижение в подходящий момент так, чтобы к концу перемещения произошла полная остановка. Эта стратегия не имеет проблемы предыдущей, поскольку нет никакого движения в интервалах между управляющими командами, но вместе с тем постоянные остановки снижают общую скорость работы машины.
Наиболее эффективен был бы третий вариант, объединяющий обе эти стратегии: изменение скорости линейно между командами и замедление до нуля в случае, если следующее перемещение в очереди обработки команд отсутствует. Большинство процессоров G-кода ввиду исторических причин генерируют код, наbболее подходящий для первого алгоритма. Выполнение программы из собственной памяти устройства (например, заранее загруженной на Flash карту), решает проблему разрыва соединения.
По-умолчанию в Teacup для управления скоростью перемещения используется второй алгоритм. В Sprinter (и Marlin) это называют трапецивидным (Trapezoid) режимом скорости и линейным ускорением (Linear Acceleration), хотя на деле ускорение применяется константное.
Стоит отметить, что в Teacup, Marlin и некоторых других также реализован механизм «предвидения» (Lookahead). Эта оптимизация позволяет избегать остановки, когда направления дополняющих друг друга перемещений достаточно похожи. Кроме общего ускорения процесса печати, она позволяет избежать капель пластика из экструдера в каждом углу.
Синхронизация перемещения и подачи
В 3D печати методом вытягивания пластика, перемещение рабочего тела и подача материала нуждаются в синхронизации. Так программа предписывает какое количество пластика необходимо выдавить на некоторое пройденное рабочим телом расстояние. При изменении модуля векторной скорости перемещения должна пропорционально меняться линейная скорость выдавливания, чтобы диаметр нити расплавленного пластика оставался неизменным.
Управление шаговыми двигателями
Выше мы обозначили основные моменты, касающиеся управления шаговыми двигателями, здесь же остановимся на этом поподробнее. Скорость определяется временем между шагами, варьируя определённым образом период шага, мы можем плавно менять скорость перемещения. Рассмотрим наиболее общий режим перемещения с постоянным ускорением.
Наша цель — вычислить период шага, то есть время одного шага через среднюю скорость, зная начальную скорость и ускорение. Здесь будет совсем чуточку математики.
Из кинематики мы знаем следующее:
$$V_1 = V_0 + at,$$
$$t = \frac{V_1 - V_0}{a} [1],$$
где V1 — скорость в конце заданного интервала, V0 — скорость в начале заданного интервала, a — ускорение, действующее на заданном интервале и t — заданный временной интервал.
$$S = \int\limits_0^t V(\tau) d\tau,$$
где S — перемещение за заданный интервал, V — мгновенная скорость и t — заданный временной интервал.
Для случая линейного ускорения:
$$S = V_mt [2],$$
где S — перемещение за заданный интервал, Vm — средняя скорость на интервале и t — заданный временной интервал.
$$V_m = \frac{V_1 + V_0}{2} [3],$$
где Vm — средняя скорость на интервале, V1 — скорость в конце заданного интервала и V0 — скорость в начале заданного интервала.
Подставив [3] в [2], заменив t из [1], имеем следующее:
$$S = \frac{V_1 + V_0}{2}t,$$
$$S = \frac{(V_1 + V_0)(V_1 - V_0)}{2a},$$
$$S = \frac{V_1^2 - V_0^2}{2a} [4],$$
где S — перемещение за заданный интервал, V1 — скорость в конце заданного интервала, V0 — скорость в начале заданного интервала и a — ускорение, действующее на заданном интервале.
Выразим скорость:
$$V_1^2 = 2aS + V_0^2,$$
$$V_1 = \sqrt{2aS + V_0^2} [5],$$
Поскольку нам нужно найти период одного шага, то примем пройденное расстояние S = 1 и получим:
$$Vs_1 = \sqrt{2a + Vs_0^2} [6],$$
где Vs1 — скорость в конце шага, Vs0 — скорость в начале шага и a — ускорение, действующее на протяжении данного шага.
Осталось дело за малым, найти период шага:
$$Ts = \frac{1}{Vs_m} [7],$$
где Ts — период шага, а Vsm — средняя скорость на протяжении данного шага, которая находится из соотношения [3].
Может возникнуть соблазн использовать скорость в гипотетической середине шага (при S = 0.5) в качестве средней, то есть сделать так:
$$V_m = \sqrt{a + V_0^2}$$
Но это в корне неверно, потому что гипотетическая середина шага не совпадает с серединой периода шага, кроме случая отсутствия ускорения (a = 0).
Заключение
Трудно охватить необъятное в одной короткой статье, но надеюсь мне удалось окунуть вас в мир программирования ЧПУ железа. Конечно, за бортом остались многие вопросы оптимизации вычислений, разумного использования в операциях значений с фиксированной и плавающей точкой, и другие. Но эти вопросы, как правило, упираются в возможности и ограничения конкретного вычислительного железа и выбор конкретных реализаций всегда субъективен.
До встречи в следующих статьях.

Уважаемый Kayo!В приниципе
Гость (не проверено) — Вс, 14/09/2014 - 18:21Уважаемый Kayo!
В приниципе статьи о принтерах и шаговых двигателях познавательные, но... Не считаю себя круглым идиотом (все же к.т.н., доцент), но ума не приложу, как запрограммировать для 2-х шаговых двигателей хотя бы линейную интерполяцию под разными углами. Не говорю уже о 3-х, 6-ти двигателях. Пусть двигатель управляется приводом (драйвером) типа Step/Dir. Т.е. для Lpt-порта Port[$378]:=0/1 - Step (Скорость), Port[$378]:=0/2 - Dir - направление.
Для одного двигателя:
Port[$378]:=0+0;Delay(t);
Port[$378]:=1+0; Delay(t) - поехал в одну сторону!
Дайте совет, если можно, как добавить второй двигатель? (d2=4, d3=8)?
С уважениев Владимир
Отправить комментарий