Пишу программу для управлением ЧПУ через ЮСБ

создание собственных программ управления станком, управление LPT

Модераторы: Ruz_and, Master-VRI, al-drw, Мастак

igvv
Сообщения: 349
Зарегистрирован: Вс июл 14, 2013 15:44

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение igvv » Сб авг 23, 2014 12:30

Испытания №2

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

Шаги и при 250 отрабатываются очень нестабильно. Выдернутый копипастом Gкод и всунутый в Mach3 работает идеально.

Если с LPT ничего не получится по причине отсутствия необходимого в этой ситуации драйвера, то и смысла не вижу копать в этом направлении.
Самый удобный(для пользователей...его можно купить...очень легко прошить...и т. д.) доп. контроллер в этой ситуации вижу АРДУИНКУ (мега 2560), ну а хватит у нее ресурсов под задачи я не в курсе. Однако на ее базе уже существуют 3D принтеры...есть и какие-то исходники...вобщем в этом направлении перспективы вижу(ИМХО).
А делать все с нуля хватит ли у всех терпения?

Хотел сделать видео, но программа слетела с катушек(может из-за того, что параллельно открыл Mach3) - ... любому управлению не поддается, Ctrl-Alt-Del не срабатывает, курсор мыши зажил своей жизнью(что это???надеюсь не вирус?). После перегрузки компа для программы LPT порт не обнаруживается, курсор глючит прога виснет. С Mach3 проблем нет, работает.

Полгода назад собрал контроллер MicroNC, в инете поиском (Автономный контроллер ЧПУ на ATMega32) очень интересный проект. Есть там мелкие проблемы...но суть в том, что он тоже не так плавно (без пропусков ) управляет осями как Mach3, походу загвоздка там в ресурсах МК.

ert_zeb
Сообщения: 19
Зарегистрирован: Пт июл 04, 2014 14:32

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение ert_zeb » Вс авг 24, 2014 03:32

В теории может хватить. Пока известно что не получится лишь на самых древних МК. В них просто не хватает памяти.
Столкнувшись с ограничениями на размещение в памяти пришлось искать более подходящий компилятор. Кроме сишного sdcc ничего не нашёл. Пока наваял около 500 строк кода.
Что же касается других вычислительных ресурсов, то это вопрос спорный. Электроника НЦ31, например, была 16-разрядной. Работала с последовательным портом.
Вообще, можно даже описания под неё найти: http://stanoks.com/index.php?option=com_content&view=article&id=897:-q-31q-&catid=101:catalogcnc&Itemid=88
Хотя сомневаюсь, что она без переработки программы от Mach3 подхватит. Зато можно с уверенностью сказать, что 16-разрядных микроконтроллеров точно должно хватать. 8-разрядных как повезёт, на пределе возможностей.

ert_zeb
Сообщения: 19
Зарегистрирован: Пт июл 04, 2014 14:32

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение ert_zeb » Чт сен 04, 2014 14:14

Первый промежуточный набросок для работы с COM-портом. http://rghost.ru/57844753

Внутри архива находятся дополнительные папки bin и Chpu1.X. Первая предназначена для компилятора sdcc под микроконтроллер 8031, вторая под MPLab IDE и микроконтроллер 24FJ64GA006.

Особенности первого: sdcc весьма своеобразно работает со внешней памятью. В частности не только переменные в этой памяти, но и их адреса считаются переменными, и с ними не удаётся произвести статических вычислений.
Более того, sdcc незаметно добавляет свои функции для работы с внешней памятью. Даже программа вроде void main { } будет размером с килобайт, поскольку до запуска функции main будут запущены функции предварительной установки памяти.
В файле компиляции, названном sdcc-chpu добавлен параметр --no-xinit-opt. Вопреки названию он добавляет в выходной файл ассемблера тот код, что "подмешивается" в программу. В том же файле в качестве начала внешней памяти указан адрес 9192.
Это сделано на всякий случай, поскольку я использую древний самодельный эмулятор и сам уже не помню как он распределяет память.
Но трудности с внешней памятью оказались мелочью в сравнении с обработкой прерываний. Несмотря на установку флага прерывания, само прерывание не вырабатывается (по крайней мере от приёмника). С чем это связано пока не понятно.
Из гипотез можно предположить, что по передаче каждого байта микроконтроллеру нужно закрыть COM-файл и создать его вновь для правильной выработки битов остановки. Однако это сильно замедляет работу с портом и в этом направлении раскопки остановились.
Второе предположение - сказываются какие-то аппаратные особенности эмулятора и нужно зашить программу непосредственно в ПЗУ. Но программатор я домой притащить забыл, поэтому к этому вопросу вернусь через неделю.

Для того, чтобы хоть как-то отработать программу без прерываний, она программно (в соответствии с делителем частоты оповещения) проверяет флаги прерываний и ведёт обмен в соответствии с ними. Однако такой подход потребовал внесения изменений в протокол обмена.
Прежде чем передавать байт нужно ожидать сигнал готовности (символ 'S'). Это привело огромному падению скорости обмена. Что в сочетании с крайне низкой скоростью микроконтроллера делает этот приём неприемлемым. Но для первоначальной отработки он сгодился.

Со вторым микроконтроллером вышло получше. Его значительно более высокую скорость стало видно изначально. При том, что на плате размещён кварц в 4 МГц. Учитывая машинный цикл в 2 такта это даёт примерно 2 млн. 16-разрядных оп./с. Против 1 млн. 8-разрядных у 8031 на 12 МГц.
Включение внутреннего умножителя частоты на 4 позволило дополнительно поднять скорость. Таким образом его скорость сейчас примерно в 16 раз выше чем у 8031. Но вообще, предел его скорости вдвое выше (на частоте 32 МГц). Правда включение внутреннего множителя создало глюк.
Первый символ, отправляемый микроконтроллером, уходит неправильно. Советы из описания по необходимой задержке перед первой отправкой в 105 мкс особо не помогли, но это и не столь важно. Гораздо более ценным является совет по включению модуля UART до включения самого передатчика TX.
Если произвести включение в обратном порядке, передатчик работать не будет. Вообще же первые 4 отправляемых символа начала работы (NACH) не несут особой смысловой нагрузки. Но зато они позволяют обнаружить ошибки при работе с прерываниями.
По-умолчанию MPLAB выставляет в качестве адресов прерываний функцию main. Поэтому при сбое происходит подобие сброса и видно отправку этих символов.
Из других особенностей, относящихся к данной модели микроконтроллера можно отметить отсутсвие флага общего отключения прерываний. Поэтому вместо него используется функция DISI, отключающая прерывания на N циклов. Сброс счётчика в ноль восстанавливает прерывания.
Также я не использовал функций непосредственного вывода данных в порт. Данные читаются из выходного регистра-защёлки, меняются и возвращаются обратно.

В качестве рабочей скорости и протокола обмена используются те же, что и у 8031. Однако более высокая скорость и нормальная работа прерываний делают своё дело. Тем не менее для более высокой скорости нужно будет добавить поддержку более быстрого протокола.
Одним лишь изменением скорости тут не обойтись. Дело в том, что при обмене со скоростью 9600 бод, частота передачи составляет 1200 байт в сек. Это означает, что если понадобится туннелировать COM-порт через USB, выдавать данные с нужной скоростью побайтно будет невозможно.
Так как скорость опроса шины USB составляет 1 мс (1000 Гц). Иными словами, для дальнейшего роста скорости обмена необходимо увеличивать размер слова данных для обмена не увеличивая частоты опроса. То есть отправлять и принимать скажем по 2 байта за раз.
И синхробайт ('S') для ожидания тут будет помехой. Поэтому основной скоростью другого протокола по всей видимости будет 19200 бод, что в сочетании с отсутствием синхробайтов даст примерно в 4 раза большую скорость обмена.

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

Что же касается основной программы, то она не претерпела существенных изменений. Работа с ПП там всё ещё находится на "птичьих правах" и запрятана в настройках COM-порта. Обработки по программе ещё нет.
В этой вкладке находится всего четыре кнопки. Для включения/выключения работы порта. Для загрузки программы в эмулятор (на 8031), для загрузки данных по настройкам осей в микроконтроллер и их считывания для просмотра. А также флажок для отключения приёма сообщений на терминал (так как строк очень много).
Для передачи непосредственных команд микроконтроллеру нужно нажимать назначенные клавиши перемещения каретки (главное, чтобы не в окно терминала).
Программно, для организации циклов обмена с COM-портом, используестя отдельный поток с обычным приоритетом, ведущий обмен на основной скорости для передачи и учетверённой для приёма. Никакие сообщения системы (в том числе на изменения в COM-файле) не проверяются.

ert_zeb
Сообщения: 19
Зарегистрирован: Пт июл 04, 2014 14:32

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение ert_zeb » Пт сен 19, 2014 12:49

Второй набросок для работы с последовательным портом. http://rghost.ru/58093606
Модули для работы с ПП сильно переработаны для возможности будущего подключения нескольких устройств сразу. Хотя сама основная программа особо не изменилась.
Сама работа с ПП теперь выполняется в основном окне гравировки. В нижнем углу добавлено сообщение о текущем состоянии связи, порт подключения и кнопка выбора порта, открывающая окно. В окне показывается список обнаруженных COM-портов из которых нужно выбрать один и нажать кнопку "выбрать". После этого статус изменится на слово "настройка", а затем на "подключен".
Стоит заметить, что если отсоединить кабель и вновь его подключить соединение теперь не восстановится. Для этого нужно ещё доделать команду сброса "V".
После того как произошло подключение можно либо напрямую управлять движением посредством клавиш, либо использовать кнопку запуска исполнения кода. Другие действия пока не поддерживаются.
Координаты движения инструмента в 3D-виде теперь отображаются по выдаваемым из МК. Выдача этих координат в сочетании с медленным протоколом уже даёт о себе знать. Причём если для на время передачи очередной команды обработки оповещение координат можно подавить, то для управления клавишами это не желательно. Поэтому такой протокол на 9600 бод с синхронизацией вряд ли пригоден для практического использования.

Прошивка пока переделана под разновидность на PIC-е. 8031 пока не занимался. Так же на глаза попались два МК семейства MSP430. Не знаю в рабочем ли они состоянии и нет программатора для установления этого факта, но их также можно рассматривать как резервный вариант. Это 16-разрядное семейство микроконтроллеров от Texas Instr. С несколько меньшим быстродействием и худшей поддержкой как в программной так и документационной части, а заодно и заоблачными ценами за лицензионное ПО и прочие примочки. Тем не менее (если будет время) можно будет попробовать решить эти трудности.

ert_zeb
Сообщения: 19
Зарегистрирован: Пт июл 04, 2014 14:32

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение ert_zeb » Сб окт 04, 2014 12:50

Очередная обновка программы http://rghost.ru/58345616

Немного изменён протокол обмена, убраны несколько ошибок, началось добавление поддержки формата NGC.

Наконец добрался до электрической части. Поскольку МК питается от 3 вольт, то я решил не убирать выходные ключи на микросхеме uln2803a. Вместо этого я подал 5 вольт на эти ключи через резисторы на 510 ом (в теории нужны примерно 150-200 ом).
Это привело к обратным уровням сигналов и необходимости добавления возможности инверсии выхода в программу. Сейчас эта возможность доступна только при работе через COM-порт, причём выполнена она лишь в виде прямого задания значений в одной из процедур модуля global.pas:

procedure NaznachCOM;
begin
Osi[OX].VyvodN:= 0;
Osi[OY].VyvodN:= 2;
Osi[OZ].VyvodN:= 4;

Osi[OX].VyvodS:= 1;
Osi[OY].VyvodS:= 3;
Osi[OZ].VyvodS:= 5;

Osi[OX].ObratN:= true;//false;
Osi[OY].ObratN:= true;//false;
Osi[OZ].ObratN:= true;//false;

Osi[OX].ObratS:= true;//false;
Osi[OY].ObratS:= true;//false;
Osi[OZ].ObratS:= true;//false;
end;


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

ПС: не тот адрес. исправлено.

ert_zeb
Сообщения: 19
Зарегистрирован: Пт июл 04, 2014 14:32

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение ert_zeb » Вс окт 19, 2014 08:17

Обновление программы: http://rghost.ru/58599298

Попытки уменьшения сопротивлений привели к тому, что стало сильно сказываться собственное сопротивление биполярных ключей и уровень нуля стал не достаточно чистым.
Поэтому схема с открытыми коллекторами была выброшена и заменена на обычную мостотвую на основе 74hc245 (аналог 1564ап6). Стоит заметить, что выбрана именно серия 74hc - аналог наших 564/1564. Это МОП-логика, совместимая по уровням с ТТЛ и способная работать от 3 вольт (низковольтный ТТЛ, LVTTL). Сама 245 при этом запитана от 5 вольт, но особенности вентилей МОП позволяют надеяться, что ничего неожиданного с их входов к МК не вернётся.
Также можно заметить, что можно питать её и от тех же 3 вольт, что и МК. Работать должно и так, но толком не проверено. Последовательно на выход к кабелю подключены резисторы по 150 Ом.

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

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

Также продолжилось ковыряние модуля для поддержки формата NGC. Хотя пока ещё ни один файл NGC всё ещё толком не обрабатывается.

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

while (1) {
if (SMode==2) {
Os_X.neogsk = 0;
Os_Y.neogsk = 0;
Os_Z.neogsk = 0;

flagVyv = da;
GoToPnt(Xpreob, Ypreob, Zpreob);
flagVyv = net;

Xtek = Xpreob;
Ytek = Ypreob;
Ztek = Zpreob;

if (SMode==2) SMode = 1;
} else

ert_zeb
Сообщения: 19
Зарегистрирован: Пт июл 04, 2014 14:32

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение ert_zeb » Пн ноя 03, 2014 07:14

Обновление программы. Ссылка: http://rghost.ru/58856359

Добавлена рабочая скорость подачи и обработка приостановки на COM-порте. NGC стал пытаться делать что-то осмысленное, но пока не ясно что.

Попытался повысить частоту ядра на МК путём нескольких доработок программы, но к особому успеху это не привело. Некоторые изменения и вовсе приводили к замедлению. Даже не стал заменять обычную процедуру обработки на прерывание, хоть прежде и считал это важным. К существенному улучшению это не приведёт.
Также попробовал заменить кварц на 8 МГц. Скорость также не изменилась. Если отбросить гипотезы о зелёных человечках и запуске не на той гармонике, то можно сделать вывод, что уже установленный кварц также на 8 Мгц. Откуда следует, что данная скорость работы МК близка к предельной для него.
Для более высоких скоростей нужны 32-разрядные МК и векторные оптимизации, способные распараллелить работу команд модулятора:

Os_X.schets += abs(Os_X.uvstab);
Os_Y.schets += abs(Os_Y.uvstab);
Os_Z.schets += abs(Os_Z.uvstab);

и в процедуре

ProvSkor(&Os_X, /*&ISlov,*/ 0x05);
ProvSkor(&Os_Y, /*&ISlov,*/ 0x0a);
ProvSkor(&Os_Z, /*&ISlov,*/ 0x30);

Чтобы повысить скорость работы станка на доступной ему частоте ядра в программу добавлено значение частоты 12,5 КГц. Стоит заметить, что исторически сложилось так, что программа делит значения частоты на пополам. Иными словами частота ядра задана не частотой импульсов, а частотой полупериодов. Поэтому данная частота соответствует 25 КГц.

ert_zeb
Сообщения: 19
Зарегистрирован: Пт июл 04, 2014 14:32

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение ert_zeb » Вс ноя 30, 2014 17:01

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

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

Основной же скоростью для обмена во втором протоколе теперь является 57600 бод. Из соображений, что в дальнейшем может понадобиться удвоение передаваемых величин (координат с 64-разрядной точностью, хотя есть смысл ограничиться 40 разрядами). В свою очередь 256000 бод выглядят не слишком стандартно и пока не рассматриваются.
Установление же нестандартных величин и вовсе под вопросом, поскольку в некоторых описаниях утверждается, что произвольно можно задавать лишь скорости от 2 до 110 бод. На все другие нестандартные величины виндошная функция должна возвращать ошибку. Что впрочем не помешало авторам Делфи добавить определения скорости 56000 бод, но работоспособость этих величин я не проверял.

Переключение на второй протокол происходит автоматически при выборе устройства его поддерживающего. Но можно отключить флаг в настройках и МК будет продолжать работу в старом режиме.
В целом скорость обмена увеличилась в несколько раз. И этого оказалось достаточно для более-менее приемлемого перемещения каретки с клавиатуры. Задержки делителей времени выставлены в величины достаточные для приемлемой работы через переходник USB-COM.
Прошивка для контроллера для работы во 2-ом протоколе вынесена в отдельную папку CHPU2.X. Её библиотека indikator не подключена в основном модуле и предназначалась для отладочных нужд.
Она динамически отображает значение переменной с адресом в otobchis на люменисцентном индикаторе, который штатно имеется в использованном блоке. При этом через порт E выводятся как нужные сегметы, так и сетки цифр. Разделяются они посредством запоминания во внешних асинхронных регистрах (запись по перепаду), управляемых портом D.

Ссылка обновлённой проги: http://rghost.ru/59348050

Rudolf
Сообщения: 1
Зарегистрирован: Чт дек 18, 2014 23:53

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение Rudolf » Пт дек 19, 2014 00:14

Добрый день - очень заинтересован вашей программой - купил себе домашний станочек Моделист 3030м c 4х осевой открытого типа CNC UCB ? вот денег на покупку лицензионных программ нет - я только начинаю так сказать изучать его и уже в демо версиях сидеть устал - хочется опробовать - возможно ли это с вашей программой

ert_zeb
Сообщения: 19
Зарегистрирован: Пт июл 04, 2014 14:32

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение ert_zeb » Чт дек 25, 2014 13:37

Насколько я понял из описаний в качестве контроллера эти "моделисты" используют tb65xx/tb66xx, то есть с точки зрения принципа действия то же самое, что и у меня. И подключается наверняка через LPT.
Но надёжность работы моей программы через LPT (по крайней мере сейчас) оставляет желать лучшего. Ей вообще до нормального состояния пока как пешком до луны. Сейчас она скорее для разработчиков, чем для пользователей.
Если боитесь нелицушных программ, то можно использовать linuxcnc.

Я же пока попытался маленько улучшить поддержку формата NGC. По крайней мере теперь он показывает в 3d действие 4-ёх примеров.
Пример с ромбом и окружностью выглядит несколько коряво из-за наличия перспективы у камеры вида, но пока ничего по этому поводу предпринимать не стал.

Ссылка обновлённой программы: http://rghost.ru/59965413

ert_zeb
Сообщения: 19
Зарегистрирован: Пт июл 04, 2014 14:32

Re: Пишу программу для управлением ЧПУ через ЮСБ

Сообщение ert_zeb » Пн янв 12, 2015 14:49

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

Ссылка на закачку: http://rghost.ru/60303708


Вернуться в «програмирование»

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

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