Náhrada výměnných kol posuvu za krokový motor s elektronikou

Odpovědět
Uživatelský avatar
CZ_Pascal
Příspěvky: 870
Registrován: 14. 1. 2008, 8:24
Bydliště: Brno

10. 1. 2016, 7:59

atlan píše:skor, by som vyuzil i2c alebo uart netradicne na generovanie step impulzov
.... hmm to by šlo určitě taky - invenci se meze nekladou :wink:

Tešíme se až se pochlubíš s výsledkem - i průběžným ať vidíme jak to pěkně "roste"

Určitě se ještě někdo přidá (já bohužel zatím pouze teoreticky - taťkův "soustruh" mám 80km daleko a času žalostně málo :cry: )

škoda že ten Atmel mají (co jsem tak na netu našel) nataktovaný pouze na 16MHz - MEGA328 by krásně bežela na 20MHz
Grad
Příspěvky: 2073
Registrován: 13. 7. 2014, 9:32

10. 1. 2016, 1:13

To atlan:
Vidím správně na fotce Arduino UNO s deskou LCD Keypad?
Pokud ano, zkoušel jsi tento

Kód: Vybrat vše

// Версия для Arduino UNO


#include <avr/pgmspace.h>


// ***** LCD *****
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
char LCD_Row_1[17];
char LCD_Row_2[17];


// ***** Stepper Motor *****
#define Motor_X_SetPulse()           PORTB &= ~(1<<2)     // Pin10 1
#define Motor_X_RemovePulse()        PORTB |= (1<<2)      // Pin10 0
#define Motor_X_Forward()            PORTB |= (1<<3)      // Pin11 0
#define Motor_X_Reverse()            PORTB &= ~(1<<3)     // Pin11 1
#define Motor_X_Enable()             PORTB |= (1<<4)      // Pin12 0
#define Motor_X_Disable()            PORTB &= ~(1<<4)     // Pin12 1
boolean Step_On_flag=false;                               // Флаг разрешаем/запрещаем счет до "шагать"
boolean Mode_On_flag=false;                               // Флаг On/Off режим


// ***** Taho *****
#define TahoSetPulse()               PORTB |= (1<<5)      // Pin13 1
#define TahoRemovePulse()            PORTB &= ~(1<<5)     // Pin13 0


// ***** Encoder *****
#define Enc_Line_per_Revolution       1800                         // Кол-во линий энкодера
#define Enc_Line                      Enc_Line_per_Revolution*2    // Рабочее кол-во тиков
#define Enc_Read()                    (PIND & B00001000)
volatile int Enc_Pos = 0;                                          // Счетчик положения энкодера
volatile byte Ks_Count = 0;                                        // Счетчик для "Подача", "Резьба" целая часть
volatile int Km_Count = 0;                                         // Счетчик для "Подача", "Резьба" дробная часть
byte Ks_Divisor = 0;                                               // Делитель для "Подача", "Резьба" целая часть
int Km_Divisor = 0;                                                // Делитель для "Подача", "Резьба" дробная часть
int Enc_Pos_tmp = 0;
long Spindle_Angle = 0;
#define Spindle_Direction_CW         0                             // прямое вращение
#define Spindle_Direction_CCW        1                             // обратное вращение
boolean Spindle_Direction = Spindle_Direction_CW;


//***** Ускорение *****
#define Accel                         64                      // Коэф.деления с которого будем ускоряться,
byte tmp_Accel = Accel;                                       // должен быть больше максимального коэф-та на резьбах
byte tmp_Ks_Divisor = Accel;                                  //
#define Repeat                        8                       // Кол-во повторов для постоянной скорости в пределах полного шага,
byte tmp_Repeat = 0;                                          // выставить кратно дроблению шага


//***** Sensor *****
#define Sensor                  PINC
#define Sensor_Left             B00010000      // AD4
#define Sensor_Right            B00100000      // AD5
char Sensor_Mask = B00000000;

//***** Key & Joy *****
enum Pressed_Key
{
  Key_None,
  Key_Right,
  Key_Up,
  Key_Down,
  Key_Left,
  Key_Select
};
byte Pressed_Key=Key_None;
boolean key_flag=false;                                              // флаг нажатой/отжатой кнопки

#define Joy_Left_Read()             (PINC & B00000100)        // AD2
#define Joy_Right_Read()            (PINC & B00001000)        // AD3


// ***** Mode *****
enum Mode
{
  Mode_Thread = 1,
  Mode_Feed
};
byte Mode = Mode_Feed;


// ***** Feeds *****
#define Total_Feeds                   7                   // Кол-во подач
typedef struct
{
  byte  s_Divisor;                                        // Делитель для "Подача" целая часть
  char  Text[7];
}
FEED_INFO;
FEED_INFO Feed_Info[Total_Feeds] =
{
   { 225, "0.03mm" },   // Считаем по формуле:
   { 113, "0.06mm" },   // Enc_Line/(Step_Per_Revolution/Feed_Screw*Feed_mm)
   { 75,  "0.09mm" },
   { 56,  "0.12mm" },
   { 45,  "0.15mm" },
   { 38,  "0.18mm" },
   { 32,  "0.21mm" },
};
byte Feed_Step = 2;                                      // выборка из массива по умолчанию (0.09mm)


// ***** Threads *****
#define Total_Threads                 38                // Кол-во резьб
typedef struct
{
  byte s_Divisor;                                       // Делитель для "Резьба" целая часть
  int  m_Divisor;                                       // Делитель для "Резьба" дробная часть
  char Text[7];
}
THREAD_INFO;
THREAD_INFO Thread_Info[Total_Threads] =
{
   { 33, 7500, "0.20mm" }, // Считаем по формуле:
   { 27, 0,    "0.25mm" }, // Enc_Line/(Step_Per_Revolution/Feed_Screw*Thread_mm)
   { 22, 5000, "0.30mm" }, // Просчитан под 800 шаг/оборот (1/4 дробление, 1.5мм шаг винта)
   { 19, 2857, "0.35mm" },
   { 16, 8750, "0.40mm" },
   { 13, 5000, "0.50mm" },
   { 11, 2500, "0.60mm" },
   { 9,  6429, "0.70mm" },
   { 9,  0,    "0.75mm" },
   { 8,  4375, "0.80mm" },
   { 6,  7500, "1.00mm" },
   { 5,  4000, "1.25mm" },
   { 4,  5000, "1.50mm" },
   { 3,  8571, "1.75mm" },
   { 3,  3750, "2.00mm" },
   { 2,  7000, "2.50mm" },
   { 2,  2500, "3.00mm" },
   
   { 7,  866,  "80tpi " },
   { 6,  3780, "72tpi " },
   { 5,  6693, "64tpi " },
   { 5,  3150, "60tpi " },
   { 4,  9606, "56tpi " },
   { 4,  2520, "48tpi " },
   { 3,  8976, "44tpi " },
   { 3,  5433, "40tpi " },
   { 3,  1890, "36tpi " },
   { 2,  8347, "32tpi " },
   { 2,  4803, "28tpi " },
   { 2,  3917, "27tpi " },
   { 2,  3032, "26tpi " },
   { 2,  1260, "24tpi " },
   { 1,  9488, "22tpi " },
   { 1,  7717, "20tpi " },
   { 1,  6831, "19tpi " },
   { 1,  5945, "18tpi " },
   { 1,  4173, "16tpi " },
   { 1,  2402, "14tpi " },
   { 1,  0630, "12tpi " },
};
byte Thread_Step = 10;                      // выборка из массива по умолчанию (1.0mm)


//*********************************************************
void setup()
{
  TIMSK0 = 0;                       // !Отключаем таймер! (он в фоновом режиме обрабатывает не нужные нам функции)
  
  DDRB=B00111111;
  PORTB = B00100011;                // подтяжка PIN_
  
  DDRD=B11110011;
  PORTD = B11111100;                // подтяжка PIN_
  
  DDRC=B00000000;                   
  PORTC = B00111100;                // подтяжка PIN_
  
  EICRA = B00000001;                // INT_0 по фронту + по спаду
  EIMSK |= (1 << INT0);             // Enable INT_0
  
  lcd.begin(16, 2);
}


//**********************************************************
void loop()
{
  Enc_Pos_tmp = Enc_Pos;                     // ниже будем читать повторно и сравнивать
  
  menu();
  Joystick();
  
  if (Enc_Pos == Enc_Pos_tmp)               // Читаем повторно и сравниваем 
  {
    Spindle_Angle = (Enc_Pos*360000/(Enc_Line));  // Считаем угол
    snprintf(LCD_Row_2, 17, "Angle: %3ld.%03ld  ", Spindle_Angle/1000, Spindle_Angle%1000); // Вторая строка для печати
  }
  
  Print();
}


// ********** Функция обработки событий в главном меню **********
void menu()
{
  int ADC_value = analogRead(A0);
  if (ADC_value < 50) Pressed_Key=Key_Right;
  else if (ADC_value < 180) Pressed_Key=Key_Up;
  else if (ADC_value < 330) Pressed_Key=Key_Down;
  else if (ADC_value < 520) Pressed_Key=Key_Left;
  else if (ADC_value < 830) Pressed_Key=Key_Select;
  else Pressed_Key = Key_None;
  
  if (!key_flag)
  {
      switch (Pressed_Key)
      {
        case Key_Left:
          MenuKeyLeftPressed();
          break;
        case Key_Right:
          MenuKeyRightPressed();
          break;
        case Key_Up:
          MenuKeyUpPressed();
          break;
        case Key_Down:
          MenuKeyDownPressed();
          break;       
        case Key_Select:
          MenuKeySelectPressed();    
          break;
      }
  }
  if (Pressed_Key == Key_None) key_flag = false;

  SelectWorkMode();                                // вызов выбранного рабочего режима
}

// ********** Обработчик нажатия кнопки Select **********
void MenuKeySelectPressed()
{
  switch (Mode) 
  {
      case Mode_Thread:
         if (!Mode_On_flag)
         {
            Ks_Count = 0;
            Km_Count = 0;
            tmp_Repeat = 0;
            
            Step_On_flag = false;
            Mode++;
         }
         break;
         
      case Mode_Feed:
         if (!Mode_On_flag)
         {
            Ks_Count = 0;
            Km_Count = 0;
            tmp_Accel = Accel;
            tmp_Repeat = 0;
            tmp_Ks_Divisor = Accel;
            
            Step_On_flag = false;
            Mode--;
         }
        break;
   }
   key_flag = true;
}

// ********** Обработчик нажатия кнопки Up **********
void MenuKeyUpPressed()
{
  switch (Mode)
  {
      case Mode_Thread:
        if (Thread_Step < Total_Threads-1)
        {
           if (Mode_On_flag == false)
           {
              Ks_Count = 0;
              Km_Count = 0;
              tmp_Accel = Accel;
              tmp_Repeat = 0;
              tmp_Ks_Divisor = Accel;
            
              Step_On_flag = false;
              Thread_Step++;
           }
        }
        break;
        
      case Mode_Feed:
        if (Feed_Step < Total_Feeds-1)
        {
          Ks_Count = 0;
          Km_Count = 0;
          tmp_Repeat = 0;
          
          Feed_Step++;
        }
        break;
      }
      key_flag = true;
}

// ********** Обработчик нажатия кнопки Down **********
void MenuKeyDownPressed()
{
   switch (Mode)
   { 
      case Mode_Thread:
        if (Thread_Step > 0)
        {
           if (Mode_On_flag == false)
           {
              Ks_Count = 0;
              Km_Count = 0;
              tmp_Accel = Accel;
              tmp_Repeat = 0;
              tmp_Ks_Divisor = Accel;
              
              Step_On_flag = false;
              Thread_Step--;
           }
        }
        break;
        
      case Mode_Feed:
        if (Feed_Step > 0)
        {
          Ks_Count = 0;
          Km_Count = 0;
          tmp_Repeat = 0;
          
          Feed_Step--;
        }
        break;
   }
   key_flag = true;
}

// ********** Обработчик нажатия кнопки Left **********
void MenuKeyLeftPressed()
{
      switch (Mode)
      {
         
         break;
      }
      
      key_flag = true;
}

// ********** Обработчик нажатия кнопки Right **********
void MenuKeyRightPressed()
{
      switch (Mode)
      {

          break;
      }
      
      key_flag = true;
}

// ********** Выбор режима работы **********
void SelectWorkMode()
{
   switch (Mode)
   {
    case Mode_Thread:
        Thread();
        break;
    case Mode_Feed:
        Feed();
        break;
   }
}


// ********** Обработка джойстика **********
void Joystick()
{
   if (!Joy_Left_Read())
   {
      Motor_X_Enable();
      Mode_On_flag = true;
      if (Spindle_Direction == Spindle_Direction_CW)
      {
         Motor_X_Forward();
         Sensor_Mask = Sensor_Left;
      }
      if (Spindle_Direction == Spindle_Direction_CCW)
      {
         Motor_X_Reverse();
         Sensor_Mask = Sensor_Right;
      }
   }
   
   else if (!Joy_Right_Read())
   {
      Motor_X_Enable();
      Mode_On_flag = true;
      if (Spindle_Direction == Spindle_Direction_CW)
      {
         Motor_X_Reverse();
         Sensor_Mask = Sensor_Right;
      }
      if (Spindle_Direction == Spindle_Direction_CCW)
      {
         Motor_X_Forward();
         Sensor_Mask = Sensor_Left;
      }
   }
   
   else
   {
      Mode_On_flag = false;
      if (Step_On_flag == false)
      {
         Motor_X_Disable();
      }
   }
 }


//***************************************
void Thread()
{
  Ks_Divisor=Thread_Info[Thread_Step].s_Divisor;
  Km_Divisor=Thread_Info[Thread_Step].m_Divisor;
  snprintf(LCD_Row_1, 17, "Thread: %s", Thread_Info[Thread_Step].Text); // Первая строка для печати
}

void Feed()
{
  Ks_Divisor=Feed_Info[Feed_Step].s_Divisor;
  
  tmp_Accel = Ks_Divisor;
  tmp_Ks_Divisor = Ks_Divisor;
  
  Km_Divisor=0;
  Km_Count=0;
  
  snprintf(LCD_Row_1, 17, "Feed:   %s", Feed_Info[Feed_Step].Text);    // Первая строка для печати
}


//******************************************************************
void Print()
{
lcd.setCursor(0, 0);
lcd.print(LCD_Row_1);

lcd.setCursor(0, 1);
lcd.print(LCD_Row_2);
}


