LCNC->USB->Arduino-> ШД step, dir

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: LCNC->USB->Arduino-> ШД step, dir

Сообщение Serg »

solo писал(а):Может кто нибудь подскажет как изменить скетч чтобы получить большую частоту от ардуино на выводе степ :beer_blow:
Я думаю, что как только это кто-то узнает, то у них на сайте сразу появится новая версия с такими изменениями. :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
solo
Мастер
Сообщения: 1374
Зарегистрирован: 20 окт 2011, 18:39
Репутация: 272
Настоящее имя: Юрий Соловьев
Откуда: Украина Харьков
Контактная информация:

Re: LCNC->USB->Arduino-> ШД step, dir

Сообщение solo »

http://habrahabr.ru/post/141442/
Нашел вот такую ссылка Подскажите барану куда в скетч надо добавить данную инфу, или что на что надо поменять для того чтобы ускорить выполнение digitalWrite
если я правильно понимаю то в скетч вот этот кусок программы отвечает за генерацию шагов
(для просмотра содержимого нажмите на ссылку)
void stepLight() // Set by jog() && Used by loop()логического состояния необходимы для обеспечения каждой оси
{
unsigned long curTime=micros();
// if(curTime - stepTimeOld >= minStepTime)
// {
// stepState=!stepState;
int busy=0;

if(curTime - stepTimeOldX >= minStepTimeX){stepStateX=!stepStateX;if(stepper0Pos != stepper0Goto){busy++;idleCount=0;if(stepper0Pos > stepper0Goto){digitalWrite(dirPin0,!dirState0);digitalWrite(stepPin0,stepStateX);stepper0Pos--;}else{digitalWrite(dirPin0, dirState0);digitalWrite(stepPin0,stepStateX);stepper0Pos++;}}stepTimeOldX=curTime;}
if(curTime - stepTimeOldY >= minStepTimeY){stepStateY=!stepStateY;if(stepper1Pos != stepper1Goto){busy++;idleCount=0;if(stepper1Pos > stepper1Goto){digitalWrite(dirPin1,!dirState1);digitalWrite(stepPin1,stepStateY);stepper1Pos--;}else{digitalWrite(dirPin1, dirState1);digitalWrite(stepPin1,stepStateY);stepper1Pos++;}}stepTimeOldY=curTime;}
if(curTime - stepTimeOldZ >= minStepTimeZ){stepStateZ=!stepStateZ;if(stepper2Pos != stepper2Goto){busy++;idleCount=0;if(stepper2Pos > stepper2Goto){digitalWrite(dirPin2,!dirState2);digitalWrite(stepPin2,stepStateZ);stepper2Pos--;}else{digitalWrite(dirPin2, dirState2);digitalWrite(stepPin2,stepStateZ);stepper2Pos++;}}stepTimeOldZ=curTime;}
if(curTime - stepTimeOldA >= minStepTimeA){stepStateA=!stepStateA;if(stepper3Pos != stepper3Goto){busy++;idleCount=0;if(stepper3Pos > stepper3Goto){digitalWrite(dirPin3,!dirState3);digitalWrite(stepPin3,stepStateA);stepper3Pos--;}else{digitalWrite(dirPin3, dirState3);digitalWrite(stepPin3,stepStateA);stepper3Pos++;}}stepTimeOldA=curTime;}
if(curTime - stepTimeOldB >= minStepTimeB){stepStateB=!stepStateB;if(stepper4Pos != stepper4Goto){busy++;idleCount=0;if(stepper4Pos > stepper4Goto){digitalWrite(dirPin4,!dirState4);digitalWrite(stepPin4,stepStateB);stepper4Pos--;}else{digitalWrite(dirPin4, dirState4);digitalWrite(stepPin4,stepStateB);stepper4Pos++;}}stepTimeOldB=curTime;}
if(curTime - stepTimeOldC >= minStepTimeC){stepStateC=!stepStateC;if(stepper5Pos != stepper5Goto){busy++;idleCount=0;if(stepper5Pos > stepper5Goto){digitalWrite(dirPin5,!dirState5);digitalWrite(stepPin5,stepStateC);stepper5Pos--;}else{digitalWrite(dirPin5, dirState5);digitalWrite(stepPin5,stepStateC);stepper5Pos++;}}stepTimeOldC=curTime;}
if(curTime - stepTimeOldU >= minStepTimeU){stepStateU=!stepStateU;if(stepper6Pos != stepper6Goto){busy++;idleCount=0;if(stepper6Pos > stepper6Goto){digitalWrite(dirPin6,!dirState6);digitalWrite(stepPin6,stepStateU);stepper6Pos--;}else{digitalWrite(dirPin6, dirState6);digitalWrite(stepPin6,stepStateU);stepper6Pos++;}}stepTimeOldU=curTime;}
if(curTime - stepTimeOldV >= minStepTimeV){stepStateV=!stepStateV;if(stepper7Pos != stepper7Goto){busy++;idleCount=0;if(stepper7Pos > stepper7Goto){digitalWrite(dirPin7,!dirState7);digitalWrite(stepPin7,stepStateV);stepper7Pos--;}else{digitalWrite(dirPin7, dirState7);digitalWrite(stepPin7,stepStateV);stepper7Pos++;}}stepTimeOldV=curTime;}
if(curTime - stepTimeOldW >= minStepTimeW){stepStateW=!stepStateW;if(stepper8Pos != stepper8Goto){busy++;idleCount=0;if(stepper8Pos > stepper8Goto){digitalWrite(dirPin8,!dirState8);digitalWrite(stepPin8,stepStateW);stepper8Pos--;}else{digitalWrite(dirPin8, dirState8);digitalWrite(stepPin8,stepStateW);stepper8Pos++;}}stepTimeOldW=curTime;}
if(busy){digitalWrite(idleIndicator,LOW);if(globalBusy<255){globalBusy++;}}else{digitalWrite(idleIndicator,HIGH);if(globalBusy>0){globalBusy--;}
if(giveFeedBackX){fbx=stepper0Pos/4/(stepsPerInchX*0.5);if(!busy){if(fbx!=fbxOld){fbxOld=fbx;Serial.print("fx");Serial.println(fbx,6);}}}
if(giveFeedBackY){fby=stepper1Pos/4/(stepsPerInchY*0.5);if(!busy){if(fby!=fbyOld){fbyOld=fby;Serial.print("fy");Serial.println(fby,6);}}}
if(giveFeedBackZ){fbz=stepper2Pos/4/(stepsPerInchZ*0.5);if(!busy){if(fbz!=fbzOld){fbzOld=fbz;Serial.print("fz");Serial.println(fbz,6);}}}
if(giveFeedBackA){fba=stepper3Pos/4/(stepsPerInchA*0.5);if(!busy){if(fba!=fbaOld){fbaOld=fba;Serial.print("fa");Serial.println(fba,6);}}}
if(giveFeedBackB){fbb=stepper4Pos/4/(stepsPerInchB*0.5);if(!busy){if(fbb!=fbbOld){fbbOld=fbb;Serial.print("fb");Serial.println(fbb,6);}}}
if(giveFeedBackC){fbc=stepper5Pos/4/(stepsPerInchC*0.5);if(!busy){if(fbc!=fbcOld){fbcOld=fbc;Serial.print("fc");Serial.println(fbc,6);}}}
if(giveFeedBackU){fbu=stepper6Pos/4/(stepsPerInchU*0.5);if(!busy){if(fbu!=fbuOld){fbuOld=fbu;Serial.print("fu");Serial.println(fbu,6);}}}
if(giveFeedBackV){fbv=stepper7Pos/4/(stepsPerInchV*0.5);if(!busy){if(fbv!=fbvOld){fbvOld=fbv;Serial.print("fv");Serial.println(fbv,6);}}}
if(giveFeedBackW){fbw=stepper8Pos/4/(stepsPerInchW*0.5);if(!busy){if(fbw!=fbwOld){fbwOld=fbw;Serial.print("fw");Serial.println(fbw,6);}}}
}

// stepTimeOld=curTime;
// }
}
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LCNC->USB->Arduino-> ШД step, dir

