roboforum.ru

Технический форум по робототехнике.

Контроллер ЧПУ/3Д принтера на STM32

Наше хобби — конструировать и программировать.
Демонстрация готовых роботов и устройств построенных своими руками.

Re: Контроллер ЧПУ/3Д принтера на STM32

Сообщение dccharacter » 07 авг 2012, 02:40

ААааа, это надо наверное как-то хитро коммитить :-) Только как.

А пока, вот наш враг:
void dda_step(DDA *dda) {
...
}

Добавлено спустя 4 минуты 51 секунду:
Myp писал(а): требует закомитить build.xml debug.config и ещё что-то там.

link.ld
???
Все, только три этих файла?

Добавлено спустя 3 часа 13 минут 44 секунды:
Ох, блин. Я процентов на 70 разобрался с движением. Если бы был драйвер шаговика нормальный, можно было бы попробовать покрутить его. Вся-вся математика подчистую из Teacup.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Контроллер ЧПУ/3Д принтера на STM32

Сообщение dccharacter » 09 авг 2012, 11:58

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

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

Более того, это все сильно зависит от используемого железа - алгоритмы управления придется сильно перестраивать под моторы и нагрузку. Имхо овчинка все-таки не стоит выделки. (хотя на форумах народ на брушлесах делает сервоприводы - но это вполне себе такая инженерная задачка уровня нашего великого учителя).
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Контроллер ЧПУ/3Д принтера на STM32

Сообщение legion » 09 авг 2012, 12:10

Ошибку не обнулять, а учитывать при расчете движения для следующей команды?
legion
 
Сообщения: 736
Зарегистрирован: 24 апр 2010, 14:47
Откуда: Уфа
прог. языки: avr asm

Re: Контроллер ЧПУ/3Д принтера на STM32

Сообщение dccharacter » 09 авг 2012, 13:12

legion писал(а):Ошибку не обнулять, а учитывать при расчете движения для следующей команды?

тоже да

Добавлено спустя 57 минут 56 секунд:
Почему когда я днем думаю об этом контроллере, мне кажется, что это самое элементарное, что можно сделать?

Почему когда я вечером добираюсь до дома мне кажется, что это неподъемный проект?
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Контроллер ЧПУ/3Д принтера на STM32

Сообщение boez » 09 авг 2012, 13:43

Вообще если я хоть че-то понимаю в сервоприводах, работать должно так. У тебя есть интерпретатор G-кода. Он должен синтезировать и выдавать позицию по всем координатам раз в цикл регулирования. Нужно проехать по Х 1 сантиметр, от 5 до 6 - выдаем такое: (это мы тут стоим) 5,5,5,5 (пришло время ехать), 5.05,5.1,5.2,5.4,5.6,5.8,5.9,5.95,6 (приехали),6,6,6,6 - ну это грубо, для понимания. По Y,Z,экструдеру в это время идут константы. Все, эту позицию подаем на ПИДы позиционирования, они выдают скорость на ПИДы ШИМ, или даже сразу ШИМ - это уже как реализовано там. И интерпретатору G-кода реальную позицию знать не нужно вообще - он когда в примере выше выдал позицию 6 - все, можно переходить к следующему шагу. Никаких затыков. А в ПИДе позиционирования просто защита - если рассогласование выше 0.01 мм (к примеру) - авария, стоп и красная лампочка. И сидим настраиваем ПИДы позиционирования чтобы такого не происходило.

Добавлено спустя 2 минуты 1 секунду:
Да, естественно реальный цикл управления должен тикать с частотой в килогерцы, если хочется хоть какой-то точности. Ну благо вроде процессор должен позволять.
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: Контроллер ЧПУ/3Д принтера на STM32

Сообщение dccharacter » 09 авг 2012, 13:58

А я вот пришел к тому, что надо не по позиции работать ПИД-ом, а по скорости перемещения.

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

Можно в начале/конце перемещения сделать плавный рост/падение скорости, пока не понял как. Но это позволит избежать перелета. и неравномерности на старте (на все оси нагрузка разная, по идее и результат работы ПИДов должен быть разный)

