Общие фразы.Vitalik писал(а):Все настройки и номера пинов как в теме.
В теме не было подчиненной оси.
Рисуйте сюда схему и давайте настройки.
Догадываться никто не будет.
Чем больше дадите информации, тем быстрее и более вероятен ответ...
Общие фразы.Vitalik писал(а):Все настройки и номера пинов как в теме.

Саш приветствую. Хотел бы вернуться к теме регулировки оборотов. Решил добить этот вопрос...ukr-sasha писал(а):С Кстепа напряжение есть? Оно регулируется?AlexNikov писал(а):Хотел бы повторно попросить помощи по посту
Код: Выделить всё
#include "KMotionDef.h"
#include "CorrectAnalogFunction.c"
#define RefVoltage 11.09f
main()
{
float V=7.0;
FPGA(KAN_TRIG_REG)=4; // Mux PWM0 to JP7 Pin5 IO 44 for KSTEP
SetBitDirection(44,1); // define bit as an output
FPGA(IO_PWMS_PRESCALE) = 46; // divide clock by 46 (1.4 KHz)
FPGA(IO_PWMS+1) = 1; // Enable
FPGA(IO_PWMS) = CorrectAnalog(V/RefVoltage); // Set PWM
// FPGA(IO_PWMS) = 7; // Set PWM to a specific count
}Похоже, что индексная метка энкодера срабатывает в зоне действия концевика, т.е. концевик еще не отжался, а индексная метка уже сработала, и далее идет включение обработки нажатия концевика, как лимита, вот ось и отключается.Vitalik писал(а):Ещё разок объясню что происходит с ХОУМ. Сначала ось зет едет к концевичку -он срабатывает и ось немного отъезжает, координаты обнуляются и загорают желтым. Дальше поехала ось Х и аналогичная ситуация. Но пока ось Х едет к концевику- ось зет самопроизвольно плывет. ( Ещё примечание: концевик при отъезде не успевает отключится, хотя я пробовал в ручную нажать и отпустить - результат такой же)
Приветствую.AlexNikov писал(а):Саш приветствую. Хотел бы вернуться к теме регулировки оборотов. Решил добить этот вопрос...
Код: Выделить всё
#include "KMotionDef.h"
#define MAX_RPM 3000.0f
// drive PWM 0 as spindle
//
// PWM 0 is KFLOP IO bit #26
// JP6 Aux#1 Pin 5
main()
{
int pwm;
float speed = *(float *)&persist.UserData[0]; // value stored is actually a float
pwm = speed/MAX_RPM * 255.0f;
if (pwm > 255) pwm=255; // limit to max pwm value
printf("Spindle Set to %f pwm %d\n",speed, pwm); // print the desired speed
FPGA(IO_PWMS+1) = 1; // enable the PWM
FPGA(IO_PWMS) = pwm; // set the PWM
}

Усилители в ошибку не уходят в ошибку?Vitalik писал(а):У меня возникла ещё заминочка

Нет не уходят. На всякий случай скажу параметры в сервопаке Yaskawa SGDS: Fn001-d007(удержание), Частота 800герц, момент инерции автотюном определился 380%.ukr-sasha писал(а): Усилители в ошибку не уходят в ошибку?
Только нашел.AlexNikov писал(а):.в общем я в тупике, прошу помощи...
Опробовал. Теперь все ровно на оборот - шпиндель включается на максимальные обороты и не реагирует на команды S.ukr-sasha писал(а):Только нашел.AlexNikov писал(а):.в общем я в тупике, прошу помощи...
Есть готовые файлы настройки для управления шпинделем с КСтепа.
Лежат по пути: C:\KMotion433k\C Programs\KStep\KMotionCNC
Код: Выделить всё
#include "KMotionDef.h"
#include "..\CorrectAnalogFunction.c"
#define RPM_FACTOR 500.0 // RPM for full duty cycle (max analog out)
// desired speed is passed in variable 1
main()
{
float speed = *(float *)&persist.UserData[1]; // value stored is actually a float
FPGA(KAN_TRIG_REG)=4; // Mux PWM0 to JP7 Pin5 IO 44 for KSTEP
SetBitDirection(44,1); // define bit as an output
FPGA(IO_PWMS_PRESCALE) = 46; // divide clock by 46 (1.4 KHz)
FPGA(IO_PWMS+1) = 1; // Enable
FPGA(IO_PWMS) = CorrectAnalog(speed/RPM_FACTOR); // Set PWM
}Код: Выделить всё
#include "KMotionDef.h"
// Defines axis 0, 1, 2 as simple step dir TTL outputs for KSTEP
// enables them
// sets them as an xyz coordinate system for GCode
int main()
{
SetBitDirection(0,1); //set as output
SetBitDirection(1,1); //set as output
double T0, LastX=0, LastY=0, LastZ=0, Tau;
KStepPresent=TRUE; // enable KSTEP input multiplexing
FPGA(KAN_TRIG_REG)=4; // Mux PWM0 to JP7 Pin5 IO 44 for KSTEP
FPGA(STEP_PULSE_LENGTH_ADD) = 63 + 0x80; // set polarity and pulse length to 4us
ch0->InputMode=NO_INPUT_MODE;
ch0->OutputMode=STEP_DIR_MODE;
ch0->Vel=40000;
ch0->Accel=200000;
ch0->Jerk=4e+006;
ch0->P=0;
ch0->I=0.01;
ch0->D=0;
ch0->FFAccel=0;
ch0->FFVel=0;
ch0->MaxI=200;
ch0->MaxErr=1e+006;
ch0->MaxOutput=200;
ch0->DeadBandGain=1;
ch0->DeadBandRange=0;
ch0->InputChan0=0;
ch0->InputChan1=0;
ch0->OutputChan0=8;
ch0->OutputChan1=0;
ch0->MasterAxis=-1;
ch0->LimitSwitchOptions=0x12f;
ch0->LimitSwitchNegBit=169;
ch0->LimitSwitchPosBit=168;
ch0->SoftLimitPos=1e+009;
ch0->SoftLimitNeg=-1e+009;
ch0->InputGain0=1;
ch0->InputGain1=1;
ch0->InputOffset0=0;
ch0->InputOffset1=0;
ch0->OutputGain=1;
ch0->OutputOffset=0;
ch0->SlaveGain=1;
ch0->BacklashMode=BACKLASH_OFF;
ch0->BacklashAmount=0;
ch0->BacklashRate=0;
ch0->invDistPerCycle=1;
ch0->Lead=0;
ch0->MaxFollowingError=1000000000;
ch0->StepperAmplitude=20;
ch0->iir[0].B0=1;
ch0->iir[0].B1=0;
ch0->iir[0].B2=0;
ch0->iir[0].A1=0;
ch0->iir[0].A2=0;
ch0->iir[1].B0=1;
ch0->iir[1].B1=0;
ch0->iir[1].B2=0;
ch0->iir[1].A1=0;
ch0->iir[1].A2=0;
ch0->iir[2].B0=0.000769;
ch0->iir[2].B1=0.001538;
ch0->iir[2].B2=0.000769;
ch0->iir[2].A1=1.92076;
ch0->iir[2].A2=-0.923833;
EnableAxisDest(0,0);
ch1->InputMode=NO_INPUT_MODE;
ch1->OutputMode=STEP_DIR_MODE;
ch1->Vel=40000;
ch1->Accel=200000;
ch1->Jerk=4e+006;
ch1->P=0;
ch1->I=0.01;
ch1->D=0;
ch1->FFAccel=0;
ch1->FFVel=0;
ch1->MaxI=200;
ch1->MaxErr=1e+006;
ch1->MaxOutput=200;
ch1->DeadBandGain=1;
ch1->DeadBandRange=0;
ch1->InputChan0=0;
ch1->InputChan1=0;
ch1->OutputChan0=9;
ch1->OutputChan1=0;
ch1->MasterAxis=-1;
ch1->LimitSwitchOptions=0x12f;
ch1->LimitSwitchNegBit=171;
ch1->LimitSwitchPosBit=170;
ch1->SoftLimitPos=1e+009;
ch1->SoftLimitNeg=-1e+009;
ch1->InputGain0=1;
ch1->InputGain1=1;
ch1->InputOffset0=0;
ch1->InputOffset1=0;
ch1->OutputGain=1;
ch1->OutputOffset=0;
ch1->SlaveGain=1;
ch1->BacklashMode=BACKLASH_OFF;
ch1->BacklashAmount=0;
ch1->BacklashRate=0;
ch1->invDistPerCycle=1;
ch1->Lead=0;
ch1->MaxFollowingError=1000000000;
ch1->StepperAmplitude=20;
ch1->iir[0].B0=1;
ch1->iir[0].B1=0;
ch1->iir[0].B2=0;
ch1->iir[0].A1=0;
ch1->iir[0].A2=0;
ch1->iir[1].B0=1;
ch1->iir[1].B1=0;
ch1->iir[1].B2=0;
ch1->iir[1].A1=0;
ch1->iir[1].A2=0;
ch1->iir[2].B0=0.000769;
ch1->iir[2].B1=0.001538;
ch1->iir[2].B2=0.000769;
ch1->iir[2].A1=1.92076;
ch1->iir[2].A2=-0.923833;
EnableAxisDest(1,0);
ch2->InputMode=NO_INPUT_MODE;
ch2->OutputMode=STEP_DIR_MODE;
ch2->Vel=40000;
ch2->Accel=200000;
ch2->Jerk=4e+006;
ch2->P=0;
ch2->I=0.01;
ch2->D=0;
ch2->FFAccel=0;
ch2->FFVel=0;
ch2->MaxI=200;
ch2->MaxErr=1e+006;
ch2->MaxOutput=200;
ch2->DeadBandGain=1;
ch2->DeadBandRange=0;
ch2->InputChan0=0;
ch2->InputChan1=0;
ch2->OutputChan0=10;
ch2->OutputChan1=0;
ch2->MasterAxis=-1;
ch2->LimitSwitchOptions=0x12a;
ch2->LimitSwitchNegBit=172;
ch2->LimitSwitchPosBit=172;
ch2->SoftLimitPos=1e+009;
ch2->SoftLimitNeg=-1e+009;
ch2->InputGain0=1;
ch2->InputGain1=1;
ch2->InputOffset0=0;
ch2->InputOffset1=0;
ch2->OutputGain=-1;
ch2->OutputOffset=0;
ch2->SlaveGain=1;
ch2->BacklashMode=BACKLASH_OFF;
ch2->BacklashAmount=0;
ch2->BacklashRate=0;
ch2->invDistPerCycle=1;
ch2->Lead=0;
ch2->MaxFollowingError=1000000000;
ch2->StepperAmplitude=20;
ch2->iir[0].B0=1;
ch2->iir[0].B1=0;
ch2->iir[0].B2=0;
ch2->iir[0].A1=0;
ch2->iir[0].A2=0;
ch2->iir[1].B0=1;
ch2->iir[1].B1=0;
ch2->iir[1].B2=0;
ch2->iir[1].A1=0;
ch2->iir[1].A2=0;
ch2->iir[2].B0=1;
ch2->iir[2].B1=0;
ch2->iir[2].B2=0;
ch2->iir[2].A1=0;
ch2->iir[2].A2=0;
EnableAxisDest(2,0);
DefineCoordSystem(0,1,2,-1);
SetBitDirection(45,1); // set Enable Signal as Output
SetBit(45); // Enable the amplifiers
// Add a small amount of Coordinated Motion Path smoothing if desired
// Tau = 0.001; // seconds for Low Pass Filter Time Constant
// KLP = exp(-TIMEBASE/Tau);
KLP=0; // force to 0 to disable
// printf("Tau=%f KLP=%f\n",Tau,KLP);
for (;;) // loop forever
{
WaitNextTimeSlice();
// Service Amplifier disable after no activity for a while
if (ch0->Dest != LastX || ch1->Dest != LastY || ch2->Dest != LastZ)
{
// we moved - enable KStep Amplifers
SetBit(45);
T0 = Time_sec(); // record the time and position of last motion
LastX=ch0->Dest;
LastY=ch1->Dest;
LastZ=ch2->Dest;
}
else
{
if (Time_sec() > T0 + 10.0) ClearBit(45);
}
}
return 0;
}
ukr-sasha писал(а):И ещё, концевики нормально замкнутые или открытые?
Если замкнутые, то код активации концевиков после обнуления оси, должен выглядеть так:Код: Выделить всё
ch0->LimitSwitchOptions=0x12f;
Если ось плывет, значит она выключена.Vitalik писал(а):Спасибо!) У меня нормально закрытые. Добавил код и эта проблема решилась). Осталось только со слейвом что то сделать.. После того как все оси захоумились слейв продолжает плыть... Пробовал добавлять JOG (3,0) , дублировать остановки и перемещения для третей оси. Но ни чем не помогло.

Ну вот начинается...Vitalik писал(а):Если бы вы ещё мне подсказали что дописать в ХОУМ для слейва- был бы благодарен за помощь)
Доброго дня. Результат пока нулевой. Вот некоторые мои соображения.ukr-sasha писал(а):Попробуйте в каталог со своими Си файлами положить файл CorrectAnalogFunction.c. Он находиться в каталоге: C:\KMotion433k\C Programs\KStep.
Этот файл используется, как функция в файле управления шпинделем.
Код: Выделить всё
#include "KMotionDef.h"
#include "CorrectAnalogFunction.c"
#define RefVoltage 11.09f
main()
{
float V=5.0;
FPGA(KAN_TRIG_REG)=4; // Mux PWM0 to JP7 Pin5 IO 44 for KSTEP
SetBitDirection(44,1); // define bit as an output
FPGA(IO_PWMS_PRESCALE) = 46; // divide clock by 46 (1.4 KHz)
FPGA(IO_PWMS+1) = 1; // Enable
FPGA(IO_PWMS) = CorrectAnalog(V/RefVoltage); // Set PWM
// FPGA(IO_PWMS) = 7; // Set PWM to a specific count
}
Код: Выделить всё
#include "KMotionDef.h"
#include "CorrectAnalogFunction.c"
#define RPM_FACTOR 500.0 // RPM for full duty cycle (max analog out)
// desired speed is passed in variable 1
main()
{
float speed = *(float *)&persist.UserData[1]; // value stored is actually a float
FPGA(KAN_TRIG_REG)=4; // Mux PWM0 to JP7 Pin5 IO 44 for KSTEP
SetBitDirection(44,1); // define bit as an output
FPGA(IO_PWMS_PRESCALE) = 46; // divide clock by 46 (1.4 KHz)
FPGA(IO_PWMS+1) = 1; // Enable
FPGA(IO_PWMS) = CorrectAnalog(speed/RPM_FACTOR); // Set PWM
}
Код: Выделить всё
// PWM->Analog Correction
//
// assume very non-linear for first few count and linear thereafter
//
// Measure output ratio for first 0-7 counts then at 240
float V[]=
{
0.001, // count = 0
0.031, // count = 1
0.044, // count = 2
0.054, // count = 3
0.062, // count = 4
0.069, // count = 5
0.074, // count = 6
0.079 // count = 7
};
float V240=0.970;
int CorrectAnalog(float v)
{
int r;
float v2=2.0f*v;
// compare with half way points to determine closest count
if (v2 < V[1]+V[0]) return 0;
if (v2 < V[2]+V[1]) return 1;
if (v2 < V[3]+V[2]) return 2;
if (v2 < V[4]+V[3]) return 3;
if (v2 < V[5]+V[4]) return 4;
if (v2 < V[6]+V[5]) return 5;
if (v2 < V[7]+V[6]) return 6;
// must be 7 or higher do linear interpolation
r = (int)(7.5 + (v-V[7])/(V240-V[7])*(240.0f-7.0f));
if (r>255) r=255;
return r;
}
Код: Выделить всё
#include "KMotionDef.h"
#include "CorrectAnalogFunction.c"
#define RPM_FACTOR 500.0 // RPM for full duty cycle (max analog out)
// desired speed is passed in variable 1
main()
{
float v = *(float *)&persist.UserData[1]; // value stored is actually a float
FPGA(KAN_TRIG_REG)=4; // Mux PWM0 to JP7 Pin5 IO 44 for KSTEP
SetBitDirection(44,1); // define bit as an output
FPGA(IO_PWMS_PRESCALE) = 46; // divide clock by 46 (1.4 KHz)
FPGA(IO_PWMS+1) = 1; // Enable
FPGA(IO_PWMS) = CorrectAnalog(v/RPM_FACTOR); // Set PWM
}Код: Выделить всё
#include "KMotionDef.h"
#include "CorrectAnalogFunction.c"
#define RPM_FACTOR 500.0 // RPM for full duty cycle (max analog out)
// desired speed is passed in variable 1
main()
{
float v = *(float *)&persist.UserData[1]; // value stored is actually a float
FPGA(KAN_TRIG_REG)=4; // Mux PWM0 to JP7 Pin5 IO 44 for KSTEP
SetBitDirection(44,1); // define bit as an output
FPGA(IO_PWMS_PRESCALE) = 46; // divide clock by 46 (1.4 KHz)
FPGA(IO_PWMS+1) = 1; // Enable
FPGA(IO_PWMS) = CorrectAnalog(v/RPM_FACTOR); // Set PWMЯ решал таким способом. У меня привода sv-db100 с поддержкой степ/дир и спид-моде. Я настроил в комбинированный режим. Когда оси активны то спид-моде, а когда не активны то в степ/дире, удерживание приводом по своему энкодеру.PKM писал(а):Странно, то есть ПИД отключается без выключения привода? Это недопустимо.konstantinshr писал(а):В противном случае оси останавливаются но сигнал анейбл не пропадает. А у меня есть небольшое паразитное напряжение и оси понемногу начинают ползти.