Металл2024 Реклама
Метобр2024 Реклама

MKS DLP - продолжаем разговор о кастомной прошивке. Часть 2 - шаговый мотор

AndyBig
Идет загрузка
Загрузка
14.08.2020
1980
34
Личные дневники

Подпишитесь на автора

Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.

Отписаться от уведомлений вы всегда сможете в профиле автора.

10

Часть вторая. Первая тут - https://3dtoday.ru/blogs/andybig/mks-dlp-prodolzhaem-razgovor 

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

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

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

Итак.... Китайцы, не мудрствуя лукаво, впихнули в прошивку весь Мерлин только для того, чтобы управлять одним мотором!! Да-да, со всеми осями, экструдерами, нагревателями, калибровками, выравниваниями стола и всем прочим! В составе оригинального проекта - весь исходный Мерлин целиком! Прошивка от MKS отправляет Мерлину текстовые команды для управления осью! У меня просто нет слов, чтобы описать что я чувствовал в тот момент. Это как если бы кто-то взял КАМАЗ для того, чтобы перевозить пару кирпичей. И подъемный кран, чтобы грузить эти два кирпича в КАМАЗ. М-да...  

В общем, я бросил оригинальные исходники, взял из Мерлина исходники управления мотором и начал пытаться отучить их от остального Мерлина, а заодно оставить в них только одну ось и больше ничего. Работы оказалось не на пару часов, как я надеялся. Осложняло дело еще и то, что я никогда в этот Мэрлин не лазил и не был в курсе как у него там все устроено, пришлось все это изучать. По ходу разборок пришлось еще вытащить из него исходники планировщика и обработки концевиков. Все это оказалось довольно сильно переплетено с остальными частями и чтобы все разобрать и сделать автономным, понадобилось много времени. До первого успешного запуска всех этих вырезанных частей в составе моей прошивки прошло, я провозился, пожалуй, с полный рабочий день. Но в конце концов оно заработало :)

Однако звук работы мотора был какой-то подозрительный и я полез в плату осциллографом. Осциллограф показал, что импульсы шагов идут на драйвер пачками по 2-8 штук с довольно большим промежутком между пачками. Почти весь день у меня ушел на поиски проблемы, но найти ее я так не смог. Пока ходишь по коду отладчиком - все хорошо, стоит запустить выполнение без остановок - пачки импульсов с промежутками.

Под конец я решил, что что-то не так кастрировал когда отучал этот кусок Мерлина от всех остальных его кусков. А кастрировать там пришлось ой как немало, так что в процессе мог и отрезать что-то лишнее. И начал все заново - опять выдрал из Мерлина исходники мотора, опять начал резать их... Только в этот раз уже взял исходники последней версии, а не от 2016 года, как в оригинальной прошивке. В свежей версии резать пришлось в полтора раза больше... Из 340 КБ оригинальных файлов после вырезания всего лишнего осталось всего 121 КБ. Мне пришлось внимательно просмотреть 340 КБ текста и аккуратно вырезать ненужные 220 КБ - работка та еще...

И вот момент истины - запуск мотора, тыканье осциллографом и... опять отдельные пачки импульсов. Сссс...ка...

Но в этот раз я нашел причину всего за пару-тройку часов :))) Это был мой косяк в совсем другом месте, но он влиял на поведение управления мотором :) Когда после исправления этого косяка я попробовал ради интереса подключить старые исходники, которые я резал в первый раз, они тоже неплохо заработали :) Но новые все же работали заметно лучше и равномернее, поэтому оставил их. В новой версии Мэрлина процесс генерации шагов заметно улучшили, причем оптимизировав его под разные платформы, в том числе и под STM32F4xx, который и стоит на этой плате.

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

После этого встала проблема плавной стыковки движений с разной скоростью.

Для начала поясню поверхностно как работает планировщик Мерлина. Кто уже знает - можете пропустить :) Основная программа выдает планировщику отрезки движений. Например, командует "ехать на координату 20 со скоростью 100" (рассматривать будем только одну ось), потом командует "ехать на координату 50 со скоростью 200". получается два отрезка движения - от текущего положения до 20, и потом от 20 до 50. Планировщик оценивает эти отрезки, исходя из заданных в настройках скорости, ускорения, шагов на мм и т.д. и формирует блоки-задания для процедуры-генератора шагов двигателя. Если вторая команда приходит еще до того, как генератор шагов начал отрабатывать первый отрезок, то планировщик пытается совместить эти два отрезка так, чтобы двигатель не останавливался. Если у второго отрезка скорость выше, то из конца первого отрезка он убирает замедление, а в начало второго отрезка добавляет ускорение. Получается, что первый отрезок начинает с нулевой скорости, ускоряется до своей номинальной скорости и едет пока не дойдет до второго отрезка. Второй отрезок подхватывает движение на текущей скорости и начинает ускорять до номинальной скорости второго отрезка. Если после второго отрезка команд нет, то в его конце происходит замедление до нулевой скорости.

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

Почему так происходит я в конце концов нашел и исправил, но понять почему этот код, из-за которого такое происходило, присутствовал в планировщике и как он не мешает работе в составе оригинального Мерлина - понять не смог. Ну да ладно, заработало - и хорошо :)

Что я вынес в настройки, которые планирую предоставить изменять самим пользователям:

  • основные настройки оси: направление движения, инверсия концевиков, шаги на мм
  • ограничения для минимальной и максимальной позиции оси, действуют только после хомления
  • разрешить или запретить движение оси ниже концевика
  • скорость "быстрого" движения при хомлении для грубого поиска концевика
  • скорость второго, "медленного" движения при хомлении для точного обнуления координат
  • отдельно ускорения для холостых перемещений и для режима печати
  • скорость холостых перемещений
  • дистанция подъема при постановке печати на паузу
  • рабочий ток мотора
  • уменьшенный ток удержания мотора при отсутствии движения
  • время после последнего движения до перехода на уменьшенный ток удержания, в режиме печати не работает

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

  • до хомления оси (пока принтер не знает реальных координат) скорость перемещений в три раза меньше заданной в настройках, сделано для того, чтобы не врезаться на высокой скорости в дисплей или в верхний ограничитель оси (если он вообще есть, а то платформа и с ходового винта слетит :))
  • при движениях на высоте меньше 30 мм скорость так же уменьшается в три раза от заданной в настройках если ось отхомлена, если же нет - она и так уменьшена, сделано для того, чтобы не расплескивать смолу быстрыми движениями и не создавать большое давление на дисплей вязкой смолой при быстром опускании платформы
  • из меню движения оси нельзя выйти если ось находится в движении, это для того, чтобы при необходимости быстро остановить ось кнопка остановки была под рукой

В интерфейс добавил еще одну кнопку шага - 0.05. Мне вот ее не хватает при калибровке Фотона :) 

MKS DLP - продолжаем разговор о кастомной прошивке. Часть 2 - шаговый мотор

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

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

Хомление происходит стандартно - на первой, более быстрой скорости ось едет вниз пока не встретится с концевиком, после сего приподнимается на 3 мм и еще раз едет вниз до концевика на маленькой скорости, чтобы точно выставить 0. Если на момент начала хомления концевик сработан, то перед первым быстрым опусканием ось приподнимается на 20 мм. Если после начала хомления ось опустилась на значение максимальной высоты оси (из настроек), а концевик так и не встретился, хомление прерывается с ошибкой.

И снял видео, показывающее основные моменты работы меню и мотора :)

Подпишитесь на автора

Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.

Отписаться от уведомлений вы всегда сможете в профиле автора.

10
Комментарии к статье
Кремень КБ Реклама
Кремень КМ Реклама