#include #include ////////////////////////////////// // ***** ПАРАМЕТРЫ ЖЕЛЕЗА ***** // #define ENC_LINE_PER_REV 2000 // Кол-во линий энкодера на 1 оборот шпинделя #define MOTOR_Z_STEP_PER_REV 200 // Кол-во шагов на оборот винта Z, продольная #define SCREW_Z 200 // Шаг продольного винта Z в сотках, 2мм #define McSTEP_Z 4 // Микрошаг, ось Z, продольная #define MOTOR_X_STEP_PER_REV 400 // Кол-во шагов на оборот винта X, поперечная #define SCREW_X 125 // Шаг поперечного винта X в сотках, 1.0мм #define REBOUND_X 200 // Отскок резца в микрошагах, для авторезанья, должен быть больше люфта поперечки #define REBOUND_Z 200 // Отскок резца в микрошагах, для авторезанья, должен быть больше люфта продольной #define McSTEP_X 4 // Микрошаг, ось X, поперечная // #define THRD_ACCEL 15 // К.деления с которого будем ускоряться на Резьбах, Accel+Ks должен быть < 255 #define FEED_ACCEL 100 //100 // Жесткость разгона на подачах, бОльше значение - короче разгон. // #define MIN_FEED 1 // Желаемая минимальная подача в сотках/оборот, 0.02мм/об #define MAX_FEED 30 // Желаемая максимальная подача в сотках/оборот, 0.25мм/об #define MIN_aFEED 10 //20 // Желаемая минимальная подача в mm/минуту, 20мм/мин #define MAX_aFEED 160 //120 //500 // Желаемая максимальная подача в mm/минуту, 400мм/мин // Ускоренные перемещения #define MAX_RAPID_MOTION_Z 27 // Меньше - бОльшая конечная скорость //16000000/32/((25+1)*2)/800*60=721rpm #define MAX_RAPID_MOTION_X 20 //35 // Меньше - бОльшая конечная скорость //16000000/32/((75+1)*2)/800*60=~246rpm #define MIN_RAPID_MOTION (MAX_RAPID_MOTION_Z + 100) // Больше - мЕньшая начальная скорость, max 255 //16000000/32/((150+25+1)*2)/800*60=107rpm !!!!ВЛИЯЕТ на минимальное расстояние между упорами #define REPEAt (McSTEP_Z * 1) // Кол-во повторов для постоянной скорости в пределах полного шага // Длительность разгона = 150/2*REPEAT(4)/Microstep(4) = 75 полных шагов цикл ускорения // Ручной энкодер (100 линий) #define HC_SCALE_1 1 // 1-e положение, масштаб = 1сотка/тик = 1мм/оборот #define HC_SCALE_10 10 // 2-e положение, масштаб = 10соток/тик = 10мм/оборот #define HC_START_SPEED_1 500 //250 // старт РГИ, 250000/(250+1)/800*60/2 = 37rpm #define HC_MAX_SPEED_1 300 //150 // максимум скорости РГИ, 250000/(150+1)/800*60/2 = 62rpm #define HC_START_SPEED_10 150 // старт РГИ, 250000/(150+1)/800*60/2 = 62rpm #define HC_MAX_SPEED_10 35 // максимум скорости РГИ, 250000/(23+1)/800*60/2 = 391rpm #define HC_X_DIR 1 // 1-поперечка по часовой, 0-против #define PP_X 1 // поперечная подача на радиус/диаметр (1-на диаметр , 0-на радиус) #define PASS_FINISH 3 // для режима "Резьба": Количество чистовых проходов, после автоцикла, по умолчанию ////////////////////////////////////////////////////////////////////////////////////////////////// #define a (uint32_t)(ENC_LINE_PER_REV / ((float)MOTOR_Z_STEP_PER_REV * McSTEP_Z * MIN_FEED / SCREW_Z) /2 +0.5) static_assert(a <= 255, "Неверно задано значение MIN_FEED"); #define b (uint32_t)(ENC_LINE_PER_REV / ((float)MOTOR_Z_STEP_PER_REV * McSTEP_Z * MAX_FEED / SCREW_Z) /2 + 0.5) static_assert(b > 1, "Неверно задано значение MAX_FEED"); #define c 250000 / ((uint32_t)MIN_aFEED * MOTOR_Z_STEP_PER_REV * McSTEP_Z / ((uint32_t)60 * SCREW_Z / 100) * 2) -1 static_assert(c <= 65535, "Неверно задано значение MIN_aFEED"); #define d 250000 / ((uint32_t)MAX_aFEED * MOTOR_Z_STEP_PER_REV * McSTEP_Z / ((uint32_t)60 * SCREW_Z / 100) * 2) -1 static_assert(d > 1, "Неверно задано значение MAX_aFEED"); #define e (uint32_t)(ENC_LINE_PER_REV / ((float)MOTOR_X_STEP_PER_REV * McSTEP_X * MIN_FEED / SCREW_X) /2 +0.5) static_assert(e <= 255, "Неверно задано значение MIN_FEED"); #define f (uint32_t)(ENC_LINE_PER_REV / ((float)MOTOR_X_STEP_PER_REV * McSTEP_X * MAX_FEED / SCREW_X) /2 + 0.5) static_assert(f > 1, "Неверно задано значение MAX_FEED"); #define g 250000 / ((uint32_t)MIN_aFEED * MOTOR_X_STEP_PER_REV * McSTEP_X / ((uint32_t)60 * SCREW_X / 100) * 2) -1 static_assert(g <= 65535, "Неверно задано значение MIN_aFEED"); #define h 250000 / ((uint32_t)MAX_aFEED * MOTOR_X_STEP_PER_REV * McSTEP_X / ((uint32_t)60 * SCREW_X / 100) * 2) -1 static_assert(h > 1, "Неверно задано значение MAX_aFEED"); ////////////////////////////////////////////////////////// #include "Formula.h" volatile long Rev_Count; volatile long Rev_Count_F; // ***** MY CONSTANT ***** #define CW 0 #define CCW 1 #define ON 1 #define OFF 0 // ***** LCD ***** #include LiquidCrystal lcd(8, 9, 10, 11, 12, 13); char LCD_Row_1[21]; char LCD_Row_2[21]; char LCD_Row_3[21]; char LCD_Row_4[21]; byte strelka_vlevo[8] = { 0b00000, 0b00000, 0b00100, 0b01000, 0b11111, 0b01000, 0b00100, 0b00000, }; byte strelka_vpravo[8] = { 0b00100, 0b00010, 0b11111, 0b00010, 0b00100, 0b00000, 0b00000, 0b00000, }; byte strelka_vverh[8] = { 0b00100, 0b01110, 0b10101, 0b00100, 0b00100, 0b00000, 0b00000, 0b00000, }; byte strelka_vniz[8] = { 0b00000, 0b00000, 0b00100, 0b00100, 0b10101, 0b01110, 0b00100, 0b00000, }; byte znak_diametr[8] = { 0b00001, 0b01110, 0b10011, 0b10101, 0b11001, 0b01110, 0b10000, 0b00000 }; byte znak_gradus[8] = { 0b01100, 0b10010, 0b10010, 0b01100, 0b00000, 0b00000, 0b00000, 0b00000 }; #define Beeper_Init() DDRH = B01100010;\ PORTH = B10011101 // LCD-H5,H6 Buzzer-PH1_Pin16 #define Beeper_On() PORTH &= ~(1<<1) // Pin16 0 #define Beeper_Off() PORTH |= (1<<1) // Pin16 1 // ***** Stepper Motor ***** #define Motor_Init() DDRL = B11111011;\ PORTL = B0000100 #define Motor_Z_SetPulse() PORTL &= ~(1<<0) // Pin49 0 #define Motor_Z_RemovePulse() PORTL |= (1<<0) // Pin49 1 #define Motor_Z_InvertPulse() PORTL ^= (1<<0) // Pin49 #define Read_Z_State (PINL & (1<<0)) #define Motor_X_SetPulse() PORTL &= ~(1<<1) // Pin48 0 #define Motor_X_RemovePulse() PORTL |= (1<<1) // Pin48 1 #define Motor_X_InvertPulse() PORTL ^= (1<<1) // Pin48 #define Read_X_State (PINL & (1<<1)) #define Motor_Z_CW() PORTL &= ~(1<<6) // Pin43 0 #define Motor_Z_CCW() PORTL |= (1<<6) // Pin43 1 #define Motor_X_CW() PORTL &= ~(1<<5) // Pin44 0 #define Motor_X_CCW() PORTL |= (1<<5) // Pin44 1 #define Motor_Z_Enable() do {PORTL |= (1<<4); _delay_ms(250);} while(0) // Pin45 1 попробуйте задержку увеличить: _delay_ms(120); до 500, может тупо драйвер Ena не успевает отрабатывать #define Motor_Z_Disable() {PORTL &= ~(1<<4); _delay_ms(100);} // Pin45 0 #define Read_Z_Ena_State (PINL & (1<<4)) #define Motor_X_Enable() do {PORTL |= (1<<3); _delay_ms(120);} while(0) // Pin46 1 попробуйте задержку увеличить: _delay_ms(120); до 500, может тупо драйвер Ena не успевает отрабатывать #define Motor_X_Disable() {PORTL &= ~(1<<3); _delay_ms(100);} // Pin46 0 #define Read_X_Ena_State (PINL & (1<<3)) // ***** Encoder ***** #define ENC_TICK (ENC_LINE_PER_REV * 2) // Рабочее кол-во импульсов #define Encoder_Init() DDRD = B00000000;\ PORTD = B11111111 // подтяжка PIN_21, 20, 19, 18 #define Enc_Read (PIND & (1<<1)) #define Enc_Ch_A (PIND & (1<<0)) #define Enc_Ch_B (PIND & (1<<1)) // ***** Hand_Coder ***** // Z/X: Input-E4,E5, подтяжка-E4,E5, X1/X10: Input-J0,J1, подтяжка-J0,J1. #define Hand_Init() DDRE = B00000000;\ PORTE = B11111111;\ DDRJ = B00000000;\ PORTJ = B11111111 #define Hand_Ch_A (PIND & (1<<2)) #define Hand_Ch_B (PIND & (1<<3)) #define Hand_Axis_Read (PINE & B00110000) // E4,E5 byte Hand_Axis_Old = 0; #define Hand_Scale_Read (PINJ & B00000011) // J0,J1 byte Hand_Scale_Old = 0; //***** Limit Buttons & LEDs ***** #define Limit_Init() DDRA = B10101010;\ PORTA = B01010101 // IN-A0,A2,A4,A6, OUT-A1,A3,A5,A7, подтяжка #define Limit_Buttons_Read (PINA & B01010101) // PA0 Pin22, PA2 Pin24, PA4 Pin26, PA6 Pin28. byte Limit_Button_Old = 0; #define Limit_Rear_LED_On() PORTA &= ~(1<<1) // PA1, Pin23 0 #define Limit_Rear_LED_Off() PORTA |= (1<<1) // PA1, Pin23 1 #define Limit_Front_LED_On() PORTA &= ~(1<<3) // PA3, Pin25 0 #define Limit_Front_LED_Off() PORTA |= (1<<3) // PA3, Pin25 1 #define Limit_Right_LED_On() PORTA &= ~(1<<5) // PA5, Pin27 0 #define Limit_Right_LED_Off() PORTA |= (1<<5) // PA5, Pin27 1 #define Limit_Left_LED_On() PORTA &= ~(1<<7) // PA7, Pin29 0 #define Limit_Left_LED_Off() PORTA |= (1<<7) // PA7, Pin29 1 #define Limit_Pos_Max 1073741824 #define Limit_Pos_Min -1073741824 ////////////////// #define Menu_Buttons_Init() DDRF = B00000000;\ PORTF = B11111111; #define Buttons_Read (PINF & B00001111) // Pin_A0 PF0, Pin_A1 PF1, Pin_A2 PF2, Pin_A3 PF3, Pin_A4 PF4. byte Button_Old = 0; #define Button_Sel_Read (PINF & B00010000) // Pin_A4 PF4 byte Button_Sel_Old = 0; bool key_sel_flag = false; ////////////////// #define Joy_Init() DDRK = B00000000;\ PORTK = B11111111; // подтяжка PIN_A8, A9, A10, A11, A12 // Submode Sw: A13, A14, A15 #define Joy_Read (PINK & B00001111) // PK0 PK1 PK2 PK3 #define Button_Rapid (PINK & B00010000) // PK4 byte Joy_Old = 0; //////////////////// #define Submode_Read (PINK & B11100000) // PK5 PK6 PK7 byte Submode_Old = 0; // ***** Mode ***** #define Mode_Switch_Init() DDRC = B00000000;\ PORTC = B11111111; // подтяжка PORT_A, ОБЯЗАТЕЛЬНА! внешняя подтяжка к +5 через 1К резисторы #define Mode_Read (PINC & B11111111) byte Mode_Old = 0; enum Mode { Mode_Thread = 1, Mode_Feed, Mode_aFeed, Mode_Cone_L, Mode_Cone_R, Mode_Reserve, Mode_Sphere, Mode_Divider }; enum Sub_Mode_Thread { Sub_Mode_Thread_Int = 1, Sub_Mode_Thread_Man, Sub_Mode_Thread_Ext, }; enum Sub_Mode_Feed { Sub_Mode_Feed_Int = 1, Sub_Mode_Feed_Man, Sub_Mode_Feed_Ext, }; enum Sub_Mode_aFeed { Sub_Mode_aFeed_Int = 1, Sub_Mode_aFeed_Man, Sub_Mode_aFeed_Ext, }; enum Sub_Mode_Cone { Sub_Mode_Cone_Int = 1, Sub_Mode_Cone_Man, Sub_Mode_Cone_Ext, }; enum Sub_Mode_Sphere { Sub_Mode_Sphere_Int = 1, Sub_Mode_Sphere_Man, Sub_Mode_Sphere_Ext, }; //***** Ускоренное перемещение ***** #define Timer2_Init() TCCR2A = (1<bit0 // CW-0, CCW-1 #define Motor_Z_Dir ((volatile FLAG*)_SFR_MEM_ADDR(GPIOR0))->bit1 // CW-0, CCW-1 #define Joy_Z_flag ((volatile FLAG*)_SFR_MEM_ADDR(GPIOR0))->bit2 // On-1, Off-0 #define Step_Z_flag ((volatile FLAG*)_SFR_MEM_ADDR(GPIOR0))->bit3 // On-1, Off-0 #define Motor_X_Dir ((volatile FLAG*)_SFR_MEM_ADDR(GPIOR0))->bit4 // CW-0, CCW-1 #define Joy_X_flag ((volatile FLAG*)_SFR_MEM_ADDR(GPIOR0))->bit5 // On-1, Off-0 #define Step_X_flag ((volatile FLAG*)_SFR_MEM_ADDR(GPIOR0))->bit6 // On-1, Off-0 #define Cone_flag ((volatile FLAG*)_SFR_MEM_ADDR(GPIOR0))->bit7 // On-1, Off-0 bool spindle_flag = OFF; bool feed_Z_flag = OFF; bool feed_X_flag = OFF; bool rapid_step_Z_flag = OFF; bool rapid_step_X_flag = OFF; bool rapid_Z_flag = OFF; bool rapid_X_flag = OFF; bool limit_Left_flag = OFF; bool limit_Right_flag = OFF; bool limit_Front_flag = OFF; bool limit_Rear_flag = OFF; bool limit_button_flag = OFF; bool button_up_flag = OFF; bool button_down_flag = OFF; bool button_left_flag = OFF; bool button_right_flag = OFF; bool a_flag = false; bool b_flag = false; bool c_flag = false; bool d_flag = false; bool cycle_flag = false; bool err_1_flag = false; bool err_2_flag = false; bool Complete_flag = false; bool hand_X = OFF; bool hand_Z = OFF; bool flag_hand_X = OFF; bool flag_hand_Z = OFF; bool X_flag = OFF; // временный bool Z_flag = OFF; // временный bool flag_Scale_x1 = OFF; // возможно только для отладки bool flag_Scale_x10 = OFF; // возможно только для отладки bool control_flag = OFF; bool flag_j = OFF; // ***** MY VARIABLES ***** int Tacho_Count = 0; int Tacho_Count_Old =0; int Spindle_Count = 0; long Motor_Z_Pos = 0; long Motor_X_Pos = 0; int pin = 20; float duration = 0; unsigned long Timeout = 36000; byte KeyCycle = 0; int q = 0; int w = 0; int Pass_Fin = 0; int Thr_Pass_Summ = 0; int SelectMenu = 0; float Infeed_ValueX = 0; float Infeed_ValueZ = 0; long Size_X = 0; long Size_Z = 0; long X_pos = 0; long Z_pos = 0; int Enc_Pos = 0; volatile long Hand_Count = 0; long Hand_Count_Old = 0; long Hand_Count_New = 0; long Hand_Z_Pos = 0; long Hand_X_Pos = 0; byte Scale = HC_SCALE_1; byte Ks_Count = 0; int Km_Count = 0; byte Ks_Divisor = 0; byte tmp_Ks_Divisor = THRD_ACCEL; int Km_Divisor = 0; uint16_t Feed_Divisor = 0; uint16_t aFeed_Divisor = 0; byte Cs_Count = 0; int Cm_Count = 0; byte Cs_Divisor = 0; int Cm_Divisor = 0; byte tmp_Accel = THRD_ACCEL; byte Repeat_Count = 0; int Brake_Compens = 0; byte Mode = Mode_Feed; byte Sub_Mode_Thread = Sub_Mode_Thread_Man; byte Sub_Mode_Feed = Sub_Mode_Feed_Man; byte Sub_Mode_aFeed = Sub_Mode_aFeed_Man; byte Sub_Mode_Cone = Sub_Mode_Cone_Man; byte Sub_Mode_Sphere = Sub_Mode_Sphere_Man; byte Thread_Step = 11; byte Cone_Step = 33; long Limit_Pos_Left = Limit_Pos_Max; long Limit_Pos_Right = Limit_Pos_Min; long Limit_Pos_Front = Limit_Pos_Max; long Limit_Pos_Rear = Limit_Pos_Min; volatile long Limit_Pos = 0; volatile long Limit_Pos_HC = 0; uint16_t Feed_mm = 0; uint16_t aFeed_mm = 0; uint16_t Start_Speed = ENC_LINE_PER_REV / ((uint32_t)MOTOR_Z_STEP_PER_REV * McSTEP_Z * MIN_FEED / SCREW_Z) /FEED_ACCEL; uint16_t max_OCR5A = ENC_LINE_PER_REV / ((uint32_t)MOTOR_Z_STEP_PER_REV * McSTEP_Z * MIN_FEED / SCREW_Z) /FEED_ACCEL; // Начальная скорость подачи при разгоне/торможении uint16_t max_OCR4A = (250000 / ((uint32_t)MIN_aFEED * MOTOR_Z_STEP_PER_REV * McSTEP_Z / ((uint32_t)60 * SCREW_Z / 100) * 2) - 1) /FEED_ACCEL; byte Total_Tooth = 1; byte Current_Tooth = 1; //byte Pass_Total = 1; uint16_t Pass_Total = 1; //byte Pass_Nr = 1; заменил на int Pass_Nr = 1; добавил ниже строку //int Pass_Nr = 1; uint16_t Pass_Nr = 1; long Null_X_Pos = 0; long Null_Z_Pos = 0; int Ap = 0; int ADC_Feed = 0; long Sum_ADC = 0; int ADC_Array[16]; byte x = 0; long Control_Count = 0; // Sphere const int Cutter_Width_array[] = {100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300}; #define TOTAL_CUTTER_WIDTH (sizeof(Cutter_Width_array) / sizeof(Cutter_Width_array[0])) byte Cutter_Step = 5; int Cutter_Width = Cutter_Width_array[Cutter_Step]; const int Cutting_Width_array[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; #define TOTAL_CUTTING_STEP (sizeof(Cutting_Width_array) / sizeof(Cutting_Width_array[0])) byte Cutting_Step = 4; int Cutting_Width = Cutting_Width_array[Cutting_Step]; long Sph_R_mm = 1000; long Sph_R = 0; long R_Quad = Sph_R_mm * Sph_R_mm; long Bar_R_mm = 0; long Bar_R = 0; #define KEYB_TIMER_FLAG (TIFR1 & (1< Limit_Pos) || (Motor_Z_Dir == CCW && Motor_Z_Pos < Limit_Pos) || (!Joy_Z_flag) ) { if (tmp_Ks_Divisor < tmp_Accel) { Ks_Count++; if (Ks_Count > tmp_Ks_Divisor) { Motor_Z_SetPulse(); if (Motor_Z_Dir == CW) {Motor_Z_Pos ++;} else {Motor_Z_Pos --;} Ks_Count = 0; if (++Repeat_Count == REPEAt) { Repeat_Count = 0; tmp_Ks_Divisor ++; } } } else {Step_Z_flag = OFF;} } else { Ks_Count++; if (Ks_Count > tmp_Ks_Divisor) { Motor_Z_SetPulse(); if (Motor_Z_Dir == CW) {Motor_Z_Pos ++;} else {Motor_Z_Pos --;} if (tmp_Ks_Divisor > Ks_Divisor) { Ks_Count = 0; if (++Repeat_Count == REPEAt) { Repeat_Count = 0; tmp_Ks_Divisor --; } } else { Km_Count = Km_Count + Km_Divisor; if (Km_Count > Km_Divisor) { Km_Count = Km_Count - 10000; Ks_Count = 0; } else {Ks_Count = 1;} } } } } if (Step_X_flag == ON) { Motor_X_RemovePulse(); if ( (Motor_X_Dir == CW && Motor_X_Pos > Limit_Pos) || (Motor_X_Dir == CCW && Motor_X_Pos < Limit_Pos) || (!Joy_X_flag) ) { if (tmp_Ks_Divisor < tmp_Accel) { Ks_Count++; if (Ks_Count > tmp_Ks_Divisor) { Motor_X_SetPulse(); if (Motor_X_Dir == CW) {Motor_X_Pos ++;} else {Motor_X_Pos --;} Ks_Count = 0; if (++Repeat_Count == REPEAt) { Repeat_Count = 0; tmp_Ks_Divisor ++; } } } else {Step_X_flag = OFF;} } else { Ks_Count++; if (Ks_Count > tmp_Ks_Divisor) { Motor_X_SetPulse(); if (Motor_X_Dir == CW) {Motor_X_Pos ++;} else {Motor_X_Pos --;} if (tmp_Ks_Divisor > Ks_Divisor) { Ks_Count = 0; if (++Repeat_Count == REPEAt) { Repeat_Count = 0; tmp_Ks_Divisor --; } } else { Km_Count = Km_Count + Km_Divisor; if (Km_Count > Km_Divisor) { Km_Count = Km_Count - 10000; Ks_Count = 0; } else {Ks_Count = 1;} } } } } } ISR(INT1_vect) { // } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ***** Tacho ***** //////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ISR (TIMER0_COMPB_vect) // Тахометр { // } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ***** Feed & Cone ***** ////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ISR (TIMER5_COMPA_vect) { if (!Enc_Ch_A) { if (!Enc_Ch_B) { Spindle_Dir = CW; if (++Enc_Pos == ENC_TICK) { Enc_Pos = 0; Rev_Count_F++; if (Joy_Z_flag == ON) {Step_Z_flag = ON;} else if (Joy_X_flag == ON) {Step_X_flag = ON;} } } else { Spindle_Dir = CCW; if (--Enc_Pos < 0) { Enc_Pos = ENC_TICK - 1; Rev_Count_F--; if (Joy_Z_flag == ON) {Step_Z_flag = ON;} else if (Joy_X_flag == ON) {Step_X_flag = ON;} } } } else { if (!Enc_Ch_B) { Spindle_Dir = CCW; if (--Enc_Pos < 0) { Enc_Pos = ENC_TICK - 1; Rev_Count_F--; if (Joy_Z_flag == ON) {Step_Z_flag = ON;} else if (Joy_X_flag == ON) {Step_X_flag = ON;} } } else { Spindle_Dir = CW; if (++Enc_Pos == ENC_TICK) { Enc_Pos = 0; Rev_Count_F++; if (Joy_Z_flag == ON) {Step_Z_flag = ON;} else if (Joy_X_flag == ON) {Step_X_flag = ON;} } } } if (Joy_Z_flag == ON) {Motor_X_RemovePulse();} Tacho_Count = Tacho_Count + (OCR5A+1); if (Tacho_Count > ENC_LINE_PER_REV) { if (Spindle_Dir == CW) {Rev_Count_F++;} else if (Spindle_Dir == CCW) {Rev_Count_F--;} Tacho_Count = Tacho_Count - ENC_LINE_PER_REV; } if ( (Motor_Z_Dir == CW && Motor_Z_Pos > Limit_Pos) || (Motor_Z_Dir == CCW && Motor_Z_Pos < Limit_Pos) || (!feed_Z_flag) ) { if (OCR5A < max_OCR5A) { Motor_Z_InvertPulse(); if (!Read_Z_State) { OCR5A++; if (Motor_Z_Dir == CW) {Motor_Z_Pos ++;} else {Motor_Z_Pos --;} } } else { Step_Z_flag = OFF; Step_X_flag = OFF; } } else { Step_Z_flag = ON; Motor_Z_InvertPulse(); if (!Read_Z_State) { if (Motor_Z_Dir == CW) {Motor_Z_Pos ++;} else {Motor_Z_Pos --;} if (OCR5A > Feed_Divisor) {OCR5A--;} else if (OCR5A < Feed_Divisor) {OCR5A ++;} } } if (Step_X_flag == ON) { if (++Cs_Count > Cs_Divisor) { Motor_X_SetPulse(); if (Motor_X_Dir == CW) {Motor_X_Pos ++;} else {Motor_X_Pos --;} Cm_Count = Cm_Count + Cm_Divisor; if (Cm_Count > Cm_Divisor) { Cm_Count = Cm_Count - 10000; Cs_Count = 0; } else {Cs_Count = 1;} } } } //////////////////////////////////////////////////////////// ISR (TIMER5_COMPB_vect) { Tacho_Count = Tacho_Count + (OCR5A+1); if (Tacho_Count > ENC_LINE_PER_REV) { if (Spindle_Dir == CW) {Rev_Count_F++;} else if (Spindle_Dir == CCW) {Rev_Count_F--;} Tacho_Count = Tacho_Count - ENC_LINE_PER_REV; } if ( (Motor_X_Dir == CW && Motor_X_Pos > Limit_Pos) || (Motor_X_Dir == CCW && Motor_X_Pos < Limit_Pos) || (!feed_X_flag) ) { if (OCR5A < max_OCR5A) { Motor_X_InvertPulse(); if (!Read_X_State) { OCR5A++; if (Motor_X_Dir == CW) {Motor_X_Pos ++;} else {Motor_X_Pos --;} } } else {Step_X_flag = OFF;} } else { Step_X_flag = ON; Motor_X_InvertPulse(); { if (!Read_X_State) { if (Motor_X_Dir == CW) {Motor_X_Pos ++;} else {Motor_X_Pos --;} if (OCR5A > Feed_Divisor) {OCR5A--;} else if (OCR5A < Feed_Divisor) {OCR5A ++;} } } } ///////////////////////////////////////////////////////// if (Mode == Mode_Sphere) // Режим Сфера { } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ***** Rapid Feed & Rapid Cone ***** /////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ISR (TIMER2_COMPA_vect) { Motor_X_RemovePulse(); if ( (Motor_Z_Dir == CW && Motor_Z_Pos > Limit_Pos) || (Motor_Z_Dir == CCW && Motor_Z_Pos < Limit_Pos) || (!rapid_Z_flag) ) { if (OCR2A < MIN_RAPID_MOTION) { Motor_Z_InvertPulse(); if (!Read_Z_State) { if (Motor_Z_Dir == CW) { Motor_Z_Pos ++;} else { Motor_Z_Pos --;} if (++Repeat_Count == REPEAt) { Repeat_Count = 0; OCR2A ++; } } } else { rapid_step_Z_flag = OFF; Step_X_flag = OFF; } } else { rapid_step_Z_flag = ON; Motor_Z_InvertPulse(); if (!Read_Z_State) { if (Motor_Z_Dir == CW) { Motor_Z_Pos ++;} else { Motor_Z_Pos --;} if (OCR2A > MAX_RAPID_MOTION_Z) { if (++Repeat_Count == REPEAt) { Repeat_Count = 0; OCR2A --; } } } } /////////////////////////////////////////////////////// if (Step_X_flag == ON) { if (++Cs_Count > Cs_Divisor) { Motor_X_SetPulse(); if (Motor_X_Dir == CW) { Motor_X_Pos ++;} else { Motor_X_Pos --;} Cm_Count = Cm_Count + Cm_Divisor; if (Cm_Count > Cm_Divisor) { Cm_Count = Cm_Count - 10000; Cs_Count = 0; } else {Cs_Count = 1;} } } } ////////////////////////////////////////////////////////// ISR (TIMER2_COMPB_vect) { if ( (Motor_X_Dir == CW && Motor_X_Pos > Limit_Pos) || (Motor_X_Dir == CCW && Motor_X_Pos < Limit_Pos) || (!rapid_X_flag) ) { if (OCR2A < MIN_RAPID_MOTION) { Motor_X_InvertPulse(); if (!Read_X_State) { if (Motor_X_Dir == CW) { Motor_X_Pos ++;} else { Motor_X_Pos --;} if (++Repeat_Count == REPEAt) { Repeat_Count = 0; OCR2A ++; } } } else {rapid_step_X_flag = OFF;} } else { rapid_step_X_flag = ON; Motor_X_InvertPulse(); if (!Read_X_State) { if (Motor_X_Dir == CW) { Motor_X_Pos ++;} else { Motor_X_Pos --;} if (OCR2A > MAX_RAPID_MOTION_X) { if (++Repeat_Count == REPEAt) { Repeat_Count = 0; OCR2A --; } } } } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ***** Asynchron Feed ***** //////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ISR (TIMER4_COMPA_vect) { /* if (Joy_Z_flag == ON) {Motor_X_RemovePulse();} Tacho_Count = Tacho_Count + (OCR5A+1); if (Tacho_Count > ENC_LINE_PER_REV) { Tacho_Count = Tacho_Count - ENC_LINE_PER_REV; }*/ if ( (Motor_Z_Dir == CW && Motor_Z_Pos > Limit_Pos) || (Motor_Z_Dir == CCW && Motor_Z_Pos < Limit_Pos) || (!feed_Z_flag) ) { if (OCR4A < max_OCR4A) { Motor_Z_InvertPulse(); if (!Read_Z_State) { OCR4A ++; if (Motor_Z_Dir == CW) {Motor_Z_Pos ++;} else {Motor_Z_Pos --;} } } else { Step_Z_flag = OFF; Step_X_flag = OFF; } } else { Step_Z_flag = ON; Motor_Z_InvertPulse(); if (!Read_Z_State) { if (Motor_Z_Dir == CW) {Motor_Z_Pos ++;} else {Motor_Z_Pos --;} if (OCR4A > aFeed_Divisor) {OCR4A --;} else if (OCR4A < aFeed_Divisor) {OCR4A ++;} } } } ////////////////////////////////////////////////////////// ISR (TIMER4_COMPB_vect) { if ( (Motor_X_Dir == CW && Motor_X_Pos > Limit_Pos) || (Motor_X_Dir == CCW && Motor_X_Pos < Limit_Pos) || (!feed_X_flag) ) { if (OCR4A < max_OCR4A) { Motor_X_InvertPulse(); if (!Read_X_State) { OCR4A ++; if (Motor_X_Dir == CW) {Motor_X_Pos ++;} else {Motor_X_Pos --;} } } else { Step_Z_flag = OFF; Step_X_flag = OFF; } } else { Step_X_flag = ON; Motor_X_InvertPulse(); if (!Read_X_State) { if (Motor_X_Dir == CW) {Motor_X_Pos ++;} else {Motor_X_Pos --;} if (OCR4A > aFeed_Divisor) {OCR4A --;} else if (OCR4A < aFeed_Divisor) {OCR4A ++;} } } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // ***** HandCoder ***** ///////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ISR(INT2_vect) { if (!Hand_Ch_A) { if (!Hand_Ch_B) {Hand_Count --;} } else { if (!Hand_Ch_B) {Hand_Count ++;} } } ///////////////////////////////////////////// ISR (TIMER3_COMPA_vect) { if (Motor_Z_Dir == CW) { if (Motor_Z_Pos < Null_Z_Pos + Hand_Z_Pos) { Motor_Z_InvertPulse(); if (!Read_Z_State) { Motor_Z_Pos ++; if ((Motor_Z_Pos > Limit_Pos_HC) || (hand_Z == OFF)) { if (OCR3A < max_OCR3A) OCR3A ++; } else if (Motor_Z_Pos < Limit_Pos_HC) { if (OCR3A > min_OCR3A) OCR3A --; } } } else if (Motor_Z_Pos == Hand_Z_Pos) { // } } else if (Motor_Z_Dir == CCW) { if (Motor_Z_Pos > Null_Z_Pos + Hand_Z_Pos) { Motor_Z_InvertPulse(); if (!Read_Z_State) { Motor_Z_Pos --; if (Motor_Z_Pos < Limit_Pos_HC || hand_Z == OFF) { if (OCR3A < max_OCR3A) OCR3A ++; } else if (Motor_Z_Pos > Limit_Pos_HC) { if (OCR3A > min_OCR3A) OCR3A --; } } } else if (Motor_Z_Pos == Hand_Z_Pos) { // } } } ////////////////////////////////////////////////////////// ISR (TIMER3_COMPB_vect) { if (Motor_X_Dir == CW) { if (Motor_X_Pos < Null_X_Pos + Hand_X_Pos) { Motor_X_InvertPulse(); if (!Read_X_State) { Motor_X_Pos ++; if ((Motor_X_Pos > Limit_Pos_HC) || (hand_X == OFF)) { if (OCR3A < max_OCR3A) OCR3A ++; } else if (Motor_X_Pos < Limit_Pos_HC) { if (OCR3A > min_OCR3A) OCR3A --; } } } else if (Motor_X_Pos == Hand_X_Pos) { // } } else if (Motor_X_Dir == CCW) { if (Motor_X_Pos > Null_X_Pos + Hand_X_Pos) { Motor_X_InvertPulse(); if (!Read_X_State) { Motor_X_Pos --; if ((Motor_X_Pos < Limit_Pos_HC) || (hand_X == OFF)) { if (OCR3A < max_OCR3A) OCR3A ++; } else if (Motor_X_Pos > Limit_Pos_HC) { if (OCR3A > min_OCR3A) OCR3A --; } } } else if (Motor_X_Pos == Hand_X_Pos) { // } } } // ***** End ***** ///////////////////////////////////////////////////