//******************************************************************
ISR(INT0_vect)
{
   TahoRemovePulse();
   Motor_X_RemovePulse();

   if (!Enc_Read())                                     // Вращение шпинделя вправо
   {
      Spindle_Direction = Spindle_Direction_CW;
      Enc_Pos++;
      if (Enc_Pos == Enc_Line)                          // полный оборот
      {                                           
         Enc_Pos = 0;
         TahoSetPulse();                                // при проходе 0 генерим сигнал Taho
         if (Mode_On_flag == true)                      // проверка режима на ON/OFF, только! после прохода 0 разрешаем счет до к.деления
         {
            Step_On_flag = true;
         }
      }
   } 
   else                                                 // Вращение шпинделя влево
   {
      Spindle_Direction = Spindle_Direction_CCW;
      Enc_Pos--;
      if (Enc_Pos < 0)                                  // полный оборот
      {
         Enc_Pos = Enc_Line - 1;
         TahoSetPulse();                                // при проходе 0 генерим сигнал Taho
         if (Mode_On_flag == true)                      // проверка режима на ON/OFF, только! после прохода 0 разрешаем счет до к.деления
         {
            Step_On_flag = true;
         }
      }
   }
      
                 
   if (!(Sensor & Sensor_Mask) || (!Mode_On_flag))        // Торможение
   {
      if (tmp_Ks_Divisor < tmp_Accel)
      {
         Ks_Count++;
         if (Ks_Count > tmp_Ks_Divisor)
         {
            Motor_X_SetPulse();
            Ks_Count = 0;
            tmp_Repeat ++;
            if (tmp_Repeat == Repeat)
            {
               tmp_Repeat = 0;
               tmp_Ks_Divisor ++;
            }
         }
      }  
      else
      {
         Step_On_flag = false;
      }
   }

   if (Step_On_flag == true && Mode_On_flag == true)
   {
      Ks_Count++;
      if (Ks_Count > tmp_Ks_Divisor)                    // Разгон
      {
         Motor_X_SetPulse();
         if (tmp_Ks_Divisor > Ks_Divisor)
         {
            Ks_Count = 0;
            tmp_Repeat ++;
            if (tmp_Repeat == Repeat)
            {
               tmp_Repeat = 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;
            }
         }
      }
   }
}

//*******************************************************************

originál soft od toho rusa?
Obvykle je lepší začínat s vyzkoušeným, když už máš vše potřebné (HW i SW) k dispozici a pak teprve experimentovat ... :wink: leda že by cesta měla být cílem, tak to pak jo.
atlan
Příspěvky: 3348
Registrován: 7. 2. 2011, 9:12

10. 1. 2016, 1:53

Tak mal som to nahrate ale nejako to neslo. A jeto na arduine, stym niesom kamarat. Urobil som si vlastne princip je jasny. Urobil som dnes nejake prepocty, upravil program aby fungoval ako s 4000ipMp koderom. A pospekuloval ze pouzijem data linku z i2c vychadza priaznivá frekvencia pre step impulzy do drivera.
Tym padom mozem mat mikrokrokovanie aj prevod do sily na skrutku co je najdolezitejsie aspo 2:1.
bronek999
Příspěvky: 521
Registrován: 6. 3. 2014, 6:50

10. 1. 2016, 2:24

Ak zoberiem do ruky kalkulacku a chces robit zavity pri 300 rpm, tak za sekundu spravis 5 otociek. Vretena. Ak by som zvolil maximalne stupanie zavitu 6mm, tak s krokovym motorom priamo na posuvovej skrutke so stupanim 3mm by som potreboval spravit dve otocky na jednu otocku vretena. Takze par stoviek krokov za sekundu, s mikrokrokom. Nemyslim ze data aplikacia potrebuje 256 mikrokrokov. Takze napriklad pri 8 mikrokrokoch by to bolo 2 * 200 * 8 = 3200 impulzov za sekundu. To je dlzka impulzu ~75us pri 50% pomere on/off. Neviem ako by som s I2C spravil napriklad 23 krokov.
Napriklad grbl pouziva jeden timer na generovanie impulzov podla aktualneho zrychlenia a rychlosti a druhy timer na ukoncenie impulzov.
Prvy ma premenlivu periodu, druhy je natvrdo nastaveny na 10uS a spustany prvym timerom.



