Nik

MMD-310EM. Небольшая доработка.

947 повідомлень у цій темі

А ще експериментував із нарізанням зубів. Нарізав Z12 M2.25 (шестерня передньої бабки) Випробовував на дюралі. ЗБ до поворотного столика ще не придумав, тому намагався додатково затискати заготовку лещатами, що лежать боком. Із бронзою проблем не буде, із сталі, мабуть, і намагатися не варто.

IMG_5673.JPG

IMG_5674.JPG

IMG_5678.JPG

2

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Паз.jpg

Спробував надовбати паз у дюралі, начебто виходить, але верстат шкода - тяжко йде, різець сильно відгинає. Довбав на токарному, можна спробувати ще на фрезерному, рухом пінолі, може йому легше буде, але в мене сумніви - у чистовому варіанті буде бронза, а не дюраль і глибина значно більша.

Розглядаю альтернативи - просто профрезерувати, але тоді зайвий радіус буде, який дуже послабить меншу шестерню:

Паз-фрез.JPG

компромісний варіант - профрезерувати лише на глибину паза, а довбанням лише вирізати кути

паз-фрез+довб.JPG

1

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Зробив шестерню з двох частин, шпон паз надовбав. Коли буду міняти підшипники на конічні (вще придбав SKF), спробую і шестерню поставити.

IMG_5816.JPG

IMG_5818.JPG

IMG_5820-1.jpg

6

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Гадаю, настав час більш конкретно замислитися над електронною гітарою. Є досить багато готових рішень з російського чіпмейкера, але усі вони базуються на Arduino, що мені не дуже подобається, в своїх конструкціях я зазвичай використовую плати власної розробки а прошивки пишу на Сі. Також, зустрічав думку, що контролери ATMega заслабкі для подібних задач і треба використовувати STM32. У цьому є сенс, оскільки 16МГц це зовсім небагато, зважаючи на те що енкодер на 1800 рисок при 2500 обертах на шпінделі генеруватиме 75к імпульсів на секунду.

Отже, з одного боку, не хочеться вигадувати велосипед, з іншого - хочеться зробити все по-своєму і краще. Маю такий задум - реалізувати основний функціонал (різьби, подачі, конуси) у автономному режимі, за рахунок мікроконтролера, а також, передбачити можливість підключення до комп'ютера і керування верстатом за допомогою Mach3 чи подібного софту.

Хотів би почути думки колег з цього приводу.

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
52 минуты назад, vvsector85 сказал:

енкодер на 1800 рисок при 2500 обертах на шпінделі генеруватиме 75к імпульсів на секунду.

При таких обертах точна синхронізація ходового гвинта відносно позиції шпинделя - не потрібна, а обробка контролером всіх імпульсів енкодера - не ефективне використання контролера.

Думаю варто мати два датчика:

один саме енкодер. Для різьб, насічки, подач на відносно малих обертах тощо.

другий з одним (або декілька) імпульсом на оберт, для подач на великих обертах.

Змінено користувачем Sebra
0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

@Sebra Я колись робив верстат для намотування трансформаторів, там теж використовував енкодер від принтера на 1200 рисок, щоб мати можливість використовувати не всі поділки енкодера, я використав звичайний лічильник CD4017, тобто можна враховувати, наприклад, лише кожен 10-й імпульс.

А взагалі, як вважаєте, чи варто робити щось своє, чи використати все готове? Іще, як варіант, перекласти із діалекту Arduino на нормальний Cі.

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Якщо вже є готові рішення, наприклад, як у Ігоря Кави, і все гарно працює, то навіщо щось вигадувати,

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Например чтоб удовлетворить свой интерес и сделать лучше.

Или зачем вообще дома нужен станок если можно ходить к токарям или покупать готовое?

Хобби оно зачастую убыточное но душой отдыхаем и получаем удовлетворение от него.

Я тоже себе всё пишу сам. Ну не всё мне подходит сделанное другими. Мне не много иначе видится. Тем кто не владеет языками программирования этого не понять.

1

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Я б и ходил бы к токарям и покупал бы готовое, так они не продают то, что мне надо... Для того и купил станок, что бы не от кого не зависить. А если это хобби, да еще и убыточное, но для души, так тогда и сам станок нужно делать самому. Как по мне должен быть какой то компромис. На готовом и хорошо работающем, испытаном уже в деле можно сыкономить и время и средства. Чисто ИМХО.

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
16 минут назад, BWD сказал:

Я б и ходил бы к токарям и покупал бы готовое, так они не продают то, что мне надо...

Может вы плохо искали и не очень мотивировали их.9_9

