Управление шпинделем

Описание

Базовая настройка

Настройка пользовательских программ

CSS - постоянная скорость относительно поверхности

Пошаговая инструкция

Видео (англ.)

Настройка оси шпинделя с открытым контуром регулирования

 

Описание

KMotionCNC позволяет пользователю управлять любым типом шпинделя. Четыре основные используемые команды:

M3 - включить шпиндель по часовой стрелке.

M4 - включить шпиндель против часовой стрелки.

M5 - выключить шпиндель.

Snnnn - установить скорость шпинделя относительно поверхности в футах в минуту или метрах в минуту.

 

Для каждой команды возможно установить действие из готового списка или запустить необходиму С программу.

Для наиболее простых случаев можно управлять одним или двумя битами ввода-вывода, либо если достаточно контура без обратной связи по скорости выбрать режим ЦАП(ADC) и указать коэффицент скорости к значению ЦАП.

Для более сложного контроля следует указать путь к С программе которая может реализовать открытый, закрытый контур, ШИМ, ModBus, Rs232 и прочие варианты.

Для G96/G97 - CSS (постоянная скорость относительно поверхности) требуется дополнительная программа непрерывной работы, она непрерывно изменяет скорость шпинделя в зависимости от положения X (радиус). См. пример CSSJog.c.

Если на шпинделе установлен квадратурный кодер, он может использоваться для измерения и отображения скорости шпинделя.

 

Базовая настройка

Пример ниже показывает настройку когда включение и выключение шпинделя происходит двумя битами, скорость задается значением ЦАП(DAC) на плате расширения KAnalog. В этом случае использование С программ не требуется. Обратите внимание, что значение scale -2.047 отрицательно, так как KAnalog инвертирует значение напряжения. В данном примере задание S1000 (1000 оборотов в минуту) будет соответстовать -2047 дискретам ЦАП или +10В на выходе 7 канала ЦАП. Диапазон дискрет от -2047 до 0 (от 0В до +10В).

Преимуществом использования бит ввода-вывода является синхронизация с контроллером движения и в возможности исключить паузы в движении. Это бывает удобно для лазеров/граверов где не требуется время на раскрутку шпинделя. Подробно о буферизированных командах смотрите тут.

 

Настройка пользовательских программ

Для большего функционала для каждой команды управления шпинделя может быть назначена С программа. Если скорость шпинделя контролируется напряжением, то в настройках оси можно указать необходимый канал ЦАП. Это предполагает, что этот канал оси уже настроен(в том числе ПИД-регулятор, фильтры) так же, как и другие оси в системе и его можно перемещать с помощью команд Axis Jog. Так же необходимо учитывать, что данный вариант походит для сервоприводов с обратной связтью или шаговым двигателем с разомкнутым контуром. Этот режим позволяет использовать настройки ускорения (Acceleration и Jerk) для плавного изменения скорости.

В приведенном ниже примере показаны четыре С программы для каждой команды шпинделя. Каждая команда для шпинделя выполняет свою задачу определенное время и не может работать паралельно с другой, поэтому допустимо использование одного потока (2 примере). В программы для команд М3, М4, М5 не передаются никакие параметры, поэтому значение VAR может быть любым номером не используемой переменной. Для команды S передается значение скорости. Если использовать режим постоянной скорости относительно поверхности G96/G97, то этот номер жестко задан в PC-DSP.h как

#define PC_COMM_CSS_S 113 // S speed

 

В большинстве случаев эти четыре программы C из примеров могут использоваться без каких-либо изменений. Все программы включают общий файл-заголовок MySpindleDefs.h содержащий параметры достаточных для настройки любой системы. Файл и параметры описаны ниже. Каждая из четырех С программ подключает файл заголовка строкой include: #include "MySpindleDefs.h". Это должно быть размещено сразу после строки #include "KMotionDef.h" (которая включает все стандартные определения KFLOP).

Некоторые системы управления шпинделем могут принимать положительные и отрицательные команду для разного направления вращения. Другие требуют отдельный дискретный выход для переключения направления, а скорость всегда устанавливается положительным значением. Если ваша система способна принимать положительные и отрицательные команды, тогда установите USE_POS_NEG_VOLTAGE в 1, иначе установите в 0.

MySpindleDefs.h

#define SPINDLEAXIS 6 // Axis Channel to Jog to rotate Spindle

#define FACTOR (1000/60.0) // to convert RPM to counts/sec (counts/rev / 60.0sec)

#define SPINDLECW_BIT 154 // bit to activate to cause CW rotation

#define SPINDLECCW_BIT 155 // bit to activate to cause CCW rotation

#define SPEEDVAR 99 // global persistant variable to store latest speed

#define STATEVAR 98 // global persistant variable to store latest state (-1=CCW,0=off,1=CW)

#define KMVAR PC_COMM_CSS_S // variable KMotionCNC will pass speed parameter (113)

#define USE_POS_NEG_VOLTAGE 0 // 0 = output Magnitude, 1 = output positive and negative speed
 

 

