Dmitry__ писал(а):для фрезеровки печатных плат, чтоб убрать сложный процесс настройки плавающего носика станка egx300
А чем не подходит такой вариант?
Да и у твоего гравера должна быть "насадка-регулятор глубины"?
|  | roboforum.ruТехнический форум по робототехнике. |  | 
Dmitry__ писал(а):для фрезеровки печатных плат, чтоб убрать сложный процесс настройки плавающего носика станка egx300







Dmitry__ писал(а):как для контура ноль настраивать?
 
 

typedef enum {
  WAITPROBE,
  FIRSTPROBE,
  SECONDPROBE
}state_machine;
state_machine state=WAITPROBE;
.....
#if defined(Algo_TimeBased)
    //порегулируем мощность лазера
    while( ((dataMax = ADNS_read(ADNS_MAX_PIX)) || 1) &&
           ( dataMax > laser_power_pwm_target ||
           ( dataMax < laser_power_pwm_target && RegPowLaser < 255) ) ){
      RefrPowerLaser(dataMax);
    }
    if (RegPowLaser < 255) {                // лазер в поле зрения
      switch(state){
        case WAITPROBE:
          FirstSensedTime=millis();         //начинаем замер времени
          state=FIRSTPROBE;                 // первый этап
         break;
       case FIRSTPROBE:                     //первый замер
          if (sensed){                      // уже было срабатывание
            if (RegPowLaser > (BasePowLaser + 50)){ //  отошли от базового уровня на достаточное расстояние, переход ко второму этапу
              state=SECONDPROBE;            // второй этап
              PIN_HIGH(LED);sensed=false;   // отключаем сигнал срабатывания
            }
          }else{                            // ждем время
            currentTime=millis();
            if (currentTime >= (FirstSensedTime + TimeBased_wait_center)){ // время вышло, останавливаемся
              PIN_LOW(LED);sensed=true;     // сигнал срабатывания
              BasePowLaser=RegPowLaser;     // запоминаем значение регулировки лазера
            }
          }
        break;
       case SECONDPROBE :                   //второй замер
          if (!sensed){                     // пока не было срабатывания
            if (RegPowLaser < (BasePowLaser + 5)){//  подошли близко к базовому уровню срабатываем
              PIN_LOW(LED);sensed=true;     // включаем сигнал срабатывания
            }
          }else{                            // было финальное срабатывание на втором этапе
            ;
          }
        break;
      }//switch
    }else{                                  // лазер вне поля зрения
      if(state != WAITPROBE){               // если вне режима ожидания
        if (sensed){
          switch(state){                    // выход лазера из поля после срабатывания - нормальная ситуация
            case FIRSTPROBE:                // выход лазера из поля зрения между замерами, переходим ко ожиданию второго этапа
              state=SECONDPROBE;            // второй этап
              PIN_HIGH(LED);sensed=false;   // отключаем сигнал срабатывания
            break;
            case SECONDPROBE:               // выход лазера из поля после финального срабатывания, переходим ко ожиданию
              state=WAITPROBE;              // ожидание
              PIN_HIGH(LED);sensed=false;   // отключаем сигнал срабатывания
            break;
          }
        }else{                               // выход лазера из поля без срабатывания - аварийная ситуация
          PIN_LOW(LED);sensed=true;          // включаем сигнал срабатывания
          state=WAITPROBE;                   // ожидание
        }
      }//state != WAITPROBE
    }//else RegPowLaser < 255
#endif //Algo_TimeBased



float GetSMA(uint8_t *buffer,byte depth,byte LastValue)
{
  float result=0;
  for (byte x=depth-1 ; x>1 ; x--){
    buffer[x] = buffer[x-1]; //сдвигаем массив результатов вправо
    result+= buffer[x];
  }
  buffer[0] = LastValue; //добавляем новое значение
  result+= buffer[0];
  result = result/(float)depth;
  return result;
}




Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0