Nepozeral som na videa ako to fyzicky funguje na nete. Ale ak by som to riesil tak by som chcel aby
1. Som vedel rezat zavit az po nejake osadenie. Takze vreteno by sa stale tocilo ale posuvova skrutka by zastala v nejakej vopred urcenej polohe. Takze by som vystustruzil nejaky 60 stupnovy zapich. - koniec zavitu. Samozrejme by som tam musel mat nejaku klavesnicu a displej na zadanie dlzky, alebo aspon tlacidlo na "naucenie" dlzky.
2. Rezanie zavitu bez zastavenia vretena. Teraz ked sa chcem vratit na zaciatok zavitu tak stopnem vreteno, pustim opacny chod a pomaly sa vratim pred zaciatok zavitu, tam zastavim a rezem zavit. A tak dookola. S elektronikou si predstavujem ze nejakym tlacidlom sa "rychloposuvom" vrati noz doprava na zaciatok zavitu(pravotociveho), posuvova skrutka sa zosynchronizuje s beziacim vretenom a rezem zavit dalej.
atlan
Příspěvky: 3348
Registrován: 7. 2. 2011, 9:12

10. 1. 2016, 3:46

Mne staci aby som nezavisle od programu vygeneroval 4impulzi ktore budu mat log 1 o dlzke 10us co mi i2c zabezpeci.
Napr potrebujem skrutku posuvu otocit o 1.8stupna tj jeden plny krok tj jeden impul pre krokac.Lenze ak pouzijem polkrokovanie, a prevod 2:1. Tam potrebujem tie impulzi 4 a to mi efektne vyriesi i2c.

Ano mam v plane uciaci mod. Nastavis noz, spustis sekvenciu noz prejde vzialenost a na potrebnom miest to zastavis, stlacis tlacidlo noz sa vrati na zaciatocnu poziciu. Das ho do zaberu spustis play a noz ubera material ak dojde na monecnu poziciu zastane, vyjdes do zabe4u stlacis tlacidlo noz sa vrati na zaciatok.
Grad
Příspěvky: 2073
Registrován: 13. 7. 2014, 9:32

10. 1. 2016, 4:27

Ale no ták, proč vymyjšlite ameriku, když ji tam ten rus už má a to včetně toho učícího módu pro jednu osu ve verzy Arduino UNO a pro X i Z pro verzy Arduino Mega 2560...
TO atlan:
Tak mne to nedalo a rozhodil jsem bastl s deskou UNO - ten s dnes spomínaným DRO a zkusil jsem do něj nahrát ten rusuv SW a i když tam mám pouze UNO a tu desku s LCD a zapojení je bez tlačítek pro limity X-ka, vstupů DIR, STEP z enkoderu a zapojených výstupu na driver, tak se to menu tváři funkčně. Samozřejmě že zapojovat to pro UNO nelze dle schemat přiložených výše, ale použité piny musíš vyčíst z toho SW, třeba výstupy na driver jsou na D10-D12, atd ... Co konkrétně tam nešlapalo tobě?
atlan
Příspěvky: 3348
Registrován: 7. 2. 2011, 9:12

10. 1. 2016, 4:53

Tusim nefungovali tlacitka. A nezabudaj ze on to ma na mini sustruhu s skrutkou co ma 1,5mm stupanie. Tak ze sily su tam ine. Nebudem luskat kod v rustine ked si to viem napisat po svojom, podla mojich predstav.
Aj ked to nahrajem od rusa nebude mi to chodit kedze motor to nezvladne a v principe budem tam kde teraz a 3 dni rozmyslat ako co kde zmenit aby to behalo,dakujem neprosim.
Staci jeho myslienka. Zvysok sa doladi.
Grad
Příspěvky: 2073
Registrován: 13. 7. 2014, 9:32

10. 1. 2016, 5:46

Pokud je to "odporem" k ruštině, to je to nejmenší - kod je přehledný a existuje translátor... pokud je to odporem ke všemu Ruskému, tak tomu rozumím...
Jinak tlačítka jsou řešena odporovým děličem a čtením napětí na A0 nějak takto:
lcd_button.png
Podrobněji je to tady: http://www.dfrobot.com/wiki/index.php/A ... DFR0009%29" onclick="window.open(this.href);return false;
proto doporučuji zkontrolovat použitou verzi desky s tlačítky viz. vzorový kod v odkazu a případně to zrevidovat v kodu od rusa.
Jinak pro překlad kodu a nahrávání na čip používám verzy Arduino 1.6.5 a ta s interpretaci kodu problém neměla, v čemž by také mohl být problém...
Otázka motoru a jeho zvládání či nezvládání šroubu posuvu je spíše věcí mechanickou-převodů nebo věci dimenzováni krokáče a odpovídajícího driveru i napájení, pokud bude odzkoušenej SW běhat s mechanicky odpojeným motorem, tak pak bych řešil toto.
Uživatelský avatar
CZ_Pascal
Příspěvky: 870
Registrován: 14. 1. 2008, 8:24
Bydliště: Brno

10. 1. 2016, 6:37

atlan píše:Mne staci aby som nezavisle od programu vygeneroval 4impulzi ktore budu mat log 1 o dlzke 10us co mi i2c zabezpeci.
Napr potrebujem skrutku posuvu otocit o 1.8stupna tj jeden plny krok tj jeden impul pre krokac.Lenze ak pouzijem polkrokovanie, a prevod 2:1. Tam potrebujem tie impulzi 4 a to mi efektne vyriesi i2c.
... nějako jsem nepochopil proč máš tedy nastavený mikrokrok když stejně těch kroků hned nasypeš 4 za sebe (tedy tolik jako bys udělal celokrok).

Smysl mikrokrokování by byl pouze pokud bys ty impulzy měl rovnoměrně rozložené podle rychlosti jakou se otáčí hřídel s univerzálkou. (tedy měnit rycholst datového toku i2c podle otáček)
Zatím jsem to nějako nestudoval dodetailu, ale nemyslím si že by se dala ta komunikační rychlost mněnit natolik plynule aby to bylo v tomto smyslu použitelné. Viděl bych to spíše tak podle prescaleru ve čtyřech krocích :roll:
atlan
Příspěvky: 3348
Registrován: 7. 2. 2011, 9:12

10. 1. 2016, 8:16

Ja tam nepotrebujem dosat tie 4 impulzi v nejakom rovnomernom casovom slede, dolezite je aby tam boli. Motor urobi otacky co ma a hotovo. Je to inak aj otazka delenia impulzov z enkodera aby boli pekne cele cisla lebo ked vzniknu sdesatinimi 6 miestami tak to nebude pekne :D A cim rychlejsie sa krokac toci rym viac ho mozem sprevodovat do sily.
Inak teraz som to skusal mam 4000imp z encodera. Problem je ze pri 4khz step impulzov a 1/4 kroku mi motor prost ostane vysiet a len bzuci.
Asi ten driver bude na dve veci, nepredpokladam ze mam zle cievky zapojene namotore ci?
Uživatelský avatar
packa
Příspěvky: 6947
Registrován: 7. 2. 2007, 6:42
Bydliště: Královehradecký kraj

10. 1. 2016, 8:24

atlan píše: :D A cim rychlejsie sa krokac toci rym viac ho mozem sprevodovat do sily.
Tohle taky není úplně pravda , tomu motoru začne brzy s otáčkami výrazně klesat krouták a budeš na to spřevodem hůř , musí se dělat kompromis.

ty tam nějak řešíš rampy ? pokd ne tak je to naprosto špatně
atlan
Příspěvky: 3348
Registrován: 7. 2. 2011, 9:12

10. 1. 2016, 9:54

Ved nepojdem do nejakeho velkeho prevodu 2:1 mozno 3:1. Momentalne to nieje vobec podstatne. Rozobral som driver pozrel ako to cinan polepil, nastudoval chaby datashet a skonstatoval ze napisi na krabicke zvladnu vsetko. Sice je tam napisane 3,5A a peak 4A akurat podla suciastok max 1,6A dobry odrb. A poto mze prec osa to nevladze tocit. Ked bude cast tak to overim ako to v skutocnosti je. Inak cip je TB67S109AFNG
bronek999
Příspěvky: 521
Registrován: 6. 3. 2014, 6:50

11. 1. 2016, 4:37

atlan píše:Ja tam nepotrebujem dosat tie 4 impulzi v nejakom rovnomernom casovom slede, dolezite je aby tam boli. Motor urobi otacky co ma a hotovo. Je to inak aj otazka delenia impulzov z enkodera aby boli pekne cele cisla lebo ked vzniknu sdesatinimi 6 miestami tak to nebude pekne :D A cim rychlejsie sa krokac toci rym viac ho mozem sprevodovat do sily.
Inak teraz som to skusal mam 4000imp z encodera. Problem je ze pri 4khz step impulzov a 1/4 kroku mi motor prost ostane vysiet a len bzuci.
Asi ten driver bude na dve veci, nepredpokladam ze mam zle cievky zapojene namotore ci?
Mam z toho zmiesane pocity. Podla mna neviec co chces alebo to vies ale nevies to spravit. Netvrdim ze to viem, len si to myslim.
Pleties motyky s orechami a nasobis to furikmi. Najlacnejsi krokovy motor zvladne step impulzy 40kHz. S driverom co da 256 microstep :)
Netusim ako chces dynamicky menit rychlost I2C rozhrania, ako budes riadit pocet odoslanych bitov-krokov.
Podla doterajsich prispevkov myslim ze budes rad ak zvladnes "Náhradu výměnných kol posuvu za krokový motor s elektonikou".
Nic viac, nic menej. S tocenim vretenom opacnym smerom, aby sa to vratilo a nestratilo synchronizaciu.
Ale vratit sa pri 300rpm na zaciatok, tam sa rozbehnut a trafit predoslu stopu noza nevidim realne(hodnotim podla Tvojich predoslych prispevkov)
Este by si mohol zastavit vreteno, rychloposuvom sa vratit, zosynchronizovat polohu noza voci vretenu a spusti vreteno.
Na vypocty podstatne jednoduchsie, dynamika skoro ziadna, zrychlenie noza zariadi zrychlenie vretena.


Pre Teba je dolezite poslat nejake impuzy, zda sa ze Ti je jedno v akom case sa tam dostanu. Motor to nejako dobehne, niekde sa to stretne, niekde sa to predbehne a mozno sa to zasa stretne. Delenie impulzov z enkodera? Mozno Ta prekvapim, ale zatial vsetky enkodery co som mal v ruke tak mali celociselny pocet impulzov na otacku. Cely tento projekt sa da zvladnut bez pouzitia desatinnej ciarky, takze 6 miestne cifry za bodkou naozaj nehrozia.
Uživatelský avatar
packa
Příspěvky: 6947
Registrován: 7. 2. 2007, 6:42
Bydliště: Královehradecký kraj

11. 1. 2016, 5:16

Ten rus to má vyřešené ibez reverzu , vřeteno točí stálejedním směrem a nůž mu couvá , což není špatný , jen bych doplnil řízení druhé osy .

: https://www.youtube.com/watch?v=m-6fqBzeig8" onclick="window.open(this.href);return false;
bronek999
Příspěvky: 521
Registrován: 6. 3. 2014, 6:50

11. 1. 2016, 5:25

packa píše:Ten rus to má vyřešené ibez reverzu , vřeteno točí stálejedním směrem a nůž mu couvá , což není špatný , jen bych doplnil řízení druhé osy .

: https://www.youtube.com/watch?v=m-6fqBzeig8" onclick="window.open(this.href);return false;
Ja viem ze to tak ma. Ale autorom ju RUS a nie atlan. Rusi boli prvi vo vesmire a keby mali v tom case arduino mega tak su uz na marse. Atlan tu ma v tomto vlakne dost prispevkov, nechcem ho nejak zhadzovat ale co prispevok to omyl.
Odpovědět

Zpět na „Ostatní elektronika“