Показать сообщение отдельно
Непрочитано 26.09.2016, 00:45  
ALEGYR
Вид на жительство
 
Регистрация: 10.06.2005
Сообщений: 325
Сказал спасибо: 43
Сказали Спасибо 360 раз(а) в 194 сообщении(ях)
ALEGYR на пути к лучшему
По умолчанию Re: Объясните лоху про параллельный порт

Сообщение от jump Посмотреть сообщение
ТС заикнулся о спиральной интерполяции на меге - хочу лицезреть и точка!
Вот тебе кусок реальной программы для меги, который выполняет движение по окружности против часовой стрелки. В нем переменная "theta" как раз и определяет сколько кругов надо сделать.
Цитата:
// ************************************************** ********************************
void arc_CCW(float cx,float cy,float x,float y,float dir)
// ************************************************** ********************************
{


centr_arc_x = carent_Pos_X + cx * step_for_X; // определяем координату "X" центра дуги
centr_arc_y = carent_Pos_Y + cy * step_for_Y; // определяем координату "Y" центра дуги

end_arc_x = x * step_for_X; // определяем координату "X" конца дуги в шагах
end_arc_y = y * step_for_Y; // определяем координату "Y" конца дуги в шагах

delta_X = end_arc_x - centr_arc_x;
delta_Y = end_arc_y - centr_arc_y;

radius = sqrt(cx*cx + cy*cy); // определяем величину радиуса дуги в ММ

step_radius = radius * step_for_X; // определяем величину радиуса дуги в ШАГАХ

step_cx = abs(cx * step_for_X); // определяем длину перемещения по оси (в шагах)
step_cy = abs(cy * step_for_X); // определяем длину дуги (в шагах)//для отладки
step_temp_radius = step_radius; //

// определяем угол начала дуги

angle1 = atan2(cy,cx);
angle1 = PI + angle1;
Set_arc_mode(angle1);
arc_mode_1 = arc_mode_ ;

// определяем угол окончания дуги

angle2 = atan2(delta_Y,delta_X);
if (delta_Y ‹ 0){angle2 = 2*PI + angle2;}
Set_arc_mode(angle2);
arc_mode_2 = arc_mode_ ;

// определяем количество секторов в дуге

theta = angle2 - angle1;
if(theta ‹ 0){theta = 2*PI + theta ;}
Set_arc_mode(theta);
namber_arc_mode = arc_mode_ ;

// определяем количество шагов в дуге
// длина окружности =PI*2.0*radius;
// длина дуги len=theta*circ/(PI*2.0);

len = abs(theta) * step_radius ; // определяем длину дуги (в шагах)
Delta_Move = len ; //

Serial.print(" Delta_Move = "); Serial.println(Delta_Move); //для отладки

motor_enable() ;
max_count_Acceleration = max_count_Acceleration_X ;
INIT_Move_X_Y();

gradus_theta = (180*theta)/PI; //для отладки



if (gradus_theta ‹ 0.9){end_case = true; end_arc = true ;}
else {end_case = false; // сбрасываем флаг окончания сектора
end_arc = false ;} // сбрасываем флаг окончания дуги

ERROR_Pos_X = 0 ;
ERROR_Pos_Y = 0 ;

arc_mode = arc_mode_1 ;

for (int mode=0; mode ‹= namber_arc_mode ; mode++){

do{

switch (arc_mode) {

case 1: //выполняется, если дуга начинается в первом квадранте с начальным углом НЕ больше 45 градусов
digitalWrite( Y_DIR_PIN, HIGH ); digitalWrite( X_DIR_PIN, HIGH ); step_cy = step_cy + 1; carent_Pos_Y = carent_Pos_Y + 1 ;
if (step_temp_radius ›= step_radius) { STOP_MOTOR_X() ; step_cx = step_cx - 1; carent_Pos_X = carent_Pos_X - 1 ; }
if (step_cx ‹= step_cy) {end_case = true; } break;
case 2: //выполняется, если дуга начинается в первом квадранте с начальным углом больше 45 градусов
digitalWrite( Y_DIR_PIN, HIGH ); digitalWrite( X_DIR_PIN, LOW ); step_cx = step_cx - 1; carent_Pos_X = carent_Pos_X - 1 ;
if (step_temp_radius ‹= step_radius) { STOP_MOTOR_X() ; step_cy = step_cy + 1; carent_Pos_Y = carent_Pos_Y + 1 ; }
if (step_cx ‹= 0) {end_case = true; } break;
case 3: //выполняется, если дуга начинается во втором квадранте с начальным углом НЕ больше 135 градусов
digitalWrite( Y_DIR_PIN, HIGH ); digitalWrite( X_DIR_PIN, LOW ); step_cx = step_cx + 1; carent_Pos_X = carent_Pos_X - 1 ;
if (step_temp_radius ›= step_radius) { STOP_MOTOR_Y() ; step_cy = step_cy - 1; carent_Pos_Y = carent_Pos_Y - 1 ; }
if (step_cy ‹= step_cx) {end_case = true; } break;
case 4: //выполняется если дуга начинается во втором квадранте с начальным углом больше 135 градусов
digitalWrite( Y_DIR_PIN, LOW ); digitalWrite( X_DIR_PIN, LOW ); step_cy = step_cy - 1; carent_Pos_Y = carent_Pos_Y - 1 ;
if (step_temp_radius ‹= step_radius) { STOP_MOTOR_Y() ; step_cx = step_cx + 1; carent_Pos_X = carent_Pos_X - 1 ; }
if (step_cy ‹= 0) {end_case = true; } break;
case 5: //выполняется если дуга начинается в третьем квадранте с начальным углом НЕ больше 225 градусов
digitalWrite( Y_DIR_PIN, LOW ); digitalWrite( X_DIR_PIN, LOW ); step_cy = step_cy + 1; carent_Pos_Y = carent_Pos_Y - 1 ;
if (step_temp_radius ›= step_radius) { STOP_MOTOR_X() ; step_cx = step_cx - 1; carent_Pos_X = carent_Pos_X + 1 ; }
if (step_cy ›= step_cx) {end_case = true; } break;
case 6://выполняется если дуга начинается в третьем квадранте с начальным углом больше 225 градусов
digitalWrite( Y_DIR_PIN, LOW ); digitalWrite( X_DIR_PIN, HIGH ); step_cx = step_cx - 1; carent_Pos_X = carent_Pos_X + 1 ;
if (step_temp_radius ‹= step_radius) { STOP_MOTOR_X() ; step_cy = step_cy + 1; carent_Pos_Y = carent_Pos_Y - 1 ; }
if (step_cx ‹= 0) {end_case = true; } break;
case 7: //выполняется если дуга начинается в четвертом квадранте с начальным углом НЕ больше 315 градусов
digitalWrite( Y_DIR_PIN, LOW ); digitalWrite( X_DIR_PIN, HIGH ); step_cx = step_cx + 1; carent_Pos_X = carent_Pos_X + 1 ;
if (step_temp_radius ›= step_radius) { STOP_MOTOR_Y() ; step_cy = step_cy - 1; carent_Pos_Y = carent_Pos_Y + 1 ; }
if (step_cx ›= step_cy) {end_case = true; } break;
case 8: //выполняется если дуга начинается в четвертом квадранте с начальным углом больше 315 градусов
digitalWrite( Y_DIR_PIN, HIGH ); digitalWrite( X_DIR_PIN, HIGH ); step_cy = step_cy - 1; carent_Pos_Y = carent_Pos_Y + 1 ;
if (step_temp_radius ‹= step_radius) { STOP_MOTOR_Y() ; step_cx = step_cx + 1; carent_Pos_X = carent_Pos_X + 1 ; }
if (step_cy ‹= 0) {end_case = true; } break;
}
// ----------------------------------------------------------------------------------------------------
STEP_arc() ;
// ----------------------------------------------------------------------------------------------------
}

while ((end_case == false)&&(end_arc == false)); //

end_case = false ;

if (namber_arc_mode ›= mode ){ //если число пройденых секторов меньше общего числа секторов в дуге, то
arc_mode = arc_mode+1; // увеличиваем номер обрабатываемого сектора
if (arc_mode › 8 ){ arc_mode = 1;} } //устанавливаем номер первого сектора
}
Xa = carent_Pos_X/step_for_X;
Ya = carent_Pos_Y/step_for_Y;

iput_X = x ;//
iput_Y = y ;//
DEBUG();//

}
ALEGYR вне форума