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;
}
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11