энкодер для токарного станка - ФОРУМ ДВ Робот dvrobot.ru
Пятница, 15.12.2017, 08:52
Главная Мой профиль Регистрация Выход
  • НАШ МАГАЗИН
  • Вы вошли как Гость | Группа "Гости"Приветствую Вас, Гость
    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    Страница 1 из 11
    Модератор форума: GRACH, Serg 
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » энкодер для токарного станка
    энкодер для токарного станка
    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]//*******************************************************************


    файлы и исходники у меня есть


    начинающий
     
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » энкодер для токарного станка
    Страница 1 из 11
    Поиск:

    ДВ Робот - Чат