Эти C-программы (расположенные в каталоге \C Programs\SpindleUsingJogs\CSS) решают общую задачу которая заключается в том, что изменение скорости при выполнении разных команд не должно быть резким. Четыре программы используют две глобальные переменные для получения последнего состояния и скорости. Например это позволяет добавить задержку при включении шпинделя если он был выключен, пока шпиндель не будет включен, либо применить скорость немедленно если он уже включен. В приведенном выше примере для этой цели используются переменные с номерами 99 и 98.

 

CSS - постоянная скорость относительно поверхности (Constant Surface Speed)

Постоянная скорость относительно поверхности позволяет режущему инструменту токарного станка поддерживать постоянную линейную скорость независимо от текущего радиуса (или диаметра), поскольку скорость вращения шпинделя непрерывно регулируется в зависимости от радиуса.

Простая G-код программа, которая использует режим G96 CSS:

G90 G21             (Absolute mm)
G00 X50.8 Y0 Z50.8  (Rapid to starting position)
G96 M3 D2500 S159.6 (CSS should be 1000RPM at R=25.4mm)
G1 X2.54 Z25.4 F350 (Change X - radius)
G1 X50.8 Z0
G1 X2.54 F5000      (Change X - radius faster)
G1 X50.8 Z0
G1 X2.54            (Change X - radius faster)
G1 X50.8 Z0
M05                 (Spindle off)
G0 Z50.8
G97 M3 S500         (Run at normal RPM Mode)
G4 P3
M2

CSS G96/G97 требует, чтобы в KFLOP использовались некоторые дополнительные функции в C-программе. Когда KMotionCNC декодирует команду G96 для входа в режим CSS, устанавливается несколько переменных(VAR) в KFLOP. Программа, непрерывно работающая в одном из потоков KFLOP, определяет режим CSS и устанавливает обороты шпинделя как функцию положения оси X (радиус) от запрошенной скорости относительно поверхности. Пять переменных, заданных KMotionCNC для управления CSS, перечислены в общем файле заголовка PC-DSP.h и определяют, какие переменные будут помещены в данные:

// Persist Variable used with CSS Constant Surface speed for Spindle

// These parameters will be set when GCode switches to G97 CSS mode

// A User program in KFLOP must be running to monitor the mode an x position

// and alter the spindle RPM appropriately.

#define PC_COMM_CSS_MODE 110 // Mode 1=Normal RPM mode. 2=CSS

#define PC_COMM_CSS_X_OFFSET 111 // X axis counts for Radius zero

#define PC_COMM_CSS_X_FACTOR 112 // X axis factor to convert counts to inches

#define PC_COMM_CSS_S 113 // S speed setting in inches/sec

#define PC_COMM_CSS_MAX_RPM 114 // Limit max RPM to this value as Radius approaches zero

 

MODE: определяет, активен ли CSS или нет. G96 устанавливает все параметры CSS, а затем переключает режим на 2. G97 (обычный режим RPM) устанавливает MODE в 1. При включении питания MODE 0.
X_OFFSET позволяет KFLOP связывать позицию в дискретах с радиусом от оси шпинделя. Он состоит из всех смещений G-кода, преобразованных в значение оси X.
X_FACTOR обратный по отношению к разрешению оси X, что позволяет KFLOP делать простое умножение для преобразования отсчетов оси X в дюймы.
S: желаемая скорость относительно поверхности в дюймах/сек (конвертируется из G-кода футы/мин или метров/мин).
MAX_RPM: задает максимально допустимые обороты в минуту. Когда радиус приближается к нулю, требуемые обороты для поддержания заданной скорости относительно поверхности будут приближаться к бесконечности. Любые обороты выше MAX_RPM будут ограничены этим значением. Максимальный RPM может быть указан в G-коде параметром D. Если D не указан в той же строке, что и G96, тогда предел будет установлен как 1E9 RPM.


В большинстве случаев может использоваться поставляемая с KMotion функция ServiceCSS(), показанная ниже. В С комментариях пример как включить функцию в С файл инициализации и добавить к нему вызов в бесконечном цикле. Если у вас уже есть бесконечный цикл в С файле инициализации, добавьте в него вызов ServiceCSS(). Если еще нет, добавьте один бесконечный цикл, как показано ниже.

 

 

// Handle CSS (Constant Surface Speed) messages from KMotionCNC)

//

// This code assumes you have an Axis Channel Configured to control

// Spindle speed and Jog Calls can be made to control speed

//

// Include this function into your main Init Thead code and call it

// continuously from a forever loop similar to that shown here

 

//#include "KMotionDef.h"

//#include "MySpindleDefs.h"

//#include "CSSJog.c"

//main()

//{

//     for (;;)

//     {

//            WaitNextTimeSlice();

//            ServiceCSS();

//     }

//}

 

int   *css_mode = &persist.UserData[PC_COMM_CSS_MODE];               // Mode 1=Normal RPM mode. 2=CSS

float *css_xoff = &persist.UserData[PC_COMM_CSS_X_OFFSET];           // X axis counts for Radius zero