Впрочем вы сами и ответили на вопрос зачем нужно делать своё а не пользоваться тем кто сделал кто то. Если тебе это под силу сделать и знаешь как - делай. Если не можешь написать программу для STM то используй то что сделали другие. Я  так когда то и делал но выучился программированию так как не находилось того что меня полностью удовлетворит. 

Я во всём самоучка для примера. И когда вижу как точат другие так они даже резцы не так устанавливают))) Не так как я. И прикручивают их не теми пальцами и ключами.9_9 Это нормально. Каждый по своему уникален. 

Зачем самому делать шестерни если в Китае они продаются? Много чего можно купить. Но самому сделать это же в кайф.

1

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Я бегло просмотрел код седьмой версии электронной гитары (кстати, у Игоря Кавы вторая версия, которая еще без моторизации поперечки), код мне понравился, он хорошо организован, прокомментирован и максимально приближен к Си (ардуиновские библиотеки там не используются, синтаксис почти не упрощен, но это лишь мое непрофессиональное мнение). Есть большой соблазн использовать готовое решение, тем более, что у меня валяется без дела Arduino Mega. Хотелось бы иметь более удобный интерфейс и графический дисплей, но, думаю, выбор простейшего символьного дисплея 1602 здесь не случаен - он наименее требователен к ресурсам контроллера.

С другой стороны, у меня есть мой собственный проект намоточного станка, реализованный на Atmega128, намотка - практически то же самое, что нарезание резьб, его довольно просто будет адаптировать, хотя проект довольно сырой и будет требовать отладки. Я бы мог довести его до ума в применении к токарному станку и выложить в открытый доступ, но боюсь, повторять такую сложную плату никто не станет при наличии более доступных решений, так что смысла в этом мало.

IMG_5114.JPG

IMG_5115.JPG

IMG_5118.JPG

Плата.JPG

Змінено користувачем vvsector85
1

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Нарисовал энкодер для электронной гитары, диск (1200 рисок) и оптопара из струйного принтера. Диаметр корпуса 58,5 мм, высота 30 мм. В общем, должно получиться довольно компактно.

Энкодер.JPG

Энкодер_разнесение.JPG

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

А вот и нет, не годится такой энкодер, слишком толстый, будет мешать приводной шкив, придется миниатюризировать

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Очень интересно, сделал невидимым корпус энкодера, и обнаружил такую вещь - он здесь изначально был задуман, на заглушке заднего подшипника есть прорезь и два отверстия, назначение которых было непонятно, но межцентровое расстояние этих отверстий в точности совпадает с монтажными прорезями на моей оптопаре. Есть соблазн сильно упростить конструкцию, установив оптопару в это место, тогда и подшипники не нужны и вообще все сильно упрощается, но есть момент, который меня смущает - я планирую замену подшипников на конические, а они требуют смазки, которая обязательно полезет наружу и попадет в оптопару и на диск энкодера, что неприемлемо.

Может, у кого-то есть идеи? Может, установить в это место сальник? Я с ними дела не имел, поэтому не знаю, удастся ли получить таким способом необходимую изоляцию?

Энкодер на ПБ.JPG

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

А зачем на шпиндель аж 1200 рисок валкод? 0,3 градуса разрешение.  Если все состояния обрабатывать по будет 1200*4= 0,075 градуса. 

Я давно перешел на магнитные валкодеры AS5600 и  AS5601. Программируется число импульсов на оборот. Но у них есть недостаток- крепить с  торца вала магнит нужно. А большой плюс в компактности. Можно получить разрешение 10 бит на оборот там где ни какая оптика не влезет.

 

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

@Andi_radio ну так именно из-за этого недостатка я и не рассматривал заводские валкодеры - чтобы не закрыть просвет шпинделя. Можно, конечно, заморочиться ременной передачей еще и на валкодер, но мне проще сделать обычный оптический. Кстати, мне удалось уменьшить толщину конструкции до 23,5 мм, теперь все должно влазить.

11 час назад, Andi_radio сказал:

А зачем на шпиндель аж 1200 рисок валкод?

там обычно даже 1800 ставят, у Игоря Кавы - 1440. Из своего опыта с намоточным станком, могу сказать, что важно даже не столько количество рисок, сколько само число. Оно должно быть таким, чтобы находилось как можно больше общих множетелей с величиной продольного хода. Подача происходит дискретно, поэтому нужно избегать дробных значений, иначе будет накапливаться ошибка.

В идеале, на сколько-то импульсов энкодера должен приходится один шаг ШД. Кстати, на сколько я понял, в проекте электронной гитары на ардуино, энкодер работает в режиме, когда за импульс считается и риска и промежуток между рисками, т. е. реально там 2400 импульсов на один оборот.

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
4 години назад, vvsector85 написав:

энкодер работает в режиме, когда за импульс считается и риска и промежуток между рисками, т. е. реально там 2400 импульсов на один оборот.

думаю трохи не так. певен там використовують квадратурний енкодер, де кількість сигналів=кількість міток*4. рахується по спаду і росту фронтів. це досить стандартна функція енкодера на МК

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

@aegis Здається, в такому режимі не вийде визначати напрямок обертання, а у цьому проекті він визначається, хоча я не зовсім розумію, навіщо.

Змінено користувачем vvsector85
0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

код



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 == CW && Motor_Z_Pos > Limit_Pos) || (Motor_Z_Dir == CCW && Motor_Z_Pos < Limit_Pos) || (!Joy_Z_flag) )
      {
         if (tmp_Ks_Divisor < tmp_Accel)
         {
            Ks_Count++;
            if (Ks_Count > tmp_Ks_Divisor)
            {
               Motor_Z_SetPulse();
               if (Motor_Z_Dir == CW) {Motor_Z_Pos ++;}
               else {Motor_Z_Pos --;}
               Ks_Count = 0;
               if (++Repeat_Count == REPEAt)
               {
                  Repeat_Count = 0;
                  tmp_Ks_Divisor ++;
               }
            }
         }  
         else {Step_Z_flag = OFF;}
      }

      else
      {
         Ks_Count++;
         if (Ks_Count > tmp_Ks_Divisor)
         {
            Motor_Z_SetPulse();
            if (Motor_Z_Dir == CW) {Motor_Z_Pos ++;}
            else {Motor_Z_Pos --;}
         
            if (tmp_Ks_Divisor > Ks_Divisor)
            {
               Ks_Count = 0;
               if (++Repeat_Count == REPEAt)
               {
                  Repeat_Count = 0;
                  tmp_Ks_Divisor --;
               }
            }
            else
            {  
               Km_Count = Km_Count + Km_Divisor;
               if (Km_Count > Km_Divisor)
               {
                  Km_Count = Km_Count - 10000;
                  Ks_Count = 0;
               }
               else {Ks_Count = 1;}
            }
         }
      }
   }
   
   if (Step_X_flag == ON)
   {  Motor_X_RemovePulse();
      if ( (Motor_X_Dir == CW && Motor_X_Pos > Limit_Pos) || (Motor_X_Dir == CCW && Motor_X_Pos < Limit_Pos) || (!Joy_X_flag) )
      {
         if (tmp_Ks_Divisor < tmp_Accel)
         {
            Ks_Count++;
            if (Ks_Count > tmp_Ks_Divisor)
            {
               Motor_X_SetPulse();
               if (Motor_X_Dir == CW) {Motor_X_Pos ++;}
               else {Motor_X_Pos --;}
               Ks_Count = 0;
               if (++Repeat_Count == REPEAt)
               {
                  Repeat_Count = 0;
                  tmp_Ks_Divisor ++;
               }
            }
         }  
         else {Step_X_flag = OFF;}
      }

      else
      {
         Ks_Count++;
         if (Ks_Count > tmp_Ks_Divisor)
         {
            Motor_X_SetPulse();
            if (Motor_X_Dir == CW) {Motor_X_Pos ++;}
            else {Motor_X_Pos --;}
         
            if (tmp_Ks_Divisor > Ks_Divisor)
            {
               Ks_Count = 0;
               if (++Repeat_Count == REPEAt)
               {
                  Repeat_Count = 0;
                  tmp_Ks_Divisor --;
               }
            }
            else
            {  
               Km_Count = Km_Count + Km_Divisor;
               if (Km_Count > Km_Divisor)
               {
                  Km_Count = Km_Count - 10000;
                  Ks_Count = 0;
               }
               else {Ks_Count = 1;}
            }
         }
      }
   }
}

Змінено користувачем vvsector85
0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
1 час назад, vvsector85 сказал:

@aegis Здається, в такому режимі не вийде визначати напрямок обертання, а у цьому проекті він визначається, хоча я не зовсім розумію, навіщо.

Чому не вийде визначити напрямок?

Дуже навіть вийде: два меандри, із зміщенням фази 90°

Щодо навіщо, права та ліва різьби.

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Все ж таки подивився в описі прошивки, там сказано "Энкодер 1800 линий, обрабатывается в х2 режиме (3600 импульсов на оборот)".

Щодо напрямку обертання, все одно не розумію - там вручну обирається напрямок нарізання різьби (тобто напрямок руху супорта), але різьбу можна різати хоч праву хоч ліву в кожному напрямку, і це вже залежить від сторони обертання шпінделя (ну і різець з відповідного боку повинен стояти). Навіщо МК знати про напрямок обертання?

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
7 часов назад, vvsector85 сказал:

код

Почему на Си всё так заумно. 

Вообще обработку валкодера просто и удобно делать по прерывания ножек. Настраивается одна ножка на прерывание например по спаду или по фронту. Это не важно. При возникновении прерывания идём в обработку прерывания и смотрим на состояние второй ноги подключенной к валкодеру. Если пин в 0 то вращение вправо, если 1 но влево.

 

Обработка всех состояний по коду Грея что даёт учетверение импульсов  делается  простой математикой.

Две ноги на которые подсоединяется валкод настраиваются на прерывания по фронту и спаду.

Все переменные байтовые а Val_A и Val_B это пины к которым подключается валкодер. Их состояние 0 или1.

А далее простая арифметика

 Laststate = Val_B * 2 
 Laststate = Laststate + Val_A
 Rotation = Prevstate * 4
 Rotation = Rotation + Laststate
 Rotation = = Rotation + 1

 Prevstate = Laststate  'запомнить отработанное состояние для обработки в следующем цикле входа  в прерывание.

 В Rotation получается число от 0 до 15 напрямую зависящее от состояния.

Его можно просматривать по таблице.

0LR0R00LL00R0RL0

Где 0 состояние не изменилось,  L вращение было влево а R вправо.  Данный код отлично работает и с механическими энкодерами. 

При вращении влево Rotation будет 2-8-15-9. Вправо 5-3-12-14

А далее классика обработки L/R 

Так же данный код отлично работает при опросе по таймеру.  Применяю его много лет. Но на Си мало что делаю. На ассемблере сижу. Нудно и долго по нынешним временам, но быстрее и компактнее кода не бывает. В АТмега 8 влазит то что на арудине в мега328 не влезает. Ну и быстродействие соответственно. 

 

Змінено користувачем Andi_radio
2

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
10 часов назад, Andi_radio сказал:

При возникновении прерывания идём в обработку прерывания и смотрим на состояние второй ноги подключенной к валкодеру. Если пин в 0 то вращение вправо, если 1 но влево.

Не все так просто, при таком алгоритме, если совершать мелкие вращения туда сюда в пределах одного деления, счетчик будет инкрементироваться в одну сторону, что будет давать ошибку.

Скорее всего, я изобрел велосипед, но в своем намоточном станке я сделал так (здесь приведен код линейного энкодера, который стоит на натяжителе, но это сути не меняет)

Идея в том, что после срабатывания прерывания по растущему фронту, условие срабатывания прерывания меняется на спадающий фронт и наоборот, соответственно. При такой обработке сигнала с энкодера получается удвоенное количество импульсов и решается проблема с ложным инкрементом.



ISR(INT2_vect)//прерывание энкодера натяжителя
{
    static volatile char edge;
    edge=edge^_BV(1);
    
    if (edge){
            EICRA&=~_BV(ISC20); // Внешнее прерывание по спадающему фронту на INT2

                    if (TENS_encB_P&_BV(TENS_encB_PIN))
                    {
                        TENS_enc_imp++;
                    }
                    else
                    {
                        TENS_enc_imp--;
                    }

            } // Внешнее прерывание по падающему фронту на INT2
    
    else{
        EICRA|=_BV(ISC20); // Внешнее прерывание по растущему фронту на INT2
    
                    if (TENS_encB_P&_BV(TENS_encB_PIN))
                    {
                        TENS_enc_imp--;
                    }
                    else
                    {
                        TENS_enc_imp++;
                    }
    
    }
  }

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Переривання ніби можна одразу налаштувати і по зростанню і по спаду, прикол в тому, що задіяні два виводи, на кожному преривання. Коли спрацьовує, до прикладу, переривання на виводі "а", то в обробнику переривання аналізуємо стан обох виводів. І так як відомо який вивід викликав переривання, то аналіз поточного стану, дає чітке розуміння куди рухаємось. Навіть якщо теребити датчик в межах спрацювання лише одного виходу енкодера ("0/1" туди-сюди), то в одну сторону переривання викликано зростанням сигналу, а в іншу спадом, при цьому стан іншого виводу буде сталим.

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
6 часов назад, vvsector85 сказал:

Идея в том, что после срабатывания прерывания по растущему фронту, условие срабатывания прерывания меняется на спадающий фронт и наоборот, соответственно.

Занадто затратне рішення, з точки зору кількості мікроконтролерних циклів на виконання такого фінта.

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Створіть акаунт або увійдіть для коментування

Ви маєте бути користувачем, щоб залишити коментар

Створити акаунт

Зареєструйтеся для отримання акаунта. Це просто!


Зареєструвати акаунт

Увійти

Вже зареєстровані? Увійдіть тут.


Увійти зараз

  • Зараз на сторінці   0 користувачів

    Немає користувачів, які переглядають цю сторінку