сервопрвод от Jina

Jina

Хочу предложить вашему вниманию сервопривод схему на который в свое время разработал Чен, а в последствии переработал Художник и Arisov77.
Когда этот привод был собран радости не было предела, но лишь до состояния когда начались испытания на реальном станке. Вот тут и начались траблы то с пид настройками, то с недокрутами.
Методики настройки не удалось вычитать на форуме, а в просторах инета описанная метода к положительному результату не привела. В результате пришлось заняться своим написанием этого сервопривода. За основу было взято схема по которой собирали Художник и Arisov77, ну что бы
не делать новое и использовать то что есть.
Во главу угла ставилась задача что бы привод принимал сигналы step, ни в коем случае не потерять ни единого импульса и повернуть вал с энкодером именно на то колличество шагов которое пришло на вход этого сервопривода и при этом как можно меньше возиться с настройками.
Тут следует немного остановиться на двигателях которые спользовались мной как тестовые. Читая всякие писания по поводу того что серводвигатель должен быть строго специлизированый и все такое бла , бла , бла мне как то в руки попал моторчик с какого то принтера с приделанным энкодером на 384 шага. Был шок от того что это подобие на двигатель работало прекрасно.
Внутри в качестве статора использовались редкоземельные магниты , два штуки, а на роторе было восемь или девять полюсов. Суть вопроса вот в чем. Если крутить ротор пальцами , то двигатель как бы шагает, представьте сколько линеек (рисок) на энкодере сразу проскакивает?
Это получается 384\8 , а как же тогда промежуточные значения? То есть двигатель должно просто колбасить в этих промежутках, что в прочем и подтвердилось в последствии, но с одной особенностью, из за неправильных настроек в регуляторе. Потом пошли в дело всякие двигатели до которых вообще удалось дотянуться.
Немного слов про энкодер. Энкодер был взят изначально мышачий, не смотря на то что оный изначально задумывался как низкоскоростной, тем не менее показал прекрасные результаты на скоростях заведомо выше чем у шаговиков. Брались энкодеры и с принтеров, но там при относительно небольших скоростях наблюдались пропуски шагов, т е если крутить
медленно , как в принтере, то все работает, а если быстрее то наблюдается пропуск , в общем ни один энкодер с принтера на скоростях в 500-1000 об/мин не вернул вал в изначальное положение. Всякие опыты с дисками , не родными дисками, показали отвратительный результат, если диски напечатанные на пленке хоть как то работали , то с прорезными полная попа.
В общем мышачий энкодер рулит, при условии использования родных свето-фото пар.
Я умышленно опускаю опыты с нормальными энкодерами потому как работают оные супер, ну да они и изначально задумывались для этого.
Теперь вернусь опять к моторам. Опыт показал что чем тяжелее ротор у двигателя , тем менее он подвержен ,колбасению, в промежуточном положении между полюсами ротора.
Другими словами хочу сказать что двигатели можно брать любые удобные, ставить туда энкодеры, в том числе и мышиные и это работает.
В качестве подопытного был мною избран двигатель DYNAMO в роде бы болгарского рождения с силой 0.3Nm как самые перспективные в соотношении цена-качество исходя из моего семейного бюджета и с применением мышиного энкодера, потому как жаба душит за энкодеры отдавать много денег.
В качестве среды написания программ для сервопривода была мною избрана программа Algorithm Builder рожденная Громовым , дай бог этому человеку вечной молодости, но в связи с тем что в этой среде пишут далеко не все то предлагаю пообщаться описательными образами.
Итак, как работает программа? Ну в начале там инициализация и все такое, потом выход в основной закольцованный круг. Есть три таймера счетчика, первый работает на опрос энкодера, второй работает на шим, третий работает на непосредственно пид.
Долго в голову не приходила идея как организовать направление вращения двигателя, а потом осенило. Если взять число, например 255 и разделить его пополам то получится два раза 127 и остаток 1 , вот эта единица и есть направление. В логике контроллера это выглядит так,
если в регистр записать при инициализации число 127 , то таким образом принимаем это за 0 движения, импульсы приходящие от источника step и dir, в зависимости от положения dir либо прибавляет
либо отнимает число от регистра с числом 127. Рассмотрю подробно, если к числу 127 прибавлять то восьмой бит этого регистра изменится с нуля на единицу , это и есть направление, значит надо включить разницу между полученным числом и 127 в шим таймера счетчика, что в свою очередь приведет к движению двигателя и соответственно к движению энкодера,
а информация(импульсы) с энкодера будет убавлять из вышеупомянутого регистра что в итоге должно привести число этого регистра к 127 и двигатель остановится.
То же самое и в другую сторону, суть вопроса в том что источник прибавляет число(со знаком) к регистру, а энкодер соответственно вычитает(со знаком) из этого регистра, разницу между полученным значением регистра и 127 пишем в таймер счетчик шим , чем больше разница
тем быстрее крутит двигатель.
продолжение следует

Шим работает так, значение разницы пишется в регистры шим , в нашем случае OCR1A и OCR1B.
Логика такова, в зависимости от значения восьмого бита в регистре с числом 127 записываем разницу
предназначенную для шим либо в OCR1A(тогда отключаем OCR1B-) или OCR1B (тогда отключаем OCR1А).
Как только регистр станет равен 127 отключаем OCR1A и OCR1B одновременно и двигатель останавливается.
А теперь самое для меня непонятное. Так как я только учусь програмить микроконтроллеры.
Еще один таймер счетчик работает на так называемый пид. Я получаю шесть значений, входные импульсы до,
входные импульсы после, считаю значение разницы входящих импульсов до и после за единицу времени,
число значения регистра(тот который со 127) до, число значения после, и число разницы
до и после за единицу времени. Число разницы регистра пишу в шим(в соответствующее направление)
и прибавляю разницу(со знаком), сюда прибавляю текущее значение входных импульсов и разницу
входных импульсов (со знаком). В зависимости от знака операции получаю значение ускорения
или торможения двигателя ,в зависимости от величины ошибки.
Собственно пид я рассматриваю как операционник с положительной и отрицательной обратной связью
в котором я устанавливаю два значения, коэфициент значения минимального выходного значения и максимального.
Для чего это надо? Минимальным значением подбираем цифру от 255 до 1 для того что бы двигатель
приобрел ,колбасение, явно затухающего характера, а максимальным значением от 255 до 1 подбираюсь
к максимальным оборотам двигателя. В прочем последнее значение напрямую зависит от количества линеек(рисок)
в энкодере и способностью привода эту скорость осилить. Другими словами, чем более ,линеестый,
энкодер тем медленнее крутится двигатель.
В угоду быстродействия, все таки контроллер 8бит и кварц 16Мгц, я настраиваю в самой прошивке
не используя EEprom как элемент нестабильности или uart как элемент требующий время на обслуживание.
Целью было использовать схему предложенную Художником и Arisov77 и контроллером там установленным.
Испытания , например на AtMega16 показала большую стабильность в работе , хотя ядро у данного
семейства микроконтроллеров одинаковое, видимо оный как то по другому делают чем AtMega8.
Устраивая всякие катаклизмы двигателю удалось подогнать пид под довольно приемлемую работу,
при этом привод всегда возвращался в начальное положение. Непонятно насчет килостепов.
На просторах инета пишут что используя AtMega2313 на 20Мгц удалось добиться 350 килостепов ( это UHU),
на AtMega8 и 16Мгц одни пишут 100 килостепов , другие 150. У меня же получается
при 6000 об/мин и 384 шагах энкодера, получаем 6000х384/60=38.4 килостепа. Ну можно еще немного увеличить,
почти 40 килостепов получить после чего появляются пропуски шагов, подчеркну, это на мышином энкодере,
при этом у меня код длинной около 700 байт занимает. Это как минимум меньше чем у Чена или Художника,
а работает получается медленней? Очень хотелось бы понять что такое сервоцикл и что в него входит?
Приму в дар, если мне подробно расскажут как работает переработанная прошивка на сервоконтроллер Чена.
К сожалению в ассемблере пока мало что понимаю , а разобраться очень хочеться.

мой сервопривод.zip

Baha

есть книжка, Аналоговые интерфейсы микроконтроллеров, автор С.Болл, описано ПИД управление, различными устройствами, в том числе двигателями. Может пригодится, описано очень доступно, для практического применения, без лишней воды и теорий.

Jina

ага, занятная книжка, спасибо ,читаю

вот такое видео😍

rutube.ru/tracks/5698368.html

качество правда никакое но хоть что то видно

8 days later
Jina

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

вот мой энкодер и движек

мой сервопривод2.zip

cd-print

Если правильно вкурить теорию ПИД управления то там можно увидеть что интегральную и диффиренциальную составляющую можно считать не только по предпоследнему шагу, как у большинства программ но и за несколько предидущих итераций. Тогда за 5-10 итераций интергральная состовляющая вырастит до необходимого значения и “дотянет” мотор до нужной позиции.
Надеюсь я понятно высказался.

Энкодер от мышки просто класный.

4 months later
Jina

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

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

что то не получается вложение сделать, попробую позднее

22 days later
Jina

ура , удалось плату выложить😒

и даже схему удалось загрузить:o

на данный момент пытаюсь прописать люфт в шагах энкодера, собсно ввести люфт получается кроме скорости самого люфта , чего то у меня бардак получается , а если его резко выбирать при моем редукторе то стук неприятный получается , в общем если у кого есть мысли какие то то излагайте , интересны новые какие то идеи
еще вопрос , у меня периодически пропадает тема “драйверы и контроллера cnc” это только у меня или у кого то еще?

новый привод.zipсхема моего сервопривода ATMega 16.zip

3 months later
Jina

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

прошивку выложу чуть позднее

9 months later
mm1508

Здравствуйте Jina, я внимательно слежу за всеми разработками ЧПУ самодельных станков. Очень хотелось посмотреть если можно вашу разработку.
Почему-то все темы плавно закрываются не имея логического завершения.
Заранее спасибо.

10 days later
Bmax77

Здравствуйте. Можете разъяснить несколько вопросов? Как я понял вы управляете двигателем импульсами степ, скольким шагам энкодера соответствует один шаг? Какова зона нечувствительности в импульсах энкодера? Или двигатель устанавливается точно импульс в импульс по энкодеру, тогда как боретесь с дрожанием?

Bmax77

И еще поясните, если управляете сигналами степ то получается что нужно чтобы сначала набралось ощутимое рассогласование для того чтобы двигатель начал двигаться.

Jina

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

к вопросу дрожания, пид регулятор есть ни что иное как операционный усилитель с положительной и отрицательной обратной связью, так вот, при установлении параметров пид (как в случае с приводом Чена) надо выбрать такое значение усиления чтобы двигатель мог оперативно обрабатывать ошибку позиционирования, если сделать усиление маленькое то пока там накопиться ошибка пройдёт некоторое время, нам это видно так как будто двигатель вялый, а если усиление большое то двигатель очень резво пытается устранить ошибку и перелетает заданную точку , потом также назад, нам это видно как двигатель колбасит. как тут сделано у меня? я двигатели рассматриваю с точки зрения массы. если двигатель лёгкий то усиление маленькое, а если ротор тяжёлый то усиление большое. у меня на станке стоят двигатели принтерные, где то 0.05н, на станке что собираю 0.3н параметры усиления пропорционально и завышены

Bmax77

спасибо за ответ. поясните подробнее: т е если энкодер с 50 дырок это 200 импульсов(на оборот движения конечно).
вот как раз хотел еще уточнить про накопление ошибки во времени, какое время вы даете двигателю на отработку ошибки, тоесть если придет один импульс степ, то за какое время двигатель должен отработать это рассогласование?

Jina

у меня это выглядит так, если степ не отработан то , наступает время (приблизительно ск\64 это делитель таймера-счетчика) и в шим добавляется еденица, таким образом скважность шима увеличивается, чем дольше ошибка не исправляется тем больше на двигателе напряжение и ток, а значит и момент, вот и наступает момент когда у движка сил хватает. добавлять можно и 2 еденицы больше , это и есть усиление на пид. у меня момент страгивания с места равен 10 из 255 возможных. что касательно измерений в реальном времени, то ответить не могу, скажу лишь что это измеряется милисекундами. у меня позиционируеся двигатель достаточно бодро

Bmax77

Еще раз спасибо, меня какраз интересовал порядок цифр. Пока в симуляторе играюсь там мотор-энкодер не адекватен.

Jina
Bmax77:

Еще раз спасибо, меня какраз интересовал порядок цифр. Пока в симуляторе играюсь там мотор-энкодер не адекватен.

а что за симулятор? если algorithm builder то там надо ручками на пины галки переставлять, долго конечно и нудно

Bmax77

в протеусе играюсь. там проблема в том что не удается от модели мотор-энкодера добиться нужной скорости вращения и колличества импульсов на оборот.

Jina
Bmax77:

в протеусе играюсь. там проблема в том что не удается от модели мотор-энкодера добиться нужной скорости вращения и колличества импульсов на оборот.

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

для повышения быстродействия привода пид надо выносить за пределы контроллера, а для ещё большего быстродействия и математику тоже, контроллеру оставить только надзорные функции, примером служит привод А-300,соб-сно все идеи мои с него вышли

Bmax77

ну l298 уже успешно работает и даже моторчик крутится туда сюда от меги8. Пока с энкодером запара, нет времени диск попробовать сделать. Меня смущает то что двигатель в модели очень долго качается около нулевой точки после останова, а если вводить мертвую зону в несколько импульсов энкодера то соответственно увеличивается отставание от степ на эту величину, хотя качание пропадает. Кстати хотел спросить у вас в алгоритме учитывается, что в данный момент происходит отставание или уже перебег и нужно тормозить или все на чистой математике пид работает? Я пробовал делать пид в железе но он следил за скоростью вращения, и тоже была проблема с плаванием скорости около точки равновесия.

Jina

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

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

Bmax77

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

8 days later
Stillwell

я так понимаю что интерфейса настройка пид нет?

Bmax77

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

Jina
Stillwell:

я так понимаю что интерфейса настройка пид нет?

можно конечно прописать, НО, это увеличит обьём занимаемой памяти, а следовательно надо контроллеру это обработать, а это в свою очередь потребует время которого в угоду быстродействия нету. можно перейти на более мощный микроконтроллер, например stm32 но не каждый пользователь может его запрограмировать плюс цена подороже чем avr на 8бит и программатор аж 5 проводов, выводы я думаю сделаете сами
если же , например, вынести матеатику и пид за пределы контроллера то это соответственно потянет финансовые вливания, что тоже не есть хорошо, зато плюс- увеличение быстродействия, как пример, просчитайте привод A-300

Bmax77

Кстати, вы обошлись в прошивке без арифметики с плавающей точкой?