Сообщение Nick »

Так у него всеравно на выхлопе до 15 кгц, тебе этого хватит?
Аватара пользователя
solo
Мастер
Сообщения: 1374
Зарегистрирован: 20 окт 2011, 18:39
Репутация: 272
Настоящее имя: Юрий Соловьев
Откуда: Украина Харьков
Контактная информация:

Re: LCNC->USB->Arduino-> ШД step, dir

Сообщение solo »

не 15 кГц на выводе степ не получается Получается около 500 Гц
Я уже перепробовал много разных вариантов корректировки скетча все равно получается очень медленно
если на прямую дергаю выводи степ такой командой

Код: Выделить всё

if(stepper0Pos != stepper0Goto){busy++;if(stepper0Pos > stepper0Goto){PORTC |= (1<<7);PORTC &= ~(1<<5);stepper0Pos--;PORTC |= (1<<5);}else{PORTC &= ~(1<<7);PORTC &= ~(1<<5);stepper0Pos++;PORTC |= (1<<5);}}
то импульс степ получается очень короткий и его не успевает отрабатывать драйвер ШД но ардуина вроде тогда успевает генерировать импульсы :thinking: Добавляю делау чтобы увеличить длительность импульс степ то тогда получается каша на степ ( нет стабильности и падает частота ) . вот так пишу команду

Код: Выделить всё

if(stepper0Pos != stepper0Goto){busy++;if(stepper0Pos > stepper0Goto){PORTC |= (1<<7);PORTC &= ~(1<<5);stepper0Pos--; delayMicroseconds(10);PORTC |= (1<<5);}else{PORTC &= ~(1<<7);PORTC &= ~(1<<5);stepper0Pos++;delayMicroseconds(10);PORTC |= (1<<5);}}
ИМХО проблема в том что в цикл генерации степ включает опрос последовательного порта и это может очень сильно тормозить ардуину, но правда с моим :monkey: :hammer: подходом и пониманием в программировании все может быть совсем на оборот
Мне уже говорил " пилот " что без работы с прерываниями хорошего результата не получится, пытаюсь изучать программирование С++ ( правда пока очень туго продвигается) Если кто то поможет с программирование буду весьма признателен :beer_blow:
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: LCNC->USB->Arduino-> ШД step, dir

Сообщение Serg »

Не нужно пока изучать C++ - только хуже будет. Для программирования МК это вообще вредно.
А вот учится использовать прерывания полезно.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: LCNC->USB->Arduino-> ШД step, dir

Сообщение Nick »

UAVpilot писал(а):А вот учится использовать прерывания полезно.
А какие именно тут нужны?
Вот бы узнать, а то я тоже в этом :monkey:
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: LCNC->USB->Arduino-> ШД step, dir

Сообщение Serg »

В данном случае нужны прерывания от таймера.
Нужно "завести" таймер, чтоб он генерировал прерывания раз в 10 мкс (или какая там минимальная задержка в проге?) и переписать программу так, чтобы вместо всяких delayMicroseconds(10) использовать эти прерывания. А то тут получается, что пока для одной оси выполняется delayMicroseconds(10) (по сути простой процессора, скорости которого и так не хватает) все остальные оси стоят и тупо ждут своей очереди.
Правда остаётся ещё вопрос успеет-ли ардуина исполнить код такого обработчика прерываний за эти 10 мкс?..
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
solo
Мастер
Сообщения: 1374
Зарегистрирован: 20 окт 2011, 18:39
Репутация: 272
Настоящее имя: Юрий Соловьев
Откуда: Украина Харьков
Контактная информация:

Re: LCNC->USB->Arduino-> ШД step, dir

Сообщение solo »

А вообще как вы оцените этот проект имеет перспективу или это мертво рожденное дитя
Читая про ардуино в некоторых проектах люди получали частоту на прерываниях до 250 кГц
вот код данного скетча

Код: Выделить всё

#define STEP 10        // шаг, в Гц
#define STEP1 500      // шаг при удержании кнопки, в Гц

