Страница 1 из 1

Подключение Mesa 5i25 к драйверу PLC545 обычным LPT кабелем

Добавлено: 05 янв 2015, 18:39
aekhv
Делал давно, выкладываю на форуме для истории. Может кому-то пригодится.

Купил я как-то Mesa 5i25 без каких-либо дочерних плат, рассчитывая первое время погонять её с прошивкой PROB_RFX2. Также имелся драйвер шаговых движков PLC545 от Purelogic и кабель LPT для соединения одного с другим.

Прошивка PROB_RFX2 даёт нам 8 генераторов Step/Dir (плюс ещё два генератора PWM и пару входов квадратурных энкодеров) и генераторы эти жёстко привязаны к определённым пинам внешнего и внутреннего разъёмов 5i25. Иначе говоря, если на этапе конфигурирования в Pncconf вы задействуете какие-либо генераторы Step/Dir - они займут строго определенные В ПРОШИВКЕ пины, переназначить их на другие нельзя. Пины незадействованных генераторов превращаются в программируемые входы или выходы, тут пользователь ничем не ограничен.

Так вот, оказалось, что у Mesa 5i25 (с прошивкой PROB_RFX2, конечно же) и у драйвера PLC545 линии Step/Dir приходятся на разные пины в разъёме DB25, что не позволяет подключить одно к другому обычным LPT кабелем. Т.е. физически кабель подключается без каких-либо проблем, но из-за неправильной разводки внутри кабеля покрутить движками не получится.

Разрешить задачку можно двумя способами:
1. Перепайка LPT кабеля.
2. Модификация прошивки PROB_RFX2 с целью изменить дефолтную распиновку генераторов Step/Dir на свою собственную.

Я, как настоящий лентяй, решительно отверг первый вариант, целиком сосредоточившись на втором. Для этого я набросал табличку, из которой видно какие пины в разъёме DB25 со стороны Mesa 5i25 предстоит программно переставить.
5i25_plc545_00.png
Во-первых, предстоит изменить последовательность пинов генераторов Step/Dir (зелёная группа на картинке), распределив их так, чтобы обеспечить прямую совместимость с PLC545.

Во-вторых, если мы планируем задействовать генератор PWM для управления оборотами шпинделя (синяя группа на картинке), прошивка PROB_RFX2 автоматически даст нам сразу два выхода: PWMGen (out) и PWMGen (dir). Первый выход мы с радостью заведём на вход преобразователя ШИМ-напряжение PLC545, а вот второй выход заблокирует возможность управлять реле Relay 1 (выделено красным). От возможности клацкать реле мы отказываться не собираемся, поэтому PWMGen (dir) перебросим на внутренний разъём P2 5i25, взяв взамен с него же universal in/out.

Остальные пины не вызывают вопросов, их легко превратить в нужные входы или выходы на этапе настройки в Pncconf.

Собственно, приступим. Нам потребуется архив прошивок к Mesa 5i25 и Xilinx ISE Design Suite. Первое ищем на официальном сайте (или вот прямая ссылка), второе не сложно найти на просторах интернета. Я использовал ISE Design Suite версии 14.5 для Windows 64-bit.

В архиве с прошивками находим и извлекаем:
5i25\configs\hostmot2\5i25_prob_rfx2.xml
5i25\configs\hostmot2\source\hostmot2.zip

Архив с исходниками hostmot2.zip полностью распаковываем в отдельную папочку и запускаем ISE Design Suite. Затем открываем проект с именем fivei25.xise.
5i25_plc545_01.png
На требование обновить наш проект до новой версии Project Navigator отвечаем Migrate Only. Сразу же видим сообщение, что мол часть файлов в проекте отсутствует. Отмечаем галкой Remove unspecified files from project , так как эти файлы для сборки нашей прошивки не нужны.
5i25_plc545_02.png
Наконец-то откроется проект, в котором переходим во вкладку Libraries. Во вкладке раскрываем список библиотек work, находим библиотеку PIN_PROB_RFx2_34.vhd и открываем её обычным дабл кликом.
5i25_plc545_03.png
Начиная со строки 109 можно видеть порядок назначения пинов внешнему и внутреннему разъёмам Mesa 5i25. Нам нужно изменить очерёдность пинов генераторов Step/Dir так, чтобы во внешнем разъёме DB25 они в точности соответствовали распиновке PLC545. Также не забываем про нюанс с PWMGen (dir), нам нужно избавиться от этого пина, заменив его на обычный пин ввода/вывода. Согласно приведённой выше таблице описание пинов примет такой вид:

Код: Выделить всё

	constant PinDesc : PinDescType :=(
-- 	Base func  sec unit sec func 	 sec pin					-- external DB25
		IOPortTag & x"00" & NullTag & NullPin,				-- I/O 00	PIN 1	Output 2 just GPIO
		IOPortTag & x"00" & PWMTag & PWMAOutPin,			-- I/O 01	PIN 14	Spindle DAC PWM
		IOPortTag & x"00" & StepGenTag & StepGenStepPin,		-- I/O 02	PIN 2	X Step
		IOPortTag & x"00" & NullTag & NullPin,				-- I/O 03	PIN 15	just GPIO
		IOPortTag & x"01" & StepGenTag & StepGenStepPin,		-- I/O 06	PIN 4	Y Step
		IOPortTag & x"00" & NullTag & NullPin,				-- I/O 07	PIN 17	Output 1 just GPIO
		IOPortTag & x"02" & StepGenTag & StepGenStepPin,		-- I/O 09	PIN 6	Z Step
		IOPortTag & x"00" & NullTag & NullPin,				-- I/O 05	PIN 16	Spindle DAC Dir
		IOPortTag & x"03" & StepGenTag & StepGenStepPin,		-- I/O 11	PIN 8	A Step
		IOPortTag & x"00" & StepGenTag & StepGenDirPin,		-- I/O 04	PIN 3	X Dir
		IOPortTag & x"01" & StepGenTag & StepGenDirPin,		-- I/O 08	PIN 5	Y Dir
		IOPortTag & x"02" & StepGenTag & StepGenDirPin,		-- I/O 10	PIN 7	Z Dir
		IOPortTag & x"03" & StepGenTag & StepGenDirPin,		-- I/O 12	PIN 9	A Dir
		IOPortTag & x"00" & NullTag & NullPin,				-- I/O 13	PIN 10	Input 4 just GPIO
		IOPortTag & x"00" & QCountTag & QCountQAPin,  		-- I/O 14	PIN 11	Input 2 (Quad A)
		IOPortTag & x"00" & QCountTag & QCountQBPin,  		-- I/O 15	PIN 12	Input 3 (Quad B)
		IOPortTag & x"00" & QCountTag & QCountIdxPin,		-- I/O 16	PIN 13	Input 4 (Quad Idx)
		
													-- 26 HDR	-- IDC DB25	
		IOPortTag & x"00" & PWMTag & PWMBDirPin,			-- I/O 17	PIN 1	PIN 1 	Output 2 just GPIO 
		IOPortTag & x"01" & PWMTag & PWMAOutPin,			-- I/O 18   PIN 2		PIN 14	Spindle DAC PWM
		IOPortTag & x"04" & StepGenTag & StepGenStepPin,		-- I/O 19   PIN 3		PIN 2	   X2 Step
		IOPortTag & x"00" & NullTag & NullPin,				-- I/O 20	PIN 4		PIN 15	just GPIO
		IOPortTag & x"04" & StepGenTag & StepGenDirPin,		-- I/O 21	PIN 5		PIN 3	   X2 Dir    
		IOPortTag & x"01" & PWMTag & PWMBDirPin,			-- I/O 22	PIN 6		PIN 16	Spindle DAC DirHz)
		IOPortTag & x"05" & StepGenTag & StepGenStepPin,		-- I/O 23	PIN 7		PIN 4	   Y2 Step
		IOPortTag & x"00" & NullTag & NullPin,				-- I/O 24	PIN 8		PIN 17	Output 1 just GPIO
		IOPortTag & x"05" & StepGenTag & StepGenDirPin,		-- I/O 25	PIN 9		PIN 5	   Y2 Dir
		IOPortTag & x"06" & StepGenTag & StepGenStepPin,		-- I/O 26	PIN 11	PIN 6	   Z2 Step
		IOPortTag & x"06" & StepGenTag & StepGenDirPin,		-- I/O 27	PIN 13	PIN 7	   Z2 Dir
		IOPortTag & x"07" & StepGenTag & StepGenStepPin,		-- I/O 28	PIN 15	PIN 8	   A2 Step
		IOPortTag & x"07" & StepGenTag & StepGenDirPin,		-- I/O 29	PIN 17	PIN 9	   A2 Dir
		IOPortTag & x"00" & NullTag & NullPin,				-- I/O 30	PIN 19	PIN 10	Input 4 just GPIO
		IOPortTag & x"01" & QCountTag & QCountQAPin,  		-- I/O 31	PIN 21	PIN 11  	Input 2 (Quad A)
		IOPortTag & x"01" & QCountTag & QCountQBPin,  		-- I/O 32	PIN 23	PIN 12	Input 3 (Quad B))
		IOPortTag & x"01" & QCountTag & QCountIdxPin,    		-- I/O 33	PIN 25	PIN 13	Input 4 (Quad Idx)
		

		emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin, -- added for 34 pin 5I25
		emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,


		emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin, -- added for IDROM v3
		emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,
					
		emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,
		emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,
		emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,
		emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,
		emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,
		emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,
		emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,
		emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,
		emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,
		emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin,emptypin);
Сохраняем проект (File > Save All) и закрываем окно редактора (Window > Close). Переходим во вкладку Design и дабл кликом открываем TopPCIHostMot2 - Behavioral( TopPCIHostMot2.vhd).
5i25_plc545_04.png
Пролистываем чуть-чуть вверх до строки 81 и убеждаемся, что из всех поддерживаемых плат выбрана единственно верная - Mesa 5i25.
5i25_plc545_05.png
Далее листаем вниз, внимательно высматривая какие модификации прошивок в этом проекте будут использоваться при компиляции. Видим что-то подобное.
5i25_plc545_06.png
Ненужный файл отключаем при помощи символов комментария, а предварительно исправленный PIN_PROB_RFx2_34 наоборот раскомментируем.
5i25_plc545_07.png
Сохраняем проект (File > Save All) и закрываем окно редактора (Window > Close). Нацеливаем дабл клик на Generate Programming File и, спустя секунд 30...40, видим сообщение о успешной компиляции проекта. В папке куда вы распаковали исходники должен появиться файл прошивки toppcihostmot2.bit, именно его мы будем зашивать в Mesa 5i25.
5i25_plc545_08.png
Собственно процессе прошивки очень прост, он вполне доходчиво описан в мануале к Mesa. В linux консоли придётся набрать что-то вроде:

Код: Выделить всё

mesaflash -device 5I25 -write toppcihostmot2.bit
Теперь осталось объяснить Pncconf, что в нашей прошивке PROB_RFX2 изменилось назначение некоторых пинов, для этого поправим распакованный ранее файлик 5i25_prob_rfx2.xml.

Код: Выделить всё

<?xml version="1.0"?>
<hostmot2>
    <boardname>5i25</boardname>
    <ioports>2</ioports>
    <iowidth>34</iowidth>
    <portwidth>17</portwidth>
    <clocklow>33333333</clocklow>
    <clockhigh>200000000</clockhigh>
    <modules>
        <module>
            <tagname>IOPort</tagname>
            <numinstances> 2</numinstances>
        </module>
        <module>
            <tagname>Encoder</tagname>
            <numinstances> 2</numinstances>
        </module>
        <module>
            <tagname>StepGen</tagname>
            <numinstances> 8</numinstances>
        </module>
        <module>
            <tagname>PWMGen</tagname>
            <numinstances> 2</numinstances>
        </module>
        <module>
            <tagname>LED</tagname>
            <numinstances> 1</numinstances>
        </module><module>
            <tagname>None</tagname>
            <numinstances> 1</numinstances>
        </module>
    </modules>
    <pins>
        <pin>
            <connector>P3</connector>
            <secondarymodulename>None</secondarymodulename>
            <secondaryfunctionname>0</secondaryfunctionname>
            <secondaryinstance>0</secondaryinstance>
        </pin>
        <pin>
            <connector>P3</connector>
            <secondarymodulename>PWMGen</secondarymodulename>
            <secondaryfunctionname>PWM/Up (out)</secondaryfunctionname>
            <secondaryinstance> 0</secondaryinstance>
        </pin>
        <pin>
            <connector>P3</connector>
            <secondarymodulename>StepGen</secondarymodulename>
            <secondaryfunctionname>Step (out)</secondaryfunctionname>
            <secondaryinstance> 0</secondaryinstance>
        </pin>
        <pin>
            <connector>P3</connector>
            <secondarymodulename>None</secondarymodulename>
            <secondaryfunctionname>0</secondaryfunctionname>
            <secondaryinstance>0</secondaryinstance>
        </pin>
        <pin>
            <connector>P3</connector>
            <secondarymodulename>StepGen</secondarymodulename>
            <secondaryfunctionname>Step (out)</secondaryfunctionname>
            <secondaryinstance> 1</secondaryinstance>
        </pin>
        <pin>
            <connector>P3</connector>
            <secondarymodulename>None</secondarymodulename>
            <secondaryfunctionname>0</secondaryfunctionname>
            <secondaryinstance>0</secondaryinstance>
        </pin>
        <pin>
            <connector>P3</connector>
            <secondarymodulename>StepGen</secondarymodulename>
            <secondaryfunctionname>Step (out)</secondaryfunctionname>
            <secondaryinstance> 2</secondaryinstance>
        </pin>
        <pin>
            <connector>P3</connector>
            <secondarymodulename>None</secondarymodulename>
            <secondaryfunctionname>0</secondaryfunctionname>
            <secondaryinstance>0</secondaryinstance>
        </pin>
        <pin>
            <connector>P3</connector>
            <secondarymodulename>StepGen</secondarymodulename>
            <secondaryfunctionname>Step (out)</secondaryfunctionname>
            <secondaryinstance> 3</secondaryinstance>
        </pin>
        <pin>
            <connector>P3</connector>
            <secondarymodulename>StepGen</secondarymodulename>
            <secondaryfunctionname>Dir (out)</secondaryfunctionname>
            <secondaryinstance> 0</secondaryinstance>
        </pin>
        <pin>
            <connector>P3</connector>
            <secondarymodulename>StepGen</secondarymodulename>
            <secondaryfunctionname>Dir (out)</secondaryfunctionname>
            <secondaryinstance> 1</secondaryinstance>
        </pin>
        <pin>
            <connector>P3</connector>
            <secondarymodulename>StepGen</secondarymodulename>
            <secondaryfunctionname>Dir (out)</secondaryfunctionname>
            <secondaryinstance> 2</secondaryinstance>
        </pin>
        <pin>
            <connector>P3</connector>
            <secondarymodulename>StepGen</secondarymodulename>
            <secondaryfunctionname>Dir (out)</secondaryfunctionname>
            <secondaryinstance> 3</secondaryinstance>
        </pin>
        <pin>
            <connector>P3</connector>
            <secondarymodulename>None</secondarymodulename>
            <secondaryfunctionname>0</secondaryfunctionname>
            <secondaryinstance>0</secondaryinstance>
        </pin>
        <pin>
            <connector>P3</connector>
            <secondarymodulename>QCount</secondarymodulename>
            <secondaryfunctionname>Phase A (in)</secondaryfunctionname>
            <secondaryinstance> 0</secondaryinstance>
        </pin>
        <pin>
            <connector>P3</connector>
            <secondarymodulename>QCount</secondarymodulename>
            <secondaryfunctionname>Phase B (in)</secondaryfunctionname>
            <secondaryinstance> 0</secondaryinstance>
        </pin>
        <pin>
            <connector>P3</connector>
            <secondarymodulename>QCount</secondarymodulename>
            <secondaryfunctionname>Index (in)</secondaryfunctionname>
            <secondaryinstance> 0</secondaryinstance>
        </pin>
        <pin>
            <connector>P2</connector>
            <secondarymodulename>PWMGen</secondarymodulename>
            <secondaryfunctionname>Dir/Down (out)</secondaryfunctionname>
            <secondaryinstance> 0</secondaryinstance>
        </pin>
        <pin>
            <connector>P2</connector>
            <secondarymodulename>PWMGen</secondarymodulename>
            <secondaryfunctionname>PWM/Up (out)</secondaryfunctionname>
            <secondaryinstance> 1</secondaryinstance>
        </pin>
        <pin>
            <connector>P2</connector>
            <secondarymodulename>StepGen</secondarymodulename>
            <secondaryfunctionname>Step (out)</secondaryfunctionname>
            <secondaryinstance> 4</secondaryinstance>
        </pin>
        <pin>
            <connector>P2</connector>
            <secondarymodulename>None</secondarymodulename>
            <secondaryfunctionname>0</secondaryfunctionname>
            <secondaryinstance>0</secondaryinstance>
        </pin>
        <pin>
            <connector>P2</connector>
            <secondarymodulename>StepGen</secondarymodulename>
            <secondaryfunctionname>Dir (out)</secondaryfunctionname>
            <secondaryinstance> 4</secondaryinstance>
        </pin>
        <pin>
            <connector>P2</connector>
            <secondarymodulename>PWMGen</secondarymodulename>
            <secondaryfunctionname>Dir/Down (out)</secondaryfunctionname>
            <secondaryinstance> 1</secondaryinstance>
        </pin>
        <pin>
            <connector>P2</connector>
            <secondarymodulename>StepGen</secondarymodulename>
            <secondaryfunctionname>Step (out)</secondaryfunctionname>
            <secondaryinstance> 5</secondaryinstance>
        </pin>
        <pin>
            <connector>P2</connector>
            <secondarymodulename>None</secondarymodulename>
            <secondaryfunctionname>0</secondaryfunctionname>
            <secondaryinstance>0</secondaryinstance>
        </pin>
        <pin>
            <connector>P2</connector>
            <secondarymodulename>StepGen</secondarymodulename>
            <secondaryfunctionname>Dir (out)</secondaryfunctionname>
            <secondaryinstance> 5</secondaryinstance>
        </pin>
        <pin>
            <connector>P2</connector>
            <secondarymodulename>StepGen</secondarymodulename>
            <secondaryfunctionname>Step (out)</secondaryfunctionname>
            <secondaryinstance> 6</secondaryinstance>
        </pin>
        <pin>
            <connector>P2</connector>
            <secondarymodulename>StepGen</secondarymodulename>
            <secondaryfunctionname>Dir (out)</secondaryfunctionname>
            <secondaryinstance> 6</secondaryinstance>
        </pin>
        <pin>
            <connector>P2</connector>
            <secondarymodulename>StepGen</secondarymodulename>
            <secondaryfunctionname>Step (out)</secondaryfunctionname>
            <secondaryinstance> 7</secondaryinstance>
        </pin>
        <pin>
            <connector>P2</connector>
            <secondarymodulename>StepGen</secondarymodulename>
            <secondaryfunctionname>Dir (out)</secondaryfunctionname>
            <secondaryinstance> 7</secondaryinstance>
        </pin>
        <pin>
            <connector>P2</connector>
            <secondarymodulename>None</secondarymodulename>
            <secondaryfunctionname>0</secondaryfunctionname>
            <secondaryinstance>0</secondaryinstance>
        </pin>
        <pin>
            <connector>P2</connector>
            <secondarymodulename>QCount</secondarymodulename>
            <secondaryfunctionname>Phase A (in)</secondaryfunctionname>
            <secondaryinstance> 1</secondaryinstance>
        </pin>
        <pin>
            <connector>P2</connector>
            <secondarymodulename>QCount</secondarymodulename>
            <secondaryfunctionname>Phase B (in)</secondaryfunctionname>
            <secondaryinstance> 1</secondaryinstance>
        </pin>
        <pin>
            <connector>P2</connector>
            <secondarymodulename>QCount</secondarymodulename>
            <secondaryfunctionname>Index (in)</secondaryfunctionname>
            <secondaryinstance> 1</secondaryinstance>
        </pin>
    </pins>
</hostmot2>
Исправленный 5i25_prob_rfx2.xml нужно скопировать в /lib/firmware/hm2/5i25/, после чего в Pncconf в выпадающем списке напротив Firmware мы сможем указать какую прошивку используем. В соответствии с возможностями PLC545 число генераторов PWM будет «1», количество энкодеров «0», а генераторов шагов — «3» или «4». Затем жмём на Accept components changes и завершаем настройку пинов в двух соседних вкладках.
5i25_plc545_09.png
Тут ничего не меням. На внутренний разъём у нас уехал ненужный выход генератора PWM.
5i25_plc545_10.png
А тут нужно настроить только пины ввода/выводы, генераторы шагов заняли правильные пины автоматически!
5i25_plc545_11.png
Как не трудно догадаться, подобным образом - то есть без переделки LPT кабеля - к Mesa 5i25 можно подключить не только драйвер PLC545, но и любой другой драйвер ШД или breakout плату с разъёмом DB25 и распиновкой, не позволяющей задействовать прошивку PROB_RFX2 в «чистом виде». Надеюсь, кто-то дочитал до конца и не уснул :hehehe:

Архив с готовой прошивкой и xml для Pncconf пригагаю.

Re: Подключение Mesa 5i25 к драйверу PLC545 обычным LPT кабе

Добавлено: 05 янв 2015, 18:45
tooshka
BentScrew писал(а):Я, как настоящий лентяй, решительно отверг первый вариант, целиком сосредоточившись на втором.
Вот это по нашему уважаю)))

Re: Подключение Mesa 5i25 к драйверу PLC545 обычным LPT кабе

Добавлено: 05 янв 2015, 21:18
Serg
BentScrew писал(а):второе не сложно найти на просторах интернета. Я использовал ISE Design Suite версии 14.5 для Windows 64-bit.
Второе тоже дают на официальном сайте: http://www.xilinx.com/products/design-t ... bpack.html