michman | Дата: Суббота, 23.11.2013, 23:48 | Сообщение # 1 |
 1.5 Вольт
Группа: Пользователи
Сообщений: 5
Репутация: 0
Статус: Offline
| есть рабочая программа нужно ее изменить ее под мои нужды, кодпрограммы:
Цитата #include
[color=#7E7E7E]// ***** LCD ***** #include <[color=#CC6600]LiquidCrystal.h> [color=#CC6600]LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
[color=#7E7E7E]// ***** Stepper Motor ***** [color=#7E7E7E]//#define Step_Per_Revolution 2400 #define StepMotorPort PORTL #define StepMotorInitialization() DDRL=B11111111 [color=#7E7E7E]// под мотор выделен весь порт "L", сконфигурирован на выход #define StepMotorSetPulse() StepMotorPort &= ~(1<<0) [color=#7E7E7E]// Pin49 1 #define StepMotorRemovePulse() StepMotorPort |= (1<<0) [color=#7E7E7E]// Pin49 0 #define StepMotorForward() StepMotorPort |= (1<<2) [color=#7E7E7E]// Pin47 0 #define StepMotorReverse() StepMotorPort &= ~(1<<2) [color=#7E7E7E]// Pin47 1 #define StepMotorEnable() StepMotorPort |= (1<<4) [color=#7E7E7E]// Pin45 0 #define StepMotorDisable() StepMotorPort &= ~(1<<4) [color=#7E7E7E]// Pin45 1 [color=#CC6600]boolean Step_On_flag=[color=#CC6600]false; [color=#7E7E7E]// флаг прохода энкодера через 0 [color=#CC6600]boolean Motor_En_flag=[color=#CC6600]false; [color=#7E7E7E]// Enable/Disable Stepper Motor
[color=#7E7E7E]// ***** Taho ***** #define TahoPort PORTL #define TahoSetPulse() TahoPort |= (1<<6) [color=#7E7E7E]// Pin43 1 #define TahoRemovePulse() TahoPort &= ~(1<<6) [color=#7E7E7E]// Pin43 0
[color=#7E7E7E]// ***** Encoder ***** #define EncoderPort PORTD #define EncoderInitialization() DDRD=B00000000 [color=#7E7E7E]// Под энкодер выделен весь порт "D", сконфигурирован на вход #define Enc_Line 3600 [color=#7E7E7E]// Кол-во рисок энкодера х2 #define Enc_DDR DDRD [color=#CC6600]register [color=#CC6600]int Enc_Pos asm([color=#006699]"r2"); [color=#7E7E7E]// Счетчик положения энкодера [color=#CC6600]byte Ks_Count; [color=#7E7E7E]// Счетчик для "Подача", "Резьба" целая часть [color=#CC6600]register [color=#CC6600]int Km_Count asm([color=#006699]"r6"); [color=#7E7E7E]// Счетчик для "Подача", "Резьба" дробная часть [color=#CC6600]byte Ks_Divisor; [color=#7E7E7E]// Делитель для "Подача", "Резьба" целая часть [color=#CC6600]int Km_Divisor; [color=#7E7E7E]// Делитель для "Подача", "Резьба" дробная часть
[color=#7E7E7E]// ***** Keyboard ***** enum Pressed_Key { Key_None, Key_Right, Key_Up, Key_Down, Key_Left, Key_Select }; [color=#CC6600]byte Pressed_Key=Key_None; [color=#CC6600]boolean key_flag=[color=#CC6600]false; [color=#7E7E7E]// флаг нажатой/отжатой кнопки
[color=#7E7E7E]// ***** Mode ***** enum Mode { Mode_Thread_Left=1, Mode_Feed_Left, Mode_Divider, Mode_Feed_Right, Mode_Thread_Right }; [color=#CC6600]byte Mode = Mode_Divider;
[color=#7E7E7E]// ***** Feeds ***** [color=#7E7E7E]// Enc_Line/(Step_Per_Revolution/Feed_Screw*Feed_mm) #define Total_Feeds 10 [color=#7E7E7E]// Кол-во подач typedef struct { [color=#CC6600]byte s_Divisor; [color=#7E7E7E]// Делитель для "Подача" целая часть, дробная часть всегда = 0 [color=#CC6600]char Text[7]; } FEED_INFO; FEED_INFO Feed_Info[Total_Feeds] = { { 226, [color=#006699]"0.02mm" }, { 113, [color=#006699]"0.04mm" }, { 76, [color=#006699]"0.06mm" }, { 57, [color=#006699]"0.08mm" }, { 46, [color=#006699]"0.10mm" }, { 38, [color=#006699]"0.12mm" }, { 33, [color=#006699]"0.14mm" }, { 29, [color=#006699]"0.16mm" }, { 26, [color=#006699]"0.18mm" }, { 23, [color=#006699]"0.20mm" }, }; [color=#CC6600]byte Feed_Step = 4; [color=#7E7E7E]// выборка из массива по умолчанию
[color=#7E7E7E]// ***** Threads ***** [color=#7E7E7E]// Enc_Line/(Step_Per_Revolution/Feed_Screw*Thread_mm) #define Total_Threads 36 [color=#7E7E7E]// Кол-во резьб typedef struct { [color=#CC6600]byte s_Divisor; [color=#7E7E7E]// Делитель для "Резьба" целая часть [color=#CC6600]int m_Divisor; [color=#7E7E7E]// Делитель для "Резьба" дробная часть [color=#CC6600]char Text[7]; } THREAD_INFO; THREAD_INFO Thread_Info[Total_Threads] = { { 11, 2500, [color=#006699]"0.20mm" }, { 9, 0, [color=#006699]"0.25mm" }, { 7, 5000, [color=#006699]"0.30mm" }, { 6, 4286, [color=#006699]"0.35mm" }, { 5, 6250, [color=#006699]"0.40mm" }, { 4, 5000, [color=#006699]"0.50mm" }, { 3, 7500, [color=#006699]"0.60mm" }, { 3, 2143, [color=#006699]"0.70mm" }, { 3, 0, [color=#006699]"0.75mm" }, { 2, 8125, [color=#006699]"0.80mm" }, { 2, 2500, [color=#006699]"1.00mm" }, { 1, 8000, [color=#006699]"1.25mm" }, { 1, 5000, [color=#006699]"1.50mm" }, { 1, 2857, [color=#006699]"1.75mm" }, { 1, 1250, [color=#006699]"2.00mm" }, { 7, 866, [color=#006699]"80tpi " }, { 6, 3780, [color=#006699]"72tpi " }, { 5, 6693, [color=#006699]"64tpi " }, { 5, 3150, [color=#006699]"60tpi " }, { 4, 9606, [color=#006699]"56tpi " }, { 4, 2520, [color=#006699]"48tpi " }, { 3, 8976, [color=#006699]"44tpi " }, { 3, 5433, [color=#006699]"40tpi " }, { 3, 1890, [color=#006699]"36tpi " }, { 2, 8347, [color=#006699]"32tpi " }, { 2, 4803, [color=#006699]"28tpi " }, { 2, 3917, [color=#006699]"27tpi " }, { 2, 3032, [color=#006699]"26tpi " }, { 2, 1260, [color=#006699]"24tpi " }, { 1, 9488, [color=#006699]"22tpi " }, { 1, 7717, [color=#006699]"20tpi " }, { 1, 6831, [color=#006699]"19tpi " }, { 1, 5945, [color=#006699]"18tpi " }, { 1, 4173, [color=#006699]"16tpi " }, { 1, 2402, [color=#006699]"14tpi " }, { 1, 0630, [color=#006699]"12tpi " }, }; [color=#CC6600]byte Thread_Step = 10; [color=#7E7E7E]// выборка из массива по умолчанию
[color=#7E7E7E]// ***** Interrupt ***** #define EnableINT0() EIMSK |= (1 << INT0) #define DisableINT0() EIMSK &= ~(1 << INT0) #define EnableINT1() EIMSK |= (1 << INT1) #define DisableINT1() EIMSK &= ~(1 << INT1) [color=#7E7E7E]//#define Init_INT0_Rising() EICRA = B00000011 [color=#7E7E7E]//#define Init_INT0_Falling() EICRA = B00000010 #define Init_INT0_Any() EICRA = B00000001
[color=#7E7E7E]//********************************************************* [color=#CC6600]void [color=#CC6600][b]setup() { TIMSK0=0; [color=#7E7E7E]// !Отключаем таймер! (он что-то свое делает в фоновом режиме)
Enc_Pos=0; Ks_Count=0; Km_Count=0;
EncoderInitialization(); PORTD=B00000011; [color=#7E7E7E]// подтяжка PIN_21, 20,
StepMotorInitialization(); Init_INT0_Any(); EnableINT0();
lcd.[color=#CC6600]begin(16, 2); }
[color=#7E7E7E]//********************************************************** [color=#CC6600]void [color=#CC6600][b]loop() { [color=#CC6600]if (Mode == Mode_Divider) { StepMotorDisable(); } [color=#CC6600]else { [color=#CC6600]if (Motor_En_flag==[color=#CC6600]true) StepMotorEnable(); [color=#CC6600]if (Motor_En_flag==[color=#CC6600]false) StepMotorDisable(); }
menu(); }
[color=#7E7E7E]//****************************************************************** [color=#CC6600]void menu() { [color=#CC6600]int ADC_value = [color=#CC6600]analogRead(A0); [color=#CC6600]if (ADC_value < 65) Pressed_Key=Key_Right; [color=#CC6600]else [color=#CC6600]if (ADC_value < 220) Pressed_Key=Key_Up; [color=#CC6600]else [color=#CC6600]if (ADC_value < 390) Pressed_Key=Key_Down; [color=#CC6600]else [color=#CC6600]if (ADC_value < 600) Pressed_Key=Key_Left; [color=#CC6600]else [color=#CC6600]if (ADC_value < 870) Pressed_Key=Key_Select; [color=#CC6600]else Pressed_Key = Key_None;
[color=#CC6600]if (key_flag==[color=#CC6600]false) { [color=#CC6600]switch (Pressed_Key) { [color=#CC6600]case Key_Right: [color=#CC6600]switch (Mode) { [color=#CC6600]case Mode_Thread_Left: [color=#CC6600]case Mode_Feed_Left: [color=#CC6600]case Mode_Divider: [color=#CC6600]case Mode_Feed_Right: { Motor_En_flag=[color=#CC6600]false; Step_On_flag=[color=#CC6600]false; Ks_Count=0; Km_Count=0; Mode++; [color=#CC6600]break; } } key_flag=[color=#CC6600]true; [color=#CC6600]break;
[color=#CC6600]case Key_Left: [color=#CC6600]switch (Mode) { [color=#CC6600]case Mode_Feed_Left: [color=#CC6600]case Mode_Divider: [color=#CC6600]case Mode_Feed_Right: [color=#CC6600]case Mode_Thread_Right: { Motor_En_flag=[color=#CC6600]false; Step_On_flag=[color=#CC6600]false; Ks_Count=0; Km_Count=0; Mode--; [color=#CC6600]break; } } key_flag=[color=#CC6600]true; [color=#CC6600]break;
[color=#CC6600]case Key_Up: [color=#CC6600]switch (Mode) { [color=#CC6600]case Mode_Thread_Left: [color=#CC6600]case Mode_Thread_Right: { [color=#CC6600]if (Thread_Step < Total_Threads-1) { Motor_En_flag=[color=#CC6600]false; Step_On_flag=[color=#CC6600]false; Ks_Count=0; Km_Count=0; Thread_Step++; } [color=#CC6600]break; } [color=#CC6600]case Mode_Feed_Left: [color=#CC6600]case Mode_Feed_Right: { [color=#CC6600]if (Feed_Step < Total_Feeds-1) { Ks_Count=0; Km_Count=0; Feed_Step++; } [color=#CC6600]break; } } key_flag=[color=#CC6600]true; [color=#CC6600]break;
[color=#CC6600]case Key_Down: [color=#CC6600]switch (Mode) { [color=#CC6600]case Mode_Thread_Left: [color=#CC6600]case Mode_Thread_Right: { [color=#CC6600]if (Thread_Step > 0) { Motor_En_flag=[color=#CC6600]false; Step_On_flag=[color=#CC6600]false; Ks_Count=0; Km_Count=0; Thread_Step--; } [color=#CC6600]break; } [color=#CC6600]case Mode_Feed_Left: [color=#CC6600]case Mode_Feed_Right: { [color=#CC6600]if (Feed_Step > 0) { Ks_Count=0; Km_Count=0; Feed_Step--; } [color=#CC6600]break; } } key_flag=[color=#CC6600]true; [color=#CC6600]break;
[color=#CC6600]case Key_Select: [color=#CC6600]switch (Mode) { [color=#CC6600]case Mode_Thread_Left: [color=#CC6600]case Mode_Thread_Right: [color=#CC6600]case Mode_Feed_Left: [color=#CC6600]case Mode_Feed_Right: { Step_On_flag=[color=#CC6600]false; [color=#CC6600]if (Motor_En_flag==[color=#CC6600]false) Motor_En_flag=[color=#CC6600]true; [color=#CC6600]else [color=#CC6600]if (Motor_En_flag==[color=#CC6600]true) Motor_En_flag=[color=#CC6600]false; [color=#CC6600]break; } [color=#CC6600]case Mode_Divider: { Enc_Pos=0; [color=#CC6600]break; } } key_flag=[color=#CC6600]true; [color=#CC6600]break; } } [color=#CC6600]if (Pressed_Key==Key_None) key_flag=[color=#CC6600]false;
[color=#7E7E7E]// Вход в режим [color=#CC6600]if (Mode==Mode_Thread_Left) { Thread_Left(); } [color=#CC6600]else [color=#CC6600]if (Mode==Mode_Feed_Left) { StepMotorReverse(); Feed_Left(); } [color=#CC6600]else [color=#CC6600]if (Mode==Mode_Divider) { Divider(); } [color=#CC6600]else [color=#CC6600]if (Mode==Mode_Feed_Right) { StepMotorForward(); Feed_Right(); } [color=#CC6600]else [color=#CC6600]if (Mode==Mode_Thread_Right) { Thread_Right(); } }
[color=#7E7E7E]//*************************************** [color=#CC6600]void Thread_Left() { Ks_Divisor=Thread_Info[Thread_Step].s_Divisor; Km_Divisor=Thread_Info[Thread_Step].m_Divisor; [color=#CC6600]char* Print_Pitch = Thread_Info[Thread_Step].Text;
lcd.[color=#CC6600]setCursor(0, 0); lcd.[color=#CC6600]print([color=#006699]"Mode: "); lcd.[color=#CC6600]setCursor(7, 0); [color=#CC6600]if (Motor_En_flag==[color=#CC6600]true) { lcd.[color=#CC6600]print([color=#006699]"ON "); } [color=#CC6600]else [color=#CC6600]if (Motor_En_flag==[color=#CC6600]false) { lcd.[color=#CC6600]print([color=#006699]"OFF "); } lcd.[color=#CC6600]setCursor(0, 1); lcd.[color=#CC6600]print([color=#006699]"Thread <= "); lcd.[color=#CC6600]setCursor(10, 1); lcd.[color=#CC6600]print(Print_Pitch); }
[color=#CC6600]void Feed_Left() { Ks_Divisor=Feed_Info[Feed_Step].s_Divisor; Km_Divisor=0; [color=#CC6600]char* Print_Pitch = Feed_Info[Feed_Step].Text;
lcd.[color=#CC6600]setCursor(0, 0); lcd.[color=#CC6600]print([color=#006699]"Mode: "); lcd.[color=#CC6600]setCursor(7, 0); [color=#CC6600]if (Motor_En_flag==[color=#CC6600]true) { lcd.[color=#CC6600]print([color=#006699]"ON "); } [color=#CC6600]else [color=#CC6600]if (Motor_En_flag==[color=#CC6600]false) { lcd.[color=#CC6600]print([color=#006699]"OFF "); } lcd.[color=#CC6600]setCursor(0, 1); lcd.[color=#CC6600]print([color=#006699]"Feed <= "); lcd.[color=#CC6600]setCursor(10, 1); lcd.[color=#CC6600]print(Print_Pitch); }
[color=#CC6600]void Divider() { [color=#7E7E7E]// int Enc_Pos_tmp; [color=#CC6600]long Spindle_Angle; lcd.[color=#CC6600]setCursor(0, 0); lcd.[color=#CC6600]print([color=#006699]"Mode: Divider"); lcd.[color=#CC6600]setCursor(7, 0);
[color=#7E7E7E]// cli(); [color=#7E7E7E]// Enc_Pos_tmp=Enc_Pos; [color=#7E7E7E]// sei(); Spindle_Angle=(Enc_Pos*36000/(Enc_Line)); lcd.[color=#CC6600]setCursor(0, 1); lcd.[color=#CC6600]print([color=#006699]"Angle: "); lcd.[color=#CC6600]setCursor(10, 1); lcd.[color=#CC6600]print(Spindle_Angle/100); lcd.[color=#CC6600]print([color=#006699]","); lcd.[color=#CC6600]print(Spindle_Angle%100); lcd.[color=#CC6600]print([color=#006699]" "); }
[color=#CC6600]void Feed_Right() { Ks_Divisor=Feed_Info[Feed_Step].s_Divisor; Km_Divisor=0; [color=#CC6600]char* Print_Pitch = Feed_Info[Feed_Step].Text;
lcd.[color=#CC6600]setCursor(0, 0); lcd.[color=#CC6600]print([color=#006699]"Mode: "); lcd.[color=#CC6600]setCursor(7, 0); [color=#CC6600]if (Motor_En_flag==[color=#CC6600]true) { lcd.[color=#CC6600]print([color=#006699]"ON "); } [color=#CC6600]else [color=#CC6600]if (Motor_En_flag==[color=#CC6600]false) { lcd.[color=#CC6600]print([color=#006699]"OFF "); } lcd.[color=#CC6600]setCursor(0, 1); lcd.[color=#CC6600]print([color=#006699]"Feed => "); lcd.[color=#CC6600]setCursor(10, 1); lcd.[color=#CC6600]print(Print_Pitch); }
[color=#CC6600]void Thread_Right() { Ks_Divisor=Thread_Info[Thread_Step].s_Divisor; Km_Divisor=Thread_Info[Thread_Step].m_Divisor; [color=#CC6600]char* Print_Pitch = Thread_Info[Thread_Step].Text;
lcd.[color=#CC6600]setCursor(0, 0); lcd.[color=#CC6600]print([color=#006699]"Mode: "); lcd.[color=#CC6600]setCursor(7, 0); [color=#CC6600]if (Motor_En_flag==[color=#CC6600]true) { lcd.[color=#CC6600]print([color=#006699]"ON "); } [color=#CC6600]else [color=#CC6600]if (Motor_En_flag==[color=#CC6600]false) { lcd.[color=#CC6600]print([color=#006699]"OFF "); } lcd.[color=#CC6600]setCursor(0, 1); lcd.[color=#CC6600]print([color=#006699]"Thread => "); lcd.[color=#CC6600]setCursor(10, 1); lcd.[color=#CC6600]print(Print_Pitch); }
[color=#7E7E7E]//****************************************************************** ISR(INT0_vect) { [color=#CC6600]if ((PIND & B00000010) == 0) { Enc_Pos++; [color=#CC6600]if (Enc_Pos == Enc_Line) { Enc_Pos=0; TahoSetPulse(); [color=#7E7E7E]// при проходе 0 генерим сигнал Taho [color=#CC6600]if (Motor_En_flag==[color=#CC6600]true) { [color=#7E7E7E]// проверка режима на ON/OFF Step_On_flag = [color=#CC6600]true; [color=#7E7E7E]// при проходе 0 разрешаем счет до к.деления } }
[color=#CC6600]if (Step_On_flag == [color=#CC6600]true) {
[color=#CC6600]if (Mode == Mode_Thread_Left) { StepMotorReverse(); } [color=#CC6600]if (Mode == Mode_Thread_Right) { StepMotorForward(); }
[color=#CC6600]if (Ks_Count > Ks_Divisor) { StepMotorSetPulse(); Km_Count = Km_Count + Km_Divisor; [color=#CC6600]if (Km_Count > Km_Divisor) { Km_Count = Km_Count - 10000; Ks_Count = 0; } [color=#CC6600]else { Ks_Count = 1; } } Ks_Count++; } }
[color=#CC6600]else { Enc_Pos--; [color=#CC6600]if (Enc_Pos < 0) { Enc_Pos = Enc_Line - 1; TahoSetPulse(); [color=#CC6600]if (Motor_En_flag==[color=#CC6600]true) { Step_On_flag = [color=#CC6600]true; } }
[color=#CC6600]if (Step_On_flag == [color=#CC6600]true) {
[color=#CC6600]if (Mode == Mode_Thread_Left) { StepMotorForward(); } [color=#CC6600]if (Mode == Mode_Thread_Right) { StepMotorReverse(); }
[color=#CC6600]if (Ks_Count == 0) { StepMotorSetPulse(); Km_Count = Km_Count - Km_Divisor; [color=#CC6600]if (Km_Count < 1) { Km_Count = Km_Count + 10000; Ks_Count = Ks_Divisor + 1; } [color=#CC6600]else { Ks_Count = Ks_Divisor; } } Ks_Count--; }
}
TahoRemovePulse(); StepMotorRemovePulse(); } [color=#7E7E7E]//*******************************************************************
файлы и исходники у меня есть
начинающий
|
|
| |