#define OUT 9          // вывод выходного сигнала
#define BUTTON_UP 3    // вывод кнопки "выше"
#define BUTTON_DOWN 4  // вывод кнопки "ниже"

int frequency = 1000;  // частота по умолчанию (при включении), в Гц 

void setup() 
{
  Serial.begin(9600);
  digitalWrite(BUTTON_UP, HIGH);     
  digitalWrite(BUTTON_DOWN, HIGH); 
  pinMode(OUT, OUTPUT);
  Serial.println(Set_frequency(frequency));
}

void loop()
{
  Pressed(BUTTON_UP);
  Pressed(BUTTON_DOWN);
}

void Pressed(byte button)
{
  static bool f_up, f_down;
  static uint32_t time_out;
  if(!digitalRead(button))
  {
    if(button==BUTTON_UP ? !f_up : !f_down)
    {
      frequency = button==BUTTON_UP ? frequency+STEP: frequency-STEP;
      button==BUTTON_UP ? f_up=1 : f_down=1;
      time_out = millis() + 1000;
    }
    if(millis() > time_out) 
    {
      frequency = button==BUTTON_UP ? frequency+STEP1: frequency-STEP1;
      delay(350);
    }
    frequency = constrain(frequency, 40, 40000);
    Serial.println(Set_frequency(frequency));
    delay(150);
  }
  else  button==BUTTON_UP ? f_up=0 : f_down=0;
}

uint16_t Set_frequency(uint16_t freq)
{
  cli();
  TCCR1A = 0b01000000; 
  uint16_t ocr;
  if(freq < 134) 
  {
    TCCR1B = 0b00001010; 
    ocr = 1000000UL/freq - 1;
    freq = 1000000UL/(ocr+1);
  }
  else 
  {
    TCCR1B = 0b00001001;
    ocr = 8000000UL/freq - 1;
    freq = 8000000UL/(ocr+1);
  }
  OCR1AH = highByte(ocr);  
  OCR1AL = lowByte(ocr);
  TIMSK1 = 0b00000010; 
  sei();
  return freq;
}

ISR(TIMER1_COMPA_vect){}
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: LCNC->USB->Arduino-> ШД step, dir

Сообщение Serg »

solo писал(а):А вообще как вы оцените этот проект имеет перспективу или это мертво рожденное дитя
LPT порт оно не переплюнет, поэтому не имеет смысла. Попробуйте лучше pluto-p.
solo писал(а):Читая про ардуино в некоторых проектах люди получали частоту на прерываниях до 250 кГц
Сферический конь в вакууме. Даже если 250 кГц, то это только один канал, а у нас их минимум 3, плюс накладные расходы на вычисления частоты из данных от LCNC + плюс расходы на комуникацию с LCNC - а это добвольно большой поток данных.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
michael-yurov
Почётный участник
Почётный участник
Сообщения: 11730
Зарегистрирован: 26 июл 2012, 00:10
Репутация: 4703
Настоящее имя: Михаил Львович
Откуда: Новоуральск
Контактная информация:

Re: LCNC->USB->Arduino-> ШД step, dir

Сообщение michael-yurov »

Не знаю, про какой чип идет речь...
Но тут, вроде, операция деления используется, так что, наверное, речь про достаточно мощный микропроцессор.
Мне кажется, что в идеале стоило бы генерировать импульсы аппаратным таймером, а другим таймером подсчитывать сколько импульсов сгенерировано (проще, конечно, использовать прерывание для подсчета сгенерированных импульсов, но это сильно замедлит работу). Только вот я уже совсем запутался... В этой ардуине можно таймером считать импульсы пришедшие извне (с другой ножки)?
Тогда можно получить практически любые частоты, если правильно рассчитать делители первого таймера.

Простите, если я совсем не в тему, и глупости написал.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: LCNC->USB->Arduino-> ШД step, dir

Сообщение Serg »

michael-yurov писал(а):Тогда можно получить практически любые частоты, если правильно рассчитать делители первого таймера.
В том-то всё и дело, что делители там очень убогие и не позволят получить диапазон частот с необходимой градацией.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Ответить

Вернуться в «LinuxCNC»