float *css_xfactor = &persist.UserData[PC_COMM_CSS_X_FACTOR]; // X axis factor to convert counts to inches

float *css_s = &persist.UserData[PC_COMM_CSS_S];                           // S speed setting in inches/sec

float *css_max_rpm = &persist.UserData[PC_COMM_CSS_MAX_RPM];  // Limit max RPM to this value as Radius approaches zero

 

double css_T=0;  // update only every so often

#define CSS_UPDATE_DT 0.05

 

void ServiceCSS(void)

{

    float rpm;

    double T=Time_sec();

 

    if (*css_mode == 2 && T > css_T) // check if we are in CSS mode and it is time to update

    {

        css_T=T+CSS_UPDATE_DT;  // determine next time to update

       

        // convert axis position to distance from center in inches

        float radius = fast_fabs((chan[CS0_axis_x].Dest - *css_xoff) * *css_xfactor);

       

        if (radius > 0.0f)

            rpm = *css_s / (radius * (TWO_PI_F/60.0f));

        else

            rpm = *css_max_rpm;

 

        if (rpm > *css_max_rpm) rpm = *css_max_rpm;

               

        if (persist.UserData[STATEVAR]!=0)  // if spindle is already on, ramp to new speed

        {

            if (USE_POS_NEG_VOLTAGE)
               Jog(SPINDLEAXIS,rpm * FACTOR * persist.UserData[STATEVAR]);
            else
               Jog(SPINDLEAXIS,rpm * FACTOR);

        }
//      printf("xoff=%f radius= %f xfactor=%f s=%f(ips) maxrpm=%f rpm=%f\n",*css_xoff,radius,*css_xfactor,*css_s,*css_max_rpm,rpm);

    }

}

 

Пошаговая инструкция

This sequence is applicable for Spindles that can be driven with a KFLOP Axis Channel:

#1 - подключите и проверьте электрические соединения шпинделя;

#2 - используя KMotion.exe настройте канал управления шпинделя;

#3 - измените MySpindleDefs.h with с настройками конкретной системы;

#4 - настройте KMotionCNC команды Tool Setup | M3 - M9 | M3, M4, M5, и S;

#5 - если к шпинделю подключен энкодер в KMotionCNC укажите параметры в Tool Setup | Trajectory Planner | Threading;

#6 - если планируется использование CSS добавьте в бесконечный цикл файла инициализации функцию ServiceCSS().

 

Видео (англ.) 

Демонстрация G-кода с использованием CSS.

Пользовательское видео использования CSS.



Настройка оси шпинделя с открытым контуром регулирования

 

 

Для шпинделей управляемых напряжением +-10В без обратной связи можно настроить один из 8 каналов управления осью на вывод скорости непосредственно с ЦАП. Такой вариант имеет несколько преимуществ. Во-первых, шпинделем можно управлять с помощью команд Jog Speed точно так же, как и сервоприводом (или любым другим типа Axis Channel). И во-вторых, для регулирования можно использовать параметры профиля движения оси (ускорение и рывок).

 

Конфигурация такая же, как и для оси без обратной связи (все PID параметры установлены в ноль) и с учетом упреждения по скорости (Velocity Feed Forward). Диаграмма показывает профиль движения в этом варианте:

 

 

 

На приведенных ниже экранах показан пример такой конфигурации. Она может быть загружена из AxisAsDAC7.mot

 

No Input, DAC Output, Negative Gain, Infinite Following error:

 

 

Фильтры очищены, чтобы иметь коэффициент усиления по постоянному току = 1.

 

 

 

Параметры PID установлены в ноль, Max Output - полный диапазон ЦАП, равный 2047, максимальная ошибка - бесконечность(1e10), упреждение (Feed Forward) 2047.

 

Ускорение (A-Acceleration) = 1 дискрет/с2, полная скорость будет нарастать за 1 секунду, Jerk = 5 дискрет / s3 (Ускорение «сглажено» на 1/5 секунд). Этот демонстрационный профиль перемещается со скоростью 0,5 дискрет/ сек, что приводит к получению полного диапазона выходного сигнала ЦАП (1023 дискрета или 5В аналогового значения). Обратите внимание, что выход (зеленый график) соответствует синиму, командному графику (Commanded Velocity). Может использоваться любой диапазон скорости, на примере только теоретический профиль скорости и он может быть масштабирован до любых значение скорости и упреждения.

 

 

Вы также можете проверить ось шпинделя, используя команды Jog для консоли. Например, Jog7 = 0,25 вращение шпинделя со скоростью 25% от максимальной.

 

Если ваш шпиндель принимает отрицательное значение напряжения задания, тогда при команде Jog7 = -0.25 он должен начать вращение в обратном направлении.

 

Чтобы определить правильное значение параметра FACTOR в файле MySpindleDefs.h, нужно знать максимальное число оборотом шпинделя при 10В. Это будет соответствовать оборотам в минуту при команде Jog 1.0. Например, если значение при 10 В составляет 2500 об/мин, настройте:

 

#define FACTOR (1.0/2500.0) // to convert RPM to counts/sec