Добавлено спустя 2 минуты 36 секунд:
почему не по позиции: как я уже писал, сложно вывести сервомотор на четкую позицию. тут мы бьем отрезок на 100, например, частей. почему на 100, почему не на 200? На каждом саб-отрезке получается погрешность в 10-20 тиков, если делать как говорит legion, ошибка будет не накапливаться, а плавать в этих же пределах, но каждый отрезок надо перечитывать. Т.е. управлять каждым подотрезком, как отрезком. Мы бьем задачу, но в результате задача не становится проще. Фрактал.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Контроллер ЧПУ/3Д принтера на STM32

Сообщение setar » 09 авг 2012, 15:53

немного ковырял прошивку марлин, там управляющие G коды принимаются только начало и конец координаты, а сама прошивка решает как максимально быстро (при этом пропорционально скоростям подачи по экструдеру) прийти к заданой кординате.
В идеале нужно учитывать закон регулирования инерционной системы, нужно знать перемещаемую массу или иметь обратную связь по акселерометру или датчику вибрации
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Re: Контроллер ЧПУ/3Д принтера на STM32

Сообщение Myp » 09 авг 2012, 15:58

boez писал(а): А в ПИДе позиционирования просто защита - если рассогласование выше 0.01 мм (к примеру) - авария, стоп и красная лампочка. И сидим настраиваем ПИДы позиционирования чтобы такого не происходило.
ненене никаких аварий, просто остальные оси притормаживаем до устранения, а потом продолжаем дальше.
нафик надо чтоб в конце 3х часового цикла фрезеровки какой-то фиговины был сбой
подумаешь зазубрина в одну сотку на детали получится. пропустили и поехали дальше.
<telepathmode>На вопросы отвечает Бригадир Телепатов!</telepathmode>
Всё уже придумано до нас!
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Re: Контроллер ЧПУ/3Д принтера на STM32

Сообщение dccharacter » 09 авг 2012, 16:24

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

Да, в Teacup тоже на входе только таргет. Потом работает алгоритм расчета и разброса шагов и потом уже дерганье ногами.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Контроллер ЧПУ/3Д принтера на STM32

Сообщение dccharacter » 15 авг 2012, 21:30

Я тут еще чуть-чуть подумал и допер вот до чего. При управлении сервоприводом, скорее всего, нет смысла делать фиксированный тайм-бейз (т.е. вызывать ПИД каждые, скажем, 10мсек). Скорее имея требуемую точность и скорость подачи, надо звать ПИД не каждые 10мс, а каждые 0,001мм для обеспечения точности в 0,1мм. Подача нам известна, значит мы знаем время перемещения инструмента с заданной подачей. И мы можем рассчитать в соте за какое время инструмент с заданной подачей пройдет 0,001 мм. И вот через эти временные отрезки и звать ПИД. Критика?
Вложения
FRcalc.JPG
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Контроллер ЧПУ/3Д принтера на STM32

Сообщение boez » 15 авг 2012, 22:54

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

ИМХО: нефиг жадничать! Если процессору хватает времени просчитать ПИД на максимальной скорости с шагом 0.001 мм(плюс другие задачи) - так пусть и считает с такой частотой все время. Смысл его разгружать на малых скоростях? Какие у проца есть вычислительно-сложные задачи, которые можно делать на малой скорости и обойтись без них на большой?
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: Контроллер ЧПУ/3Д принтера на STM32

Сообщение dccharacter » 15 авг 2012, 23:34

Ок, понял, принимается. Заход был не на "давайте сэкономим времени процессорного", а на достаточно простую реализацию контроля ускорения... Ладно, продолжаем пилить фиксированный таймбейс.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Контроллер ЧПУ/3Д принтера на STM32

Сообщение dccharacter » 16 авг 2012, 05:04

Вроде как настроил ПИД, подачу держит с ошибкой на 2-4 микрона на 1 тик таймбейса (с последующей коррекцией). Максимальная подача, которую дает моя серва с винтом 6мм (шаг витка 1мм) - 39мм/мин (при этом таймбейс приходится делать 100мс).
Из-за того, что в серве сидит свой (какой=то странный) ПИД, получается борьба двух ПИД-ов. Забава.
Теперь буду думать как тормозить серву правильно и вовремя...
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Контроллер ЧПУ/3Д принтера на STM32

Сообщение Duhas » 16 авг 2012, 12:40

в сервах вроде вообще П регуль просто..
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: Контроллер ЧПУ/3Д принтера на STM32

Сообщение dccharacter » 16 авг 2012, 15:29

Duhas писал(а):в сервах вроде вообще П регуль просто..

сто процентов нет
есть интеграл, причем медленный
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Пред.След.

Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13