Оригинал взят у
vkorehovisback в Как сделать PCI карту своими руками, Часть 1 (введение)
Мне понадобился качественный интерфейс для CNC станка.
Сразу скажу что параллельный порт меня не устраивает. потому как качество его реализации сомнительное, контактов мало (всего 16 I/O, не помню сколько I и сколько O) и максимальная частота работы до 50 кгЦ, с сомнительными показателями по интерференции, крутизне фронтов, задержек, и т.д.
Для интерфейса с 6-осным станком, понадобится 24 дифференциальные пары контактов (6 диффпар на сигналы DIR, 6 диффпар на сигналы PULSE).
Кроме того я предусмотрел 12 цифровых TTL выхода (до 50ма) и 12 опто-изолированных цифровых входа общего назначения.
И того все это добро еле уместилось в SCSI коннектор 50 pin, который мне очень нравится.

Дальше самое главное, какой вариант реализации PCI карты выбрать, существует два пути:
1) Использовать готовый PCI чип какого-либо производителя.
2) Использовать FPGA.
Первый вариант я отбросил, потому что тогда реализация будет целиком зависеть от этого чипа, его глюков или их отсутствия.
т.е. мы будем всецело полагаться на кого-то учить их спецификацию, разбирать какой драйвер нужен, как его написать и т.д.
Второй вариант является немного более трудозатратным изначально, зато потом он дает больше пользы, потому как FPGA наверное самые универсальные устройства в мире, и с их помощью можно сделать практически любой интерфейс, с любым устройством, можно имплементировать практически любую схему и т.д.
Начнем с самого сложного, с шины PCI. Осложняется все тем, что спецификация закрытая, в интернете информации не много, но есть способ обойти буржуев.
Многие производители FPGA имеют и комплект стандартных реализаций различных интерфейсов за доп. плату (которую вменяемые люди конечно-же платить не будут), называется это все IP Core (Xilinx у других может отличаться, но идея таже)
что это такое? ну это вроде библиотеки для линковки кода.
IP Core может поставляться в виде непосредственно кода (Verilog ili VHDL) либо в виде специального закрытого нэтлиста (что-то вроде EDIF, но зашифрован, у каждого вендора свой формат и позволяет линковать их только используя их средства разработки)
Спасибо умельцам, которые четко взломали пакет Xilinx ISE 10.1, что позволяет получить доступ ко всем IP Core абсолютно бесплатно и на уровне исходного кода (что самое полезное для обучения)
Раздачу каждый может найти сам на известном торрент трекере.
Далее, есть сайт fpga4fun.com где рассказывается максимально сжато о всех особенностях FPGA и нет смысля дублировать эту информацию тут. Сайт рассказывает о FPGA двух лидеров на рынке: Xylinx и Altera.
Также вам потребуется изучить Verilog, но если вы уже программировали на каком-то языке, то это не составит большего труда.
Какой чип выбрать??
Я остановился на Xylinx Spartan xxx
Тут есть несколько подводных камней.
1) Совместимость с шиной PCI32 5V
2) Количество выходов которые можно коммутировать одновременно (называется SSO simultaneously switching outputs)
3) Тип корпуса: BGA или PQ (BGA сложнее паять, потребуется печь, либо хороший фен и удача)
4) Встроенный flash либо вынесенный в отдельный чип?
5) Максимальное время загрузки до получения первых сигналов с PCI
Это наверное самое ответственное из всего. Вам предстоит сделать выбор, использовать ли вам чипы конвертации уровней сигналов всех I/O шины (около 50) и использовать современный FPGA (1.25V, 2.5V, 3.3V no 5V tolerant).
Либо использовать старый FPGA.
Для своего проекта я сделал выбор в пользу старого FPGA (Spartan II) и пока еще не пожалел.
Следует отметить, что использование чипов конвертации уровней вносит дополнительные сложности в проблему с SSO, потому как
такие чипы генерируют Overshotы и Undershotы напряжения и могут приводить к ошибкам.
Проблема SSO, питания и максимального времени загрузки FPGA для PCI32 3.3V:
http://www.xilinx.com/support/documentation/application_notes/xapp457.pdf
Наилучшее подключение Bus Switch для совместимости с 5V PCI (что является стандартом для домашних ПК):
http://www.xilinx.com/support/documentation/application_notes/xapp646.pdf
Проблему с overshot и undershot тут решают сместив уровень земли для чипов конвертера уровней.
Следует отметить особенно, что для увеличения числа SSO (также называется Ground bounce) применяют шунтирующий резистор в цели питания чипа, задавая ток "холостого хода" 50mA (резистор 34 ом, для питания 3.3V)
Такой резистор, либо низкоомную обратную связь для LDO я видел во ВСЕХ pci платах схемы которых мне удалось достать.
У каждого чипа и типа корпуса этот параметр разный и приводится в даташите.
Например в моем случае с типом корпуса PQ208 и моделью Spartan II для стандарта PCI разрешается использовать до 4х SSO на группу питания, которых всего 16 в устройстве (по две на банк, которых 8-мь)
Далее я взял константы которые поставлялись с IP Core PCI (версия 3.199) (*.ucf файл User Constants file)
И оказалось что они распределили все сигналы PCI на 4 банка (получается 32 SSO сигнала разрешено, в то время как для шины pci требуется порядка 40 сигналов у которых крутые фронты):
http://www.xilinx.com/support/documentation/application_notes/xapp457.pdf
Кроме того банки заполнены неравномерно, что так-же нарушает Допустимый SSО.
С другой стороны IP Core прошла тестирование в такой конфигурации и я побоялся менять тут что-то.
рискуя не вложиться в тайминги PCI шины, из за особенностей внутренней архитектуры FPGA.
Поэтому я предпринял дополнительные усилия для увеличения SSO. Я поставил шунт (120 ом) нa выход каждого регулятора напряжения питания, хорошие байпас конденсаторы, многослойную печатную плату с отдельным слоем для земли и т.д.
Также следует думать тут об удобном расположении выводов для трассировки печатной платы!
Я выбрал PQ208, BGA имеет большее преимущество (вдвое выше SSO), но есть риск не запаять в домашних условиях, еще может быть закорочен какой-либо контакт из за смещения чипа, что опасно для вашей материнской платы!.
Тут я первый раз пожалел что связался со старой линейкой чипов а не выбрал новую Spartan 3AN (со встроены флешем)
Оказалось что для каждой модели Spartan II есть свой чип программируемый через JTAG.
Он оказался довольно дорогим, и чувствуется что его скоро перестанут продавать.
XC18V01 (1 мегабайт флеша в моем случае)
Как его подключить к FPGA Spartan II, есть в даташите.
Возможно либо серийный интерфейс либо параллельный, под управлением внутреннего такта FPGA либо внешнего!, я выбрал серийный под управлением FPGA, т.е. сигнал кола генерирует сам FPGA и после окончания загрузки переходит в рабочий режим.
Частота загрузки конфигурации 66Мгц, для PCI32 5V это достаточно чтобы уложиться в 1.1 секунду (PCI32 5V 32Mhz) для загрузки полной конфигурации. однако в моем проекте будет использоваться лишь небольшая часть конфигурационного пространства.
Ну вот вроде и все, скоро выложу печатную плату и схему, в следующей части.
Потом будет софт и наша PCI карта готова.
Сразу скажу что параллельный порт меня не устраивает. потому как качество его реализации сомнительное, контактов мало (всего 16 I/O, не помню сколько I и сколько O) и максимальная частота работы до 50 кгЦ, с сомнительными показателями по интерференции, крутизне фронтов, задержек, и т.д.
Для интерфейса с 6-осным станком, понадобится 24 дифференциальные пары контактов (6 диффпар на сигналы DIR, 6 диффпар на сигналы PULSE).
Кроме того я предусмотрел 12 цифровых TTL выхода (до 50ма) и 12 опто-изолированных цифровых входа общего назначения.
И того все это добро еле уместилось в SCSI коннектор 50 pin, который мне очень нравится.

Дальше самое главное, какой вариант реализации PCI карты выбрать, существует два пути:
1) Использовать готовый PCI чип какого-либо производителя.
2) Использовать FPGA.
Первый вариант я отбросил, потому что тогда реализация будет целиком зависеть от этого чипа, его глюков или их отсутствия.
т.е. мы будем всецело полагаться на кого-то учить их спецификацию, разбирать какой драйвер нужен, как его написать и т.д.
Второй вариант является немного более трудозатратным изначально, зато потом он дает больше пользы, потому как FPGA наверное самые универсальные устройства в мире, и с их помощью можно сделать практически любой интерфейс, с любым устройством, можно имплементировать практически любую схему и т.д.
Начнем с самого сложного, с шины PCI. Осложняется все тем, что спецификация закрытая, в интернете информации не много, но есть способ обойти буржуев.
Многие производители FPGA имеют и комплект стандартных реализаций различных интерфейсов за доп. плату (которую вменяемые люди конечно-же платить не будут), называется это все IP Core (Xilinx у других может отличаться, но идея таже)
что это такое? ну это вроде библиотеки для линковки кода.
IP Core может поставляться в виде непосредственно кода (Verilog ili VHDL) либо в виде специального закрытого нэтлиста (что-то вроде EDIF, но зашифрован, у каждого вендора свой формат и позволяет линковать их только используя их средства разработки)
Спасибо умельцам, которые четко взломали пакет Xilinx ISE 10.1, что позволяет получить доступ ко всем IP Core абсолютно бесплатно и на уровне исходного кода (что самое полезное для обучения)
Раздачу каждый может найти сам на известном торрент трекере.
Далее, есть сайт fpga4fun.com где рассказывается максимально сжато о всех особенностях FPGA и нет смысля дублировать эту информацию тут. Сайт рассказывает о FPGA двух лидеров на рынке: Xylinx и Altera.
Также вам потребуется изучить Verilog, но если вы уже программировали на каком-то языке, то это не составит большего труда.
Какой чип выбрать??
Я остановился на Xylinx Spartan xxx
Тут есть несколько подводных камней.
1) Совместимость с шиной PCI32 5V
2) Количество выходов которые можно коммутировать одновременно (называется SSO simultaneously switching outputs)
3) Тип корпуса: BGA или PQ (BGA сложнее паять, потребуется печь, либо хороший фен и удача)
4) Встроенный flash либо вынесенный в отдельный чип?
5) Максимальное время загрузки до получения первых сигналов с PCI
Совместимость с шиной PCI32 5V
Это наверное самое ответственное из всего. Вам предстоит сделать выбор, использовать ли вам чипы конвертации уровней сигналов всех I/O шины (около 50) и использовать современный FPGA (1.25V, 2.5V, 3.3V no 5V tolerant).
Либо использовать старый FPGA.
Для своего проекта я сделал выбор в пользу старого FPGA (Spartan II) и пока еще не пожалел.
Следует отметить, что использование чипов конвертации уровней вносит дополнительные сложности в проблему с SSO, потому как
такие чипы генерируют Overshotы и Undershotы напряжения и могут приводить к ошибкам.
Проблема SSO, питания и максимального времени загрузки FPGA для PCI32 3.3V:
http://www.xilinx.com/support/documentation/application_notes/xapp457.pdf
Наилучшее подключение Bus Switch для совместимости с 5V PCI (что является стандартом для домашних ПК):
http://www.xilinx.com/support/documentation/application_notes/xapp646.pdf
Проблему с overshot и undershot тут решают сместив уровень земли для чипов конвертера уровней.
Следует отметить особенно, что для увеличения числа SSO (также называется Ground bounce) применяют шунтирующий резистор в цели питания чипа, задавая ток "холостого хода" 50mA (резистор 34 ом, для питания 3.3V)
Такой резистор, либо низкоомную обратную связь для LDO я видел во ВСЕХ pci платах схемы которых мне удалось достать.
Количество выходов которые можно коммутировать одновременно (называется SSO: simultaneously switching outputs)
У каждого чипа и типа корпуса этот параметр разный и приводится в даташите.
Например в моем случае с типом корпуса PQ208 и моделью Spartan II для стандарта PCI разрешается использовать до 4х SSO на группу питания, которых всего 16 в устройстве (по две на банк, которых 8-мь)
Далее я взял константы которые поставлялись с IP Core PCI (версия 3.199) (*.ucf файл User Constants file)
И оказалось что они распределили все сигналы PCI на 4 банка (получается 32 SSO сигнала разрешено, в то время как для шины pci требуется порядка 40 сигналов у которых крутые фронты):
http://www.xilinx.com/support/documentation/application_notes/xapp457.pdf
• AD[31:0] • CBE[3:0] • PAR • IRDY#, FRAME# • REQ#
Кроме того банки заполнены неравномерно, что так-же нарушает Допустимый SSО.
С другой стороны IP Core прошла тестирование в такой конфигурации и я побоялся менять тут что-то.
рискуя не вложиться в тайминги PCI шины, из за особенностей внутренней архитектуры FPGA.
Поэтому я предпринял дополнительные усилия для увеличения SSO. Я поставил шунт (120 ом) нa выход каждого регулятора напряжения питания, хорошие байпас конденсаторы, многослойную печатную плату с отдельным слоем для земли и т.д.
Также следует думать тут об удобном расположении выводов для трассировки печатной платы!
Тип корпуса: BGA или PQ
Я выбрал PQ208, BGA имеет большее преимущество (вдвое выше SSO), но есть риск не запаять в домашних условиях, еще может быть закорочен какой-либо контакт из за смещения чипа, что опасно для вашей материнской платы!.
Встроенный flash либо вынесенный в отдельный чип? и Максимальное время загрузки до получения первых сигналов с PCI
Тут я первый раз пожалел что связался со старой линейкой чипов а не выбрал новую Spartan 3AN (со встроены флешем)
Оказалось что для каждой модели Spartan II есть свой чип программируемый через JTAG.
Он оказался довольно дорогим, и чувствуется что его скоро перестанут продавать.
XC18V01 (1 мегабайт флеша в моем случае)
Как его подключить к FPGA Spartan II, есть в даташите.
Возможно либо серийный интерфейс либо параллельный, под управлением внутреннего такта FPGA либо внешнего!, я выбрал серийный под управлением FPGA, т.е. сигнал кола генерирует сам FPGA и после окончания загрузки переходит в рабочий режим.
Частота загрузки конфигурации 66Мгц, для PCI32 5V это достаточно чтобы уложиться в 1.1 секунду (PCI32 5V 32Mhz) для загрузки полной конфигурации. однако в моем проекте будет использоваться лишь небольшая часть конфигурационного пространства.
Ну вот вроде и все, скоро выложу печатную плату и схему, в следующей части.
Потом будет софт и наша PCI карта готова.
no subject
Date: 2014-05-07 06:11 am (UTC)А то я драйвера лет 5 назад последний раз писал на 2000/XP, вдруг наука шагнула далеко вперёд?
И что "буфер"? Загнать в него последовательность команд и выдавать с заданной частотой (силами ПЛИСки)? Фактически функция микроконтроллера будет примитивного.
А как с обратной связью? То же там же "в буфере" или вернём системе? Тогда драйвер никуда не денется.
В общем ждём драйвера в студию и общего алгоритма работы в студию!
no subject
Date: 2014-05-07 06:19 am (UTC)обратная связь в CNC не применяется
no subject
Date: 2014-05-07 06:31 am (UTC)no subject
Date: 2014-05-07 06:35 am (UTC)no subject
Date: 2014-05-07 06:44 am (UTC)никаких датчиков нет, поведение двигателей рассчитывается априори.
.
no subject
Date: 2014-05-07 07:30 am (UTC)http://www.youtube.com/watch?v=oOvRf7xa5r4
Все подводные камни описаны: потеря позиции/пропуск шага, низкая максимальная скорость.
Да вот и крупные конторы - ну тупые: http://www.infineon.com/cms/en/product/microcontroller/32-bit-industrial-microcontroller-based-on-arm-registered-cortex-tm-m/32-bit-xmc4000-industrial-microcontroller-arm-registered-cortex-tm-m4/xmc4000-in-industrial-applications/channel.html?channel=db3a30433580b3710135a91702f12097
Всё USB притулить пытаются.
no subject
Date: 2014-05-07 07:48 am (UTC)на уровень PC можно поднимать его и с опозданием, для синхронизации осей например.
no subject
Date: 2014-05-07 08:06 am (UTC)no subject
Date: 2014-05-07 09:53 am (UTC)в Mach3 уже есть учет ускорений, торможений и тд. не очень понятно что такое микрошаги и как их реализовать практически и на каком уровне.
no subject
Date: 2014-05-07 04:15 pm (UTC)Забавная цитата из описания программы Mach3: "Mach3 Driver, устанавливаемый на настольный ПК (Лэптопы не поддерживаются, так как их функции сбережения энергии чипсета нарушают поток импульсов)" - кстати есть такая особенность, сильно увеличиваются задержки, когда ядра в сон уходят и обратно пытаются проснуться, но решается установкой параметров процессора на 100% производительность минимальную.
"Микрошаг" - это вариант установки ротора двигателя в промежуточное между полюсами положение, определяемое магнитным потоком от соседних полюсов. Зависимость косинусоидальная. Хотя где-то встречал описание, что формула более сложная, но в микросхемах готовых чистая косинусоида. Вот пример готового драйвера для биполярных двигателей (4-х проводных): http://www.allegromicro.com/~/media/Files/Datasheets/A3967-Datasheet.ashx (http://www.allegromicro.com/~/media/Files/Datasheets/A3967-Datasheet.ashx) там есть и краткое описание и табличка "Step sequencing".
Ещё цитаты: "Основным применением микрошагового режима является борьба с резонансом, снижение вибрации шагового двигателя и повышения плавности хода передачи. Достигается это благодаря тому, что при использовании микрошагового режима на вал мотора действуют более кратковременные усилия разгона-торможения, сам вал совершает шаги меньшей амплитуды, в результате инерционные явления проявлены слабее.
Выбор оптимального режима деления шага
Оптимальный режим деления шага необходимо выбирать в зависимости от конкретного станка и стоящих задач. Основными факторами являются необходимость снизить резонанс двигателей, уменьшить шум, разрешающую способность станка. В большинстве случаев имеет смысл использовать наибольшее деление шага, при котором станок сможет развивать расчетную максимальную скорость. Ограничением в данном случае будет максимальная частота входных импульсов у драйвера или максимальная частота генерации управляющих импульсов ЧПУ-системой. Скажем, скорость вращения 10 об/сек стандартного двигателя с шагом 1.8 град требует подавать импульсы STEP с частотой 2000 Гц для режима полного шага и с частотой 256 КГц для деления шага 1:128, тогда как, например, программа Mach3 максимально может генерировать импульсы с частотой 100 Гц."
Отсюда: http://darxton.ru/articles/cnc-drive/mikroshag-shagovyj-dvigatel/ (http://darxton.ru/articles/cnc-drive/mikroshag-shagovyj-dvigatel/)
То есть этот Mach3 кажется совсем медленным.
no subject
Date: 2014-05-07 04:44 pm (UTC)вообщем Mach3 считается open loop, но поддерживает closed loop, через какой-то плагин (не очень популярно).
Linux CNC поддерживает closed loop. но предупреждает что частота тогда может быть не более 1кГц для стабильной работы.
Рекомендует аппаратный closed loop (как это реализовано не понятно)
насчет микрошага, я думаю он тоже не поддерживается но посмотрю, я не собираюсь переписывать софт.
По мне так обратная связь серьезный overengineering, это намного усложняет дизайн и дает очень мало пользы.
фактически одна польза может заключаться в том чтобы адаптивно подстраивать фидрейт (т.е. замедлять программу, если отслеживаются потери тактов) такое мало кто успешно реализовал насколько я понял.
второе самое распространенное использование это тупо остановка станка если определена потеря шагов, больше определенного тресхолда. тогда можно в ручную поставить меньший фидрейт и запустить программу снова.
Намного проще просто поставить шаговые двигатели с большим запасом мощности, и не использовать скоростные режимы, потому как и резцы незачем нагружать на пределе.
Mach3 никто на лаптопах не запускает, запускают на отдельных ПК средней мощности, с урезанными фоновыми процессами, сервисами и т.д.
Mach3 самaя распространенная и популярная программа в мире. Ей пользуются все, кто не заплатил много килобаксов за proprietary солюшены от производителей станков.
но если потребуется написать плагин для таких пропраетари систем, то это невозможно. потому я и перехожу на Mach3.
"Mach3 максимально может генерировать импульсы с частотой 100 Гц."
тут явно опечатка.
100кГц
no subject
Date: 2014-05-07 05:26 pm (UTC)closed loop - это "замкнутая петля обратной связи". Ограничение быстродействия связано с вносимым программой в обратную связь запаздыванием превышающим время инерции двигателя с приводом.
Грубо говоря дали команду "двигатель быстро крутись", обратная связь заметила, что уже "многовато будет", даёт команду "тормози!!!", а она пока дойдёт - двигатель "перекрутился", команда "назад", опять опоздали. И вместо двигателя у нас колебания получатся. Выход - крутиться медленнее.
В общем обратная связь должна быть "быстрее" чем механическая реакция двигателя с приводом.
Аппаратная связь с валкодером или другим датчиком вносит минимальную электрическую задержку и двигатель при определённом подборе характеристик обратной связи можно очень быстро и точно устанавливать в нужную позу сильно форсируя ток в крайних положениях. Ну вот привод головок жесткого диска таким макаром ухитряется за 10 миллисекунд стать на дорожу с точностью в доли микрона пролетев перед этим пару сантиметров с приличной скоростью за то же время. А там только магнитное поле и никаких шестерёнок.
no subject
Date: 2014-05-07 06:34 pm (UTC)да и обратную связь лучше не поднимать на уровень Mach3 а реализовать аппаратно, типо получили команду, обязаны выполнить, если не можем, обрывай процесс.
я сейчас изучаю цену вопроса, замена степперов на серво с датчиками + драйверы
no subject
Date: 2014-05-07 07:03 pm (UTC)И как бы не оказалось, что в драйвер сервопривода для реализации всей его "крутизны" следует сразу загонять всю траекторию движения (ну в пределах "одного подхода"), чтобы он знал, куда крутить - а это резко усложняет "железячно-програмную" часть (контроллер должен вычислять траекторию по прямым-дугам и прочим фигурам сразу для всех задействованных осей) и не факт, что поддерживается во всех программах.
no subject
Date: 2014-05-07 07:51 pm (UTC)но конечно Mach3 нужно по другому настраивать, моторы калибровать, чтобы она не давала невозможные команды монотрам.
http://www.ebay.co.uk/itm/CNC-Leadshine-Closed-Loop-Hybrid-Servo-Drive-Kit-HBS57-Driver-Motor-encoder-/281233568175?pt=UK_BOI_Industrial_Automation_Control_ET&hash=item417ad3b1af
CNC Leadshine Closed Loop Hybrid Servo Drive Kit HBS57 Driver + Motor + encoder
я к сожалению пока не имею доступа к своему купленному станку, чтобы определить механическую совместимость и обьем пределок. думаю поюзаю на степперах а потом перейду на сервоприводы
no subject
Date: 2014-05-07 04:48 pm (UTC)скажем 1/4.
mach3 будет генерировать импульсы с одной частотой, а в PCI карте эти импульсы будут равномерно распределяться, и генерироваться в 4 раза больше импульсов.
кроме того нужно переделать драйверы на микрошаг.
no subject
Date: 2014-05-07 04:59 pm (UTC)no subject
Date: 2014-05-07 05:11 pm (UTC)в PCI карте нужно организовать буфер, вести регистрацию времени приходящих данных, сделать запаздывание на один одну еденицу данных, до начала генерации серии импульсов.
короче нужно сглаживать приходящие импульсы между ними.
линейная интерполяция по времени,
no subject
Date: 2014-05-07 05:30 pm (UTC)no subject
Date: 2014-05-07 06:35 pm (UTC)no subject
Date: 2014-05-07 06:44 am (UTC)