Created
June 8, 2022 23:28
-
-
Save bhvictor/e3024ea78c232ace8bd7e0455fb372f2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <avr/pgmspace.h> | |
#include <util/delay.h> | |
// Hardware params | |
// Each time you change these, Cone_Info and Thread_Info tables below must be re-calculated | |
#define ENC_LINE_PER_REV 600 // Encoder lines per 1 spindle turn | |
#define MOTOR_Z_STEP_PER_REV 200 // Z motor steps (leadscrew) - almost always 200, microsteps configured below | |
#define SCREW_Z 150 // Z (leadscrew) pitch, in hundreds of a mm | |
#define McSTEP_Z 4 // Z driver microsteps (400 steps = 2, 800 steps = 4, etc) | |
#define Z_INVERT // Comment this line if Z motor is connected directly to the lead screw, uncomment if via belt | |
#define Z_ENA_INVERT // Comment/uncomment this line if Z motor is getting disabled when it should be enabled | |
#define MOTOR_X_STEP_PER_REV 200 // X motor steps (cross-slide) - almost always 200, microsteps configured below | |
#define SCREW_X 100 // X (cross-slide) pitch, in hundreds of a mm | |
#define REBOUND_X 200 // X backlash in microsteps | |
#define REBOUND_Z 200 // Z backlash in microsteps | |
#define McSTEP_X 2 // Z driver microsteps (400 steps = 2, 800 steps = 4, etc) | |
// | |
#define THRD_ACCEL 25 // К.деления с которого будем ускоряться на Резьбах, Accel+Ks должен быть < 255 | |
#define FEED_ACCEL 3 // Жесткость разгона на подачах, бОльше значение - короче разгон. | |
// | |
#define MIN_FEED 2 // Min feed in 0.01mm. 2 = 0.02mm | |
#define MAX_FEED 20 // Max feed in 0.01mm. 20 = 0.20mm | |
#define MIN_aFEED 20 // Min feed in mm/min. 20 = 20mm/min | |
#define MAX_aFEED 400 // Max feed in mm/min. 400 = 400mm/min | |
// Rapid feed | |
#define MAX_RAPID_MOTION 25 // Smaller - faster //16000000/32/((25+1)*2)/800*60=721rpm | |
#define MIN_RAPID_MOTION (MAX_RAPID_MOTION + 150) // Bigger - slower, max 255 //16000000/32/((150+25+1)*2)/800*60=107rpm | |
#define REPEAt (McSTEP_Z * 1) // Repeats for full speed within one step | |
// Acceleration duration = 150/2*REPEAT(4)/Microstep(4) = 75 full steps for acceleration | |
// Manual pulse generator (100 lines) | |
#define HC_SCALE_1 1 // 1-e положение, масштаб = 1сотка/тик = 1мм/оборот | |
#define HC_SCALE_10 10 // 2-e положение, масштаб = 10соток/тик = 10мм/оборот | |
#define HC_START_SPEED_1 250 // старт РГИ, 250000/(250+1)/800*60/2 = 37rpm | |
#define HC_MAX_SPEED_1 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 23 // максимум скорости РГИ, 250000/(23+1)/800*60/2 = 391rpm | |
#define HC_X_DIR 0 // 1-CW, 0-CCW | |
#define HC_Z_DIR 1 // 1-CW, 0-CCW | |
////////////////////////////////////////////////////////////////////////////////////////////////// | |
#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"); | |
////////////////////////////////////////////////////////// | |
// ***** MY CONSTANT ***** | |
#define CW 0 | |
#define CCW 1 | |
#ifdef Z_INVERT | |
#define ZCW 1 | |
#define ZCCW 0 | |
#else | |
#define ZCW 0 | |
#define ZCCW 1 | |
#endif | |
#define ON 1 | |
#define OFF 0 | |
// ***** LCD ***** | |
#include <LiquidCrystal.h> | |
LiquidCrystal lcd(8, 9, 10, 11, 12, 13); | |
char LCD_Row_1[17]; | |
char LCD_Row_2[17]; | |
#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)) | |
#ifdef Z_INVERT | |
#define Motor_Z_CCW() PORTL &= ~(1<<6) // Pin43 0 | |
#define Motor_Z_CW() PORTL |= (1<<6) // Pin43 1 | |
#else | |
#define Motor_Z_CW() PORTL &= ~(1<<6) // Pin43 0 | |
#define Motor_Z_CCW() PORTL |= (1<<6) // Pin43 1 | |
#endif | |
#define Motor_X_CW() PORTL &= ~(1<<5) // Pin44 0 | |
#define Motor_X_CCW() PORTL |= (1<<5) // Pin44 1 | |
#ifdef Z_ENA_INVERT | |
#define Motor_Z_Enable() do {PORTL &= ~(1<<4); _delay_ms(120);} while(0) // Pin45 0 | |
#define Motor_Z_Disable() PORTL |= (1<<4) // Pin45 1 | |
#define Read_Z_Ena_State !(PINL & (1<<4)) | |
#else | |
#define Motor_Z_Enable() do {PORTL |= (1<<4); _delay_ms(120);} while(0) // Pin45 1 | |
#define Motor_Z_Disable() PORTL &= ~(1<<4) // Pin45 0 | |
#define Read_Z_Ena_State (PINL & (1<<4)) | |
#endif | |
#define Motor_X_Enable() do {PORTL |= (1<<3); _delay_ms(120);} while(0) // Pin46 1 | |
#define Motor_X_Disable() PORTL &= ~(1<<3) // Pin46 0 | |
#define Read_X_Ena_State (PINL & (1<<3)) | |
// ***** Tacho ***** | |
#define TachoSetPulse() PORTL |= (1<<7) // Pin42 1 | |
#define TachoRemovePulse() PORTL &= ~(1<<7) // Pin42 0 | |
// ***** 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<<WGM21);\ | |
TCCR2B = (1<<CS20)|(1<<CS21); // 16MHz/32 = 500kHz | |
//***** РГИ перемещение ***** | |
#define Timer3_Init() TCCR3A = 0;\ | |
TCCR3B = (1<<WGM32)|(1<<CS30)|(1<<CS31); // 16MHz/32 = 250kHz | |
// ***** aFeed ***** | |
#define Timer4_Init() TCCR4A = 0;\ | |
TCCR4B = (1<<WGM42)|(1<<CS40)|(1<<CS41); // 16MHz/32 = 250kHz | |
// ***** Feed ***** | |
#define Timer5_Init() TCCR5A = 0;\ | |
TCCR5B = (1<<WGM52) | (1<<CS52) | (1<<CS51) | (1<<CS50) | |
// ***** Cone ***** | |
struct cone_info_type | |
{ | |
byte Cs_Div; | |
int Cm_Div; | |
char Cone_Print[6]; | |
}; | |
// This table must be re-calculated each time hardware parameters | |
// at the top change. Use tables.html to find the new values. | |
const cone_info_type Cone_Info[] = { | |
{ 2, 6667, "45dg"}, | |
{102, 4640, " CM0"}, // 1:19.212 | |
{106, 9173, " CM1"}, // 1:20.047 | |
{106, 7733, " CM2"}, // 1:20.02 | |
{106, 2507, " CM3"}, // 1:19.922 | |
{102, 6880, " CM4"}, // 1:19.254 | |
{101, 3440, " CM5"}, // 1:19.002 | |
{102, 2933, " CM6"}, // 1:19.18 | |
{ 21, 3333, " 1:4"}, // 1:4 | |
{ 26, 6667, " 1:5"}, // 1:5 | |
{ 37, 3333, " 1:7"}, // 1:7 | |
{ 53, 3333, "1:10"}, // 1:10 | |
{ 85, 3333, "1:16"}, // 1:16 | |
{106, 6667, "1:20"}, // 1:20 | |
{128, 0, "1:24"}, // 1:24 | |
{160, 0, "1:30"}, // 1:30 | |
{266, 6667, "1:50"}, // 1:50 | |
{ 48, 7619, "7:64"}, // 7:64 | |
{ 18, 9743, " 8dg"}, | |
{ 15, 1234, "10dg"}, | |
{ 9, 9521, "15dg"}, | |
{ 4, 6188, "30dg"}, | |
}; | |
#define TOTAL_CONE (sizeof(Cone_Info) / sizeof(Cone_Info[0])) | |
// ***** Threads ***** | |
struct thread_info_type | |
{ | |
byte Ks_Div_Z; | |
int Km_Div_Z; | |
byte Ks_Div_X; | |
int Km_Div_X; | |
char Thread_Print[7]; | |
float Step; | |
byte Pass; | |
char Limit_Print[8]; | |
}; | |
// This table must be re-calculated each time hardware parameters | |
// at the top change. Use tables.html to find the new values. | |
const thread_info_type Thread_Info[] = { | |
{ 9, 0, 12, 0, "0.25mm", 0.250, 4, " 750rpm"}, | |
{ 7, 5000, 10, 0, "0.30mm", 0.300, 4, " 750rpm"}, | |
{ 6, 4286, 8, 5714, "0.35mm", 0.350, 4, " 750rpm"}, | |
{ 5, 6250, 7, 5000, "0.40mm", 0.400, 4, " 750rpm"}, | |
{ 4, 5000, 6, 0, "0.50mm", 0.500, 4, " 750rpm"}, | |
{ 3, 7500, 5, 0, "0.60mm", 0.600, 4, " 750rpm"}, | |
{ 3, 2143, 4, 2857, "0.70mm", 0.700, 4, " 750rpm"}, | |
{ 3, 0, 4, 0, "0.75mm", 0.750, 5, " 750rpm"}, | |
{ 2, 8125, 3, 7500, "0.80mm", 0.800, 5, " 700rpm"}, | |
{ 2, 2500, 3, 0, "1.00mm", 1.000, 6, " 560rpm"}, | |
{ 1, 8000, 2, 4000, "1.25mm", 1.250, 7, " 460rpm"}, | |
{ 1, 5000, 2, 0, "1.50mm", 1.500, 7, " 380rpm"}, | |
{ 1, 2857, 1, 7143, "1.75mm", 1.750, 8, " 320rpm"}, | |
{ 1, 1250, 1, 5000, "2.00mm", 2.000, 9, " 280rpm"}, | |
{ 0, 9000, 1, 2000, "2.50mm", 2.500, 11, " 220rpm"}, | |
{ 0, 7500, 1, 0, "3.00mm", 3.000, 15, " 190rpm"}, | |
{ 0, 5625, 0, 7500, "4.00mm", 4.000, 22, " 140rpm"}, | |
{ 7, 866, 9, 4488, "80tpi ", 0.318, 4, " 750rpm"}, | |
{ 6, 3780, 8, 5039, "72tpi ", 0.353, 4, " 750rpm"}, | |
{ 5, 6693, 7, 5591, "64tpi ", 0.397, 4, " 750rpm"}, | |
{ 5, 3150, 7, 866, "60tpi ", 0.423, 4, " 750rpm"}, | |
{ 4, 9606, 6, 6142, "56tpi ", 0.454, 4, " 750rpm"}, | |
{ 4, 2520, 5, 6693, "48tpi ", 0.529, 4, " 750rpm"}, | |
{ 3, 8976, 5, 1969, "44tpi ", 0.577, 4, " 750rpm"}, | |
{ 3, 5433, 4, 7244, "40tpi ", 0.635, 4, " 750rpm"}, | |
{ 3, 1890, 4, 2520, "36tpi ", 0.706, 5, " 750rpm"}, | |
{ 2, 8346, 3, 7795, "32tpi ", 0.794, 5, " 710rpm"}, | |
{ 2, 4803, 3, 3071, "28tpi ", 0.907, 5, " 650rpm"}, | |
{ 2, 3917, 3, 1890, "27tpi ", 0.941, 5, " 600rpm"}, | |
{ 2, 3031, 3, 709, "26tpi ", 0.977, 6, " 570rpm"}, | |
{ 2, 1260, 2, 8346, "24tpi ", 1.058, 6, " 500rpm"}, | |
{ 1, 9488, 2, 5984, "22tpi ", 1.155, 6, " 450rpm"}, | |
{ 1, 7717, 2, 3622, "20tpi ", 1.270, 7, " 440rpm"}, | |
{ 1, 6831, 2, 2441, "19tpi ", 1.337, 7, " 420rpm"}, | |
{ 1, 5945, 2, 1260, "18tpi ", 1.411, 7, " 380rpm"}, | |
{ 1, 4173, 1, 8898, "16tpi ", 1.587, 8, " 350rpm"}, | |
{ 1, 2402, 1, 6535, "14tpi ", 1.814, 9, " 320rpm"}, | |
{ 1, 630, 1, 4173, "12tpi ", 2.117, 10, " 270rpm"}, | |
{ 0, 8858, 1, 1811, "10tpi ", 2.540, 11, " 220rpm"}, | |
{ 0, 7972, 1, 630, " 9tpi ", 2.822, 14, " 190rpm"}, | |
{ 0, 7087, 0, 9449, " 8tpi ", 3.175, 16, " 170rpm"}, | |
{ 0, 6201, 0, 8268, " 7tpi ", 3.629, 19, " 150rpm"}, | |
{ 0, 5315, 0, 7087, " 6tpi ", 4.233, 24, " 140rpm"}, | |
}; | |
#define TOTAL_THREADS (sizeof(Thread_Info) / sizeof(Thread_Info[0])) | |
#define PASS_FINISH 3 // THRD_PS_FN ??? | |
#define Thrd_Accel_Err Thread_Info[0].Ks_Div_Z // неверно задано ускорение | |
//static_assert(Thrd_Accel_Err + THRD_ACCEL <= 255, "Неверно задано значение THRD_ACCEL"); | |
// ***** Interrupts ***** | |
#define INT0_Init() EICRA |= (1<<ISC00) | |
#define INT2_Init() EICRA |= (1<<ISC20) | |
#define Enable_INT0() EIMSK |= (1<<INT0) | |
#define Disable_INT0() EIMSK &= ~(1<<INT0) | |
#define Ena_INT_Hcoder() do {EIFR = (1<<INTF2); EIMSK |= (1<<INT2);} while(0) | |
#define Disa_INT_Hcoder() EIMSK &= ~(1<<INT2) | |
#define Enable_INT_OCR2A() do {TCNT2 = 0; TIFR2 = (1<<OCF2A); TIMSK2 = (1<<OCIE2A);} while(0) | |
#define Disable_INT_OCR2A() TIMSK2 &= ~(1<<OCIE2A) | |
#define Enable_INT_OCR2B() do {TCNT2 = 0; TIFR2 = (1<<OCF2B); TIMSK2 = (1<<OCIE2B);} while(0) | |
#define Disable_INT_OCR2B() TIMSK2 &= ~(1<<OCIE2B) | |
#define Enable_INT_OCR3A() do {TCNT3 = 0; TIFR3 = (1<<OCF3A); TIMSK3 = (1<<OCIE3A);} while(0) | |
#define Disable_INT_OCR3A() TIMSK3 &= ~(1<<OCIE3A) | |
#define Enable_INT_OCR3B() do {TCNT3 = 0; TIFR3 = (1<<OCF3B); TIMSK3 = (1<<OCIE3B);} while(0) | |
#define Disable_INT_OCR3B() TIMSK3 &= ~(1<<OCIE3B) | |
#define Enable_INT_OCR4A() do {TCNT4 = 0; TIFR4 = (1<<OCF4A); TIMSK4 = (1<<OCIE4A);} while(0) | |
#define Disable_INT_OCR4A() TIMSK4 &= ~(1<<OCIE4A) | |
#define Enable_INT_OCR4B() do {TCNT4 = 0; TIFR4 = (1<<OCF4B); TIMSK4 = (1<<OCIE4B);} while(0) | |
#define Disable_INT_OCR4B() TIMSK4 &= ~(1<<OCIE4B) | |
#define Enable_INT_OCR5A() do {TCNT5 = 0; TIFR5 = (1<<OCF5A); TIMSK5 = (1<<OCIE5A);} while(0) | |
#define Disable_INT_OCR5A() TIMSK5 &= ~(1<<OCIE5A) | |
#define Enable_INT_OCR5B() do {TCNT5 = 0; TIFR5 = (1<<OCF5B); TIMSK5 = (1<<OCIE5B);} while(0) | |
#define Disable_INT_OCR5B() TIMSK5 &= ~(1<<OCIE5B) | |
//////////////////////////////////////////////////////////// | |
#define Ena_INT_Thrd() do {Disable_INT_OCR2A();\ | |
Disable_INT_OCR2B();\ | |
Disable_INT_OCR4A();\ | |
Disable_INT_OCR4B();\ | |
Disable_INT_OCR5A();\ | |
Disable_INT_OCR5B();\ | |
Enable_INT0();} while(0) | |
#define Ena_INT_Z_Feed() do {Disable_INT0();\ | |
Disable_INT_OCR2A();\ | |
Disable_INT_OCR2B();\ | |
Disable_INT_OCR4A();\ | |
Disable_INT_OCR4B();\ | |
Disable_INT_OCR5B();\ | |
Enable_INT_OCR5A();} while(0) | |
#define Ena_INT_Z_aFeed() do {Disable_INT0();\ | |
Disable_INT_OCR2A();\ | |
Disable_INT_OCR2B();\ | |
Disable_INT_OCR4B();\ | |
Disable_INT_OCR5A();\ | |
Disable_INT_OCR5B();\ | |
Enable_INT_OCR4A();} while(0) | |
#define Ena_INT_X_Feed() do {Disable_INT0();\ | |
Disable_INT_OCR2A();\ | |
Disable_INT_OCR2B();\ | |
Disable_INT_OCR4A();\ | |
Disable_INT_OCR4B();\ | |
Disable_INT_OCR5A();\ | |
Enable_INT_OCR5B();} while(0) | |
#define Ena_INT_X_aFeed() do {Disable_INT0();\ | |
Disable_INT_OCR2A();\ | |
Disable_INT_OCR2B();\ | |
Disable_INT_OCR4A();\ | |
Disable_INT_OCR5A();\ | |
Disable_INT_OCR5B();\ | |
Enable_INT_OCR4B();} while(0) | |
#define Ena_INT_Z_Rapid() do {Disable_INT0();\ | |
Disable_INT_OCR2B();\ | |
Disable_INT_OCR4A();\ | |
Disable_INT_OCR4B();\ | |
Disable_INT_OCR5A();\ | |
Disable_INT_OCR5B();\ | |
Enable_INT_OCR2A();} while(0) | |
#define Ena_INT_X_Rapid() do {Disable_INT0();\ | |
Disable_INT_OCR2A();\ | |
Disable_INT_OCR4A();\ | |
Disable_INT_OCR4B();\ | |
Disable_INT_OCR5A();\ | |
Disable_INT_OCR5B();\ | |
Enable_INT_OCR2B();} while(0) | |
// ***** My Flags ***** | |
typedef struct | |
{ | |
uint8_t bit0 : 1; | |
uint8_t bit1 : 1; | |
uint8_t bit2 : 1; | |
uint8_t bit3 : 1; | |
uint8_t bit4 : 1; | |
uint8_t bit5 : 1; | |
uint8_t bit6 : 1; | |
uint8_t bit7 : 1; | |
}FLAG; | |
#define Spindle_Dir ((volatile FLAG*)_SFR_MEM_ADDR(GPIOR0))->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_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 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; | |
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 = 0; | |
long Motor_Z_Pos = 0; | |
long Motor_X_Pos = 0; | |
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; | |
byte 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, 150, 200, 250, 300}; | |
#define TOTAL_CUTTER_WIDTH (sizeof(Cutter_Width_array) / sizeof(Cutter_Width_array[0])) | |
byte Cutter_Step = 2; | |
int Cutter_Width = Cutter_Width_array[Cutter_Step]; | |
const int Cutting_Width_array[] = {10, 25, 50, 100}; | |
#define TOTAL_CUTTING_STEP (sizeof(Cutting_Width_array) / sizeof(Cutting_Width_array[0])) | |
byte Cutting_Step = 1; | |
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<<OCF1A)) | |
#define CLEAR_KEYB_TIMER do {TCNT1 = 0; (TIFR1 |= (1<<OCF1A));} while(0) | |
uint16_t max_OCR3A = HC_START_SPEED_1; | |
uint16_t min_OCR3A = HC_MAX_SPEED_1; | |
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
void setup() | |
{ | |
lcd.begin(16, 2); | |
lcd.setCursor(0, 0); | |
lcd.print(" ELS v.7e2 "); | |
_delay_ms(1000); | |
DDRG = B11111111; | |
TIMSK0 = 0; | |
// ***** Timer0 ***** // ***** Тахометр ***** | |
// TCCR0A = (1<<COM0B0)|(1<<WGM01); // Toggle OC0B on Compare Match // CTC Mode2 | |
// TCCR0B = (1<<CS00); // No Prescaler | |
// OCR0A = 89; // 1800/10(выходных пульсов)/2-1 = 89 | |
// TIMSK0 = (1<<OCIE0B); | |
Encoder_Init(); | |
Hand_Init(); | |
Motor_Init(); | |
INT0_Init(); | |
INT2_Init(); | |
Timer2_Init(); | |
OCR2A = MIN_RAPID_MOTION; | |
Timer3_Init(); | |
OCR3A = max_OCR3A; | |
Timer4_Init(); | |
OCR4A = max_OCR4A; | |
Timer5_Init(); | |
OCR5A = max_OCR5A; | |
Ena_INT_Z_Feed(); | |
Limit_Init(); | |
Limit_Left_LED_Off(); | |
Limit_Right_LED_Off(); | |
Limit_Front_LED_Off(); | |
Limit_Rear_LED_Off(); | |
Menu_Buttons_Init(); | |
Joy_Init(); | |
Mode_Switch_Init(); | |
Beeper_Init(); | |
Beeper_Off(); | |
Spindle_Dir = CW; | |
Motor_Z_Dir = ZCW; | |
Joy_Z_flag = OFF; | |
Step_Z_flag = OFF; | |
Motor_X_Dir = CW; | |
Joy_X_flag = OFF; | |
Step_X_flag = OFF; | |
TCCR1A = 0; | |
TCCR1B = 0 | |
|(0<<ICNC1)|(0<<ICES1) | |
|(0<<WGM13)|(1<<WGM12) | |
|(1<<CS12)|(0<<CS11)|(1<<CS10); | |
OCR1A = 625; | |
Motor_Z_RemovePulse(); | |
Motor_X_RemovePulse(); | |
} | |
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
void loop() | |
{ | |
Spindle(); | |
Read_ADC_Feed(); | |
if (KEYB_TIMER_FLAG != 0) Menu(); | |
if (Mode == Mode_Divider) Print(); // пока для теста !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
// Print(); // тоько для теста !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | |
} | |
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
// ***** Thread ***** /////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
ISR(INT0_vect) | |
{ | |
TachoRemovePulse(); | |
if (!Enc_Ch_A) | |
{ | |
if (!Enc_Ch_B) | |
{ | |
Spindle_Dir = CW; | |
if (++Enc_Pos == ENC_TICK) | |
{ | |
Enc_Pos = 0; | |
TachoSetPulse(); | |
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; | |
TachoSetPulse(); | |
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; | |
TachoSetPulse(); | |
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; | |
TachoSetPulse(); | |
if (Joy_Z_flag == ON) {Step_Z_flag = ON;} | |
else if (Joy_X_flag == ON) {Step_X_flag = ON;} | |
} | |
} | |
} | |
if (Step_Z_flag == ON) | |
{ Motor_Z_RemovePulse(); | |
if ( (Motor_Z_Dir == ZCW && Motor_Z_Pos > Limit_Pos) || (Motor_Z_Dir == ZCCW && 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 == ZCW) {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 == ZCW) {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 (Joy_Z_flag == ON) {Motor_X_RemovePulse();} | |
TachoRemovePulse(); | |
Tacho_Count = Tacho_Count + (OCR5A+1); | |
if (Tacho_Count > ENC_LINE_PER_REV) | |
{ | |
TachoSetPulse(); | |
Tacho_Count = Tacho_Count - ENC_LINE_PER_REV; | |
} | |
if ( (Motor_Z_Dir == ZCW && Motor_Z_Pos > Limit_Pos) || (Motor_Z_Dir == ZCCW && Motor_Z_Pos < Limit_Pos) || (!feed_Z_flag) ) | |
{ | |
if (OCR5A < max_OCR5A) | |
{ | |
Motor_Z_InvertPulse(); | |
if (!Read_Z_State) | |
{ | |
OCR5A++; | |
if (Motor_Z_Dir == ZCW) {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 == ZCW) {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) | |
{ | |
TachoRemovePulse(); | |
Tacho_Count = Tacho_Count + (OCR5A+1); | |
if (Tacho_Count > ENC_LINE_PER_REV) | |
{ | |
TachoSetPulse(); | |
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 == ZCW && Motor_Z_Pos > Limit_Pos) || (Motor_Z_Dir == ZCCW && Motor_Z_Pos < Limit_Pos) || (!rapid_Z_flag) ) | |
{ | |
if (OCR2A < MIN_RAPID_MOTION) | |
{ | |
Motor_Z_InvertPulse(); | |
if (!Read_Z_State) | |
{ | |
if (Motor_Z_Dir == ZCW) { 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 == ZCW) { Motor_Z_Pos ++; } | |
else { Motor_Z_Pos --; } | |
if (OCR2A > MAX_RAPID_MOTION) | |
{ | |
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) | |
{ | |
if (++Repeat_Count == REPEAt) | |
{ | |
Repeat_Count = 0; | |
OCR2A --; | |
} | |
} | |
} | |
} | |
} | |
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
// ***** Asynchron Feed ***** //////////////////////////////////////////////////////////////////////////////////////////////////////// | |
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
ISR (TIMER4_COMPA_vect) | |
{ | |
if ( (Motor_Z_Dir == ZCW && Motor_Z_Pos > Limit_Pos) || (Motor_Z_Dir == ZCCW && Motor_Z_Pos < Limit_Pos) || (!feed_Z_flag) ) | |
{ | |
if (OCR4A < max_OCR4A) | |
{ | |
Motor_Z_InvertPulse(); | |
if (!Read_Z_State) | |
{ | |
OCR4A ++; | |
if (Motor_Z_Dir == ZCW) {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 == ZCW) {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 == ZCW) | |
{ | |
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 == ZCCW) | |
{ | |
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 ***** /////////////////////////////////////////////////// |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment