• Объявления

    • softm

      Добавления в правила   23.10.2018

      4. Правила сообщества 4.1. Пользователи с количеством сообщений менее 20,  или сроком регистрации менее 30 дней , или с рейтингом на форуме менее 20-ти, не имеет права заносить никого в игнор-лист по сообщениям форума.
Gnevko

Электронная гитара для Paulimot 190-V (Arduino)

149 сообщений в этой теме

Приветствую всех обитателей форума! 

 

Как то так получилось, что увлекли меня видео блоги ДМ, Дмитрия, BrunS, Виктора Леонтьева и прочих творческих людей. Результатом этого увлечения стало приобретение маленького настольного китайца под немецкой маркой Paulimot:

large.P1100023.jpglarge.P1100022.jpg

 

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

 

В интернете подобные решения встречаются достаточно часто и на какую то особенность моя попытка уж точно не претендует.

Комплектующие, которые были заказаны для данного проекта:

 

1) Шаговый двигатель NEMA 23 (4.2A) + драйвер к нему

large.59fe059e705f5_2017-11-0419_22_20.png

 

2) Электронный "маховик" на 100 импульсов

large.59fe1640070f8_2017-11-0420_31_36.png

3) Джойстик 4х позиционный с "залипанием"

large.59fe1641b315a_2017-11-0420_32_00.png

4) Энкодер на шпиндель

large.59fe163e61ce7_2017-11-0420_30_43.png

5) Экран для вывода информации 4х строчный 

large.59fe1645b7b6e_2017-11-0420_33_04.png

6) Энкодер для выбора шага резьбы и/или подачи и других плюшек, 20 позиций на оборот

large.59fe1646b73ea_2017-11-0420_33_31.png

7) Передача 1:1 на ремне

large.59fe164359abc_2017-11-0420_32_38.png

8) и собственно Arduino Mega 2560 (их уж было у меня)

large.59fe19a6d52b5_2017-11-0420_48_32.png

 

Шаговик с драйвером пришли достаточно быстро, и дабы хоть как то приступить к программированию, был сделан небольшой испытательный стенд

 

large.P1100021.jpg

 

За неимением пока что джойстика для включения подачи, решил прикрутить нунчаку от Wii, и ... это решение настолько оказалось удобным, что решил его так же включить в будущую финальную версию. Одним этим джойстиком можно управлять не только подачей суппорта, но и поперечными салазками (в будущем). А пока что на данный момент получилось как то так:

 

 

6

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сподіваюсь тема буде розкриватись трохи глибше ніж "показ як воно крутиться"

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Тема интересная.

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

в механіці безпроблем,

тут шось мене це смущає очікування доки пнідєль зробить 360.....

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

ну і уці тоді зробити примітивне, раз заморочуватись будеш

П.С. шось він мені тв16 нагадує

Изменено пользователем voronin_10
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо за отзывы и за то, что не прошли мимо. Проект находится в самой начальной стадии и конечно же ради пары секунд видео "с як воно крутится" городить огород не стоило (есть много других способов потешить свое ЧСВ). Так шо дали буде :)

 

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

 

1) Цель проекта - это не только 4-3 килограмма, стоп, не то .... это не только собственно электронные шестерни на моем станке, но и возможность повторить их и на других станках. Ведь по сути изменить нужно будет только силовую часть, вся логика управления останется прежней. Не все первоклассные токари - прирожденные программисты и не все программисты - прирожденные токари, так что ваше мнение очень важно и нужно.

 

2) Шаговый двигатель: NEMA23 (это один из стандартов размеров шаговиков). Вот подробная информация о нем.

large.59feccf5e6e3d_2017-11-059_33_30.png

 

Для маленького настольного станка это, наверное, более чем достаточно, но больше мощности никому еще не мешало.

 

3) Драйвер для шагового двигателя: тип  PUL/DIR/ENA

large.59fece26126a1_2017-11-059_38_40.pnglarge.59fece59e7b11_2017-11-059_39_37.png

 

Такому драйверу необходимо по сути три сигнала и соответственно три пина на Arduino: PUL - каждый импульс на этот пин будет принуждать драйвер сделать один шаг(или микрошаг, об этом ниже), DIR - определяет направление вращения вала по часовой или против часовой стрелки, ENA - включает или выключает подачу напряжения на обмотки двигателя. Очень часто можно встретить мнение, что ENA не нужно вообще трогать - я с этим не согласен. Пример: вы оставили джойстик в положении автоматической подачи, или случайно задели его перед включением гитары. В этом случае, при включении, Arduino проверит положение джойстика и автоматически обесточит шаговик, если положения джойстика отличны от нейтрального. 

 

Для управления драйвером я буду использовать библиотеку AccelStepper (http://www.airspayce.com/mikem/arduino/AccelStepper/). Конечно же можно было бы обойтись и без нее, но изобретать велосипед в этой области как то не хочется:

#define Z_STEP_PIN 53
#define Z_DIR_PIN 52
#define Z_ENABLE_PIN 46

//инициализация шагового двигателя
AccelStepper zStepper( AccelStepper::DRIVER, Z_STEP_PIN, Z_DIR_PIN); //interface, pin1 - Step, pin2 - Dir

//определение ENA пина 
zStepper.setEnablePin(Z_ENABLE_PIN);

//для моего драйвера необходимо было инвертировать сигнал на ENA пин 
zStepper.setPinsInverted(false, false, true);

//подача напряжения на двигатель
zStepper.enableOutputs();

Драйвер позволяет выставить кол-во микрошагов, так как шагать в полные 200 шагов на оборот вала двигателя - это слишком грубо и рывками. На разных ресурсах, посвященных ЧПУзации станков, советуют выставить 1/16 шага или 3200 микрошагов на оборот. Так и сделаем (переключатели SW5 - SW8), в дальнейшем эта цифра (3200 оборотов в секунду) нам пригодиться в расчетах. Кол-во ампер (переключатели SW1 - SW3) подбирается экспериментальным путем, главные критерии - отсутствие пропусков шагов с одной стороны и избежание чрезмерного перегрева двигателя - с другой.

 

4) Согласование скорости вращения шпинделя и скорости вращения шагового двигателя. Этот пункт наверняка вызовет одни из самых горячих дискуссий, но зима близко и лишнее тепло не помешает. 

 

Есть несколько мнений по поводу того, с какой частотой считывать скорость вращения шпинделя:

   а) Чем чаще тем лучше. Это казалось бы очевидный вывод, но он имеет как ряд недостатков так и преимуществ: большое кол-во импульсов способно очень сильно "затормозить" микропроцессор Arduino, а ему еще ж и шаговиком в реальном времени управлять нужно. Что бы решить эту проблему люди (в небезызвестной теме в другом форуме) выделяют дополнительный микроконтроллер только для обработки импульсов с энкодера. Так же становиться проблематично определить конкретное положение шпинделя (что бы при повторном включении гитары сново "попасть" в резьбу), обычно для этого ставят дополнительный энкодер. Положительный момент - это позволяет вычислять угол поворота шпинделя.

 

 б) Достаточно одного импульса на поворот шпинделя. К примеру Mach3 требует именно одного импульса на оборот, так это уже уровень ЧПУ станка, а у нас всего то электронные шестерни. Один импульс на поворот убирает сложность в обработке большого числа импульсов, упрощает тем самым всю архитектуру проекта, и является достаточным что бы определить скорость вращения шпинделя (а это в общем то нам и нужно), так же решается проблема с начальной меткой (так как она всего одна), но не позволяет определить угол наклона (однако создание делительной головки в цель проекта не входит). 

 

Как вы уже догадались, я остановился на втором варианте. В подтверждение своего решения приведу ссылку на один немецкий источник, так как раз переделывался "мой" станок в ЧПУ под Mach3: http://www.einfach-cnc.de/paulimot_pm190.html (там очень много фотографий и очень мало текста, так что знание немецкого не обязательно для общего понимания процесса). А вот и нужная нам фотография с этого ресурса:

p1040886.jpg

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

 

5) Определение скорости вращения шагового двигателя. Итак, у нас есть два входных параметра:

  а) скорость вращения шпинделя: обороты в минуту (определяется по сигналам с энкодера) 

  б) заданная скорость подачи суппорта: мм на оборот ( то ли для обработки детали, то ли для резьбы - разницы то по сути никакой). В начале мне казалось правильным предусмотреть не только синхронную подачу суппорта, но и асинхронную - но это быстро прошло.

 

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

/*
   spindleSpeed - обороты в минуту. Пример - 360 оборот/мин
   supportSpeed - mm за один оборот. Пример - 0.08 мм/оборот

   Формула: ((spindleSpeed / 60) * supportSpeed) / mmPerZStep = stepsPerSecond
   
*/
float convertSpindleToZStepperSpeed(float spindleSpeed, float supportSpeed)
{
   float spindleRevolutionsPerSecond = spindleSpeed / 60; //revolutions per second. Example - 360 / 60 = 6 revolutions
   float forcedSupportMMPerSecond = spindleRevolutionsPerSecond * supportSpeed; // mm per second. Example 6 * 0.08 = 0.48 mm
   float stepsSecond = forcedSupportMMPerSecond / mmPerZStep; // steps per mm per second. Example 0.48 / 0.000625 = 768 steps

   return stepsSecond; //итог вычисления 768 шагов в секунду
}

Устанавливаем скорость вращения шаговика в основном цикле программы:

zStepper.setSpeed(stepsSecond * zFeedDir); //где zFeedDir - может быть 1 или -1 и определяет направление вращения
zStepper.runSpeed();

Здесь нужно пояснить значение переменной mmPerZStep, равной 0.000625мм. Шаг винта подачи суппорта в моем случае - 2 мм, шагаем мы микрошагами в 3200 шагов на оборот вала шагового двигателя, таким образом за один шаг суппорт передвигается на 2мм / 3200 = 0.000625мм.

 

По итогам вычислений можно привести следующую таблицу зависимости скорости шаговика (в шагах в секунду) от скорости вращения шпинделя : 

large.59feea7616279_2017-11-0511_38_40.png

 

Поскольку реальная гарантированная скорость вращения шаговика не превышает 5000-6000 шагов и секунду, то можно сделать вывод, что нарезать резьбу с шагом 3 на скорости 1700 оборотов в минуту навряд ли удасться :) Если же это будет необходимо, то нужно понижать кол-во микрошагов, скажем с 3200 до 800.

 

Продолжение будет следовать по мере поступления деталей из Поднебесной и установки их на тестовый стенд.  

Изменено пользователем Gnevko
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Такая мысль имеет право на жизнь. Однако преимущества не очевидны (в этом конкретном случае), а недостатки могут вызвать относительно негативные последствия. Позвольте пояснить.

 

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

 

В любом случае конечно же нужно стремиться свети занятость основного цикла программы к минимуму. Например опрашивать положение джойстика и других органов управления не каждый цикл, а с интервалом в 100 миллисекунд (а то больше), причем постараться разнести по времени опрос разных органов управления таким образом, что бы за один цикл опрашивался только один из них.  Вычислительных мощностей Arduino Mega для такой задачи должно хватить с головой. 

Изменено пользователем Gnevko
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 минут назад, Gnevko сказал:

Прерывание не является заменой параллельности вычислений.

Переривання дадуть точність при розрахунку чатоти обертів, щоб менше доводилось займатись "зглажуванням", та усередненням отриманих інтервалів.

5 минут назад, Gnevko сказал:

Процессору все равно прийдется на него отвлечься, остановив выполнение основной программы и место такой остановки не предсказуемо. К примеру, процессор начал посылать на драйвер сигнал, но тут случилось прерывание и этот сигнал оказался слишком долгим ... и так далее.

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

 

Я в жодному разі не маю за ціль "пусте сперечання", натомість пропоную "конструктивне сперечання" :D, яке дасть результати. Тому що сам зацікавлений в тому щоб запрацювало добре.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Теория теорией, а практика расставит все на свои места :) 

 

Возможно в итоге прийдется таки использовать прерывания, возможно, что прийдется увеличить число "окон" до пары десятков - все мои рассуждения ничего не стоят, до тех пор пока не пройдут проверку практикой. 

 

ЗЫ: записывать прийдется не только время изменения, но и кол-во таких изменений, что бы исключить их пропуск. Пример: время первого изменения сигнала энкодера было записано, основная программа не успела приступить к обсчёту результатов как случилось второе изменение, время которого переписало время первого. И вот наконец то основной цикл дошел до обработки полученной информации, а теперь вопрос - сколько изменений было на самом деле? Или другими словами на сколько успел провернуться шпиндель? Так что прийдется считать кол-во изменений и сбрасывать этот счетчик в ноль после каждой обработки результатов. 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

10 годин назад, Gnevko написав:

Достаточно одного импульса на поворот шпинделя.

 

Мені у голові не поміщається, як це буде працювати. Якщо один імпульс на поворот - потрібна велика і фіксована швидкість обертання шпінделя. Чому велика? Щоб завдяки ефекту гіроскопа патрон обертався рівномірно. А як на великій швидкості вчасно зупинити верстат? А як же розгін суппорта? Це ж велика маса. Закон збереження імпульса каже, що він не може стартувати миттєво, щоб його вивести на швидкість потрібен час. Інакше кроковий двигун просто почне пропускати кроки.

 

Крім того, коли різець вріжеться у заготовку - швидкість суттєво впаде. І що ж тоді? Адже швидкість уже розрахована на холостому ходу і її не вийде більше міняти...

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

:sm1:

xD

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
8 часов назад, Quercus сказал:

Мені у голові не поміщається, як це буде працювати. Якщо один імпульс на поворот - потрібна велика і фіксована швидкість обертання шпінделя. Чому велика? Щоб завдяки ефекту гіроскопа патрон обертався рівномірно. А як на великій швидкості вчасно зупинити верстат? А як же розгін суппорта? Це ж велика маса. Закон збереження імпульса каже, що він не може стартувати миттєво, щоб його вивести на швидкість потрібен час. Інакше кроковий двигун просто почне пропускати кроки.

 

Крім того, коли різець вріжеться у заготовку - швидкість суттєво впаде. І що ж тоді? Адже швидкість уже розрахована на холостому ходу і її не вийде більше міняти...

 

Замысел в том, что бы вычислять скорость "на лету" при получении каждого импульса с энкодера или что в данном случае пока что одно и тоже - при каждом обороте шпинделя.

 

Я не большой специалист в токарном деле, да и вообще слово "специлист" ко мне не применимо в этом контексте, однако, что то мне подсказывает, что то ли обработку поверхности, то ли нарезание резьбы не начинают прямо вот у самой заготовки, обычно отводят резец немного левее заготовки (как минимум что бы выбрать холостой ход винта), включают подачу ... ну и так далее.  В нашем же случае это так же будет способствовать выходу шаговика на нужные обороты. Здесь нужно учитывать так же несколько моментов:

1) резбы не режут на больших скоростях (обычно)

2) шпиндель так же не разгоняется мгновенно - вот вам и плавный набор скорости у шаговика

3) в случае, если удасться реализовать автоподачу без остановки главного шпинделя, то отвот резца влево с определенным запасом - это наше все.

 

Как то так.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Да, мач так делает, но он расчитан на ЧПУ, когда привод суппорта идет через безлюфтовую швп. И начало движения резца скорее всего синхронизируется по импульсу с датчика, и реец при возврате всегда выводится в одну и ту же точку и с нее начинает заход. Но точности шага при нестабильной скрости шпинделя все равно это не гарантирует.

 

Я в своей гитаре использовал промышленный энкодер на 2880 импульсов на оборот шпинделя (можно также использовать энкодер от принтера, бывают диски на 1800 меток), импульсы на шаговый двигатель получаем с помощью алгоритма Брезенхема. Теоретическая погрешность шага на большинстве резьб отсутствует. Но желателен быстрый проц - у меня СТМ32 F103 72Мгц. (эта платка кстати намного дешевле ардуины мега)  Энкодер висит естественно на прерываниях. 

 

Изменено пользователем DimonDSS
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А чому де взяти і повторити чиюсь конструкцію. На російському чіпмейкері з десяток варіантів з ротовими прошивками

 

1 минуту назад, DimonDSS сказал:

промышленный энкодер на 2880 импульсов

А можно подробнее... Марка, где купить?

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У мене конкретно - радянський ДДР-720 (от подібний 1000 положень, тобто можна отримати 4000 станів на оборот) https://skylots.org/6538239890/DDR-1000-Datchik-rezbonarezaniya

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

Зараз це все буде ставитись на відновлену ТВ-шку, тоді покажу як воно, Поки є тільки старе відео

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1 імпульс на оборот не реалізуєте на ручних станках, ці списи вже поломали на .ру

Ліпіть енкодер на шпіндель, як проц беріть stm32, мега це тупік.

Готовий взяти учать у проекті, так як у самого є бажання причепити собі таке.

 

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Панове, побольше патриотизма, как же можно допустить, что бы на .ру было больше поломаных спиц, чем здесь!? :D

 

А если серьезно, то давайте дождемся практических испытаний, от них и будем плясать.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
, Gnevko написав:

Электронный "маховик" на 100 импульсов

Розкажіть ще будь ласка про цю штуку

1. Всередині оптика чи механіка?

2. Крутиться вільно / з натягом / з фіксацією на кожній поділці?

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Много я вам рассказать про эту штуку не смогу, пока не возьму в свои руки. Судя по видео на ютубе крутится легко, но с фиксацией на каждом делении. Обычно к ней заказывают в придачу еще энкодер на 3-4 позиции при помощи которого можно будет выбрать масштаб/цену одного деления, к примеру: 1мм, 0.1мм и 0.01мм (для особо точных маневров).

large.5a008053a1f2b_2017-11-0616_29_18.png

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
9 годин назад, DimonDSS написав:

Я в своей гитаре использовал промышленный энкодер на 2880 импульсов на оборот шпинделя (можно также использовать энкодер от принтера, бывают диски на 1800 меток), импульсы на шаговый двигатель получаем с помощью алгоритма Брезенхема. Теоретическая погрешность шага на большинстве резьб отсутствует. Но желателен быстрый проц - у меня СТМ32 F103 72Мгц. (эта платка кстати намного дешевле ардуины мега)  Энкодер висит естественно на прерываниях. 

А можна більш детальніше про програмну реалізацію алгоритма.

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
16 часов назад, [email protected] сказал:

А можна більш детальніше про програмну реалізацію алгоритма.

1. При виборі величини подачі чи кроку різьби ми вираховуємо, скільки імпульсів step потрібно подати на драйвер крокового двигуна за один оберт шпінделя.  Якщо отримуємо дробову частку то заокруглюємо по правилам - якщо менше 0,5 то до 0 якщо >=0,5 то до 1. В принципі це виникає тільки на дюймових різьбах і то не на всіх. Назвемо цю величину N.

2. Кількість імпульсів з енкодера на повний оберт (якщо ми використовуємо алгоритм який розпізнає кожну позицію, тобто імпульсів в 4 рази більше ніж міток на диску енкодера, то враховуємо це) - назвемо P.

   Отже фактично щоб отримати імпульси на драйвер нам потрібно ділити P на N. Наприклад маючи P=1000  N=300 імпульс на драйвер потрібно подавати кожний 1000/300=3,3333 імпульс з енкодера. Звичайно таке не можливо при роботі з дискретними величинами, тому тут ми вкористовуємо Цілочислений алгоритм Брезенхема. Фактично імпульс буде подаватись деколи через 3 імпульса енкодера, деколи через 4, але сумарно за оберт шпінделя ми вийдемо на нульову похибку у більшості випадків.

ОБМЕЖЕННЯ МЕТОДУ - НА НАЙБІЛЬШІЙ ПОДАЧІ ЧИСЛО ІМПУЛЬСІВ ЕНКОДЕРА ЗА ОБЕРТ ШПІНДЕЛЯ ПОВИННЕ ЗАЛИШАТИСЬ БІЛЬШИМ НІЖ ЧИСЛО ІМПУЛЬСІВ НА ДРАЙВЕР КД. Тут просто при розрахунках треба вибрати правильний поділ кроків.

 

3. При включенні подачі ми задаємо початкове значення "помилки" для алгоритму Брезенхема ERR=-P

4. Виходи енкодера підключаємо до входів зовнішнього переривання.  Тут можна використати два варіанти - або переривання відбувається тільки по передньому фронту виходу А, в обробнику переривання ми аналізуємо сигнал на виході В для отримання напряму обертання (алгоритм простий, швидкий і чітко працює, але ми отримуємо 1 імпульс на позицію енкодера)

Другий варіант - отримати 4 імпульси на позицію, тут потрібно 2 переривання настроєних на обидва фронта сигналів А В. Алгоритм визначення напряму обертання більш складний в такому випадку, і іноді він може давати збої   В принципі якби в мене був енкодер на 1800 ліній то я б використав перший, а так як всього 720 то другий.

В залежності від напряму обертання встановлюємо сигнал дір на драйвері (це в принципі потрібно тільки для нарізання різьби з реверсом шпінделя).

5. Отже коли ми в перериванні виявили імпульс з енкодера то проводимо ітерацію алгоритма Брезенхема

    ERR=ERR+2*N

    if (ERR>=0) {

            ERR=ERR-(2*P);

            подаем імпульс степ;

            }

 

Якщо треба, пишіть в лічку, я можу скинути проект цілком. 

 

 

 

2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Просто замечательный ответ! И замечателен он не только своей развернутостью, но и возможностью для меня опираясь на него объяснить разницу в подходах согласования скорости вращения спинделя и подачи суппорта.

 

@DimonDSS Реализовал, если я правильно конечно же понял идею, некое подобие делительного аппарата. На каждый имульс энкодера делаем нужное кол-во шагов. Чем больше импульсов энкодера, тем меньше ког-во шагов на импульс, и соответственно тем "плавнее" подача суппорта. При таком подходе просто жизненно необходимо огромное число импульсов (особенно на малых оборотах). И как следствие повышенное требование к тактовой частоте процессора.

 

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

 

И как все в этом мире, оба подхода имеют право на жизнь, каждый со своими достоинствами и недостаткими.

Изменено пользователем Gnevko
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Делительный аппарат он и есть. Просто на каждый импульс энкодера мы или делаем или не делаем импульс на ШД в зависимости от коефициента деления.  Для точности лучше когда энкодер с большим количеством импульсов на оборот.  Да, это требует быстрого проца, особенно при работе с большими оборотами (это вообще сейчас не проблема с стм ками то, они часто стоят дешевле атмег) но я встречал реализацию и на атмеге, но нужна хорошая оптимизация кода. В принципе если использовать только один выход энкодера на прерывание то математика там несложная. Все коефициенты нужно вычислить до включения подачи. 

Второй подход он конечно имеет право на жизнь, но когда частота шпинделя не стабилизирована, и может менятся под нагрузкой от сил резания мы можем получить погрешности шага резьбы. Хотя можно сделать шторку например на 8 лепестков и повысить точность (но сама шторка должна быть выполнена точно). 

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

 

А в моей системе есть еще один плюс - она у меня работает также как делительное устройство (показывает угол поворота шпинделя).

Изменено пользователем DimonDSS
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, DimonDSS сказал:

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

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

Изменено пользователем Gnevko
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@DimonDSS Дякую за відповідь. Проект булоб цікаво подивитись. 

2 години назад, Gnevko написав:

некое подобие делительного аппарата.

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

P.S. Наприклад є завдання: поправити різьбу на якомусь валу (чітко попастиву вже існуючу різьбу). Як у вас це буде реалізовано??

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас