Добро пожаловать на Форум по станкам с ЧПУ!

использование pluto-p подобных плат в чпу.

Тема в разделе "Драйверы и контроллеры для CNC", создана пользователем mura, 6 апр 2012.

  1. mura

    mura

    Регистрация:
    5 апр 2012
    Сообщения:
    210
    Симпатии:
    0
    Тема пересена из др. топика. Impartial сказал: А никто не пробовал такое сделать для управления станком? http://www.knjn.com/FPGA-Parallel.html Ведь преимуществ много! Легко перенастраивается с шагового режима на серво, не требует программатора, много входов-выходов и простое подключение к LPT порту. Исходный код открытый под GPL лицензией в ЕМС2. При желании и знании Verilog или VHDL можно описать и запрограммировать любую конфигурацию оборудования. Но и так существует уже готовое решение и не надо заморачиваться с программированием. И цена на FPGA типа Cyclone 1,2,3 в районе 10$. Но ведь именно на эту плату есть готовые драйвера в EMC2 для работы как сервоприводов, и не в режиме step/dir, так и шаговых двигателей. Вроде по теме, ведь здесь попытка найти тоже решение. Я что-то исходников не нашел, можно пальцем ткнуть? Схему сейчас разрабатываю на EP1K30TC144 потому что много в наличии. Программирование по PPA. Штатное по PS.
     
  2. Impartial

    Impartial

    Регистрация:
    6 апр 2012
    Сообщения:
    62
    Симпатии:
    0
    // This program is free software; you can redistribute it and/or modify Вот исходник для шаговиков. Если Морис (автор драйвера на ксайлинксе) разрешит, то подключаем его модуль сюда и имеем универсальный контроллер на все случаи жизни и на любое количество координат (до 8 в случае подключения к ЛПТ порту). И на любое сочетание серво/шаговики, причем на одном станке. Плюс куча входов/выходов для управления электроавтоматикой. Дальше идут только связки типа IR21XX или L6386 или по фантазии, и силовые ключи либо в парах (верх/низ) либо набором верх/низ и, по желанию(необходимости), опторазвязка входов-выходов. // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA module main(clk, led, nConfig, epp_nReset, pport_data, nWrite, nWait, nDataStr, nAddrStr, dout, din, step, dir); parameter W=10; parameter F=11; parameter T=4; input clk; output led, nConfig; inout [7:0] pport_data; input nWrite; output nWait; input nDataStr, nAddrStr, epp_nReset; input [15:0] din; reg Spolarity; reg[13:0] real_dout; output [13:0] dout = do_tristate ? 14'bZ : real_dout; wire[3:0] real_step; output [3:0] step = do_tristate ? 4'bZ : real_step ^ {4{Spolarity}}; wire[3:0] real_dir; output [3:0] dir = do_tristate ? 4'bZ : real_dir; wire [W+F-1:0] pos0, pos1, pos2, pos3; reg [F:0] vel0, vel1, vel2, vel3; reg [T-1:0] dirtime, steptime; reg [1:0] tap; reg [10:0] div2048; wire stepcnt = ~|(div2048[5:0]); always @(posedge clk) begin div2048 <= div2048 + 1'd1; end wire do_enable_wdt, do_tristate; wdt w(clk, do_enable_wdt, &div2048, do_tristate); stepgen #(W,F,T) s0(clk, stepcnt, pos0, vel0, dirtime, steptime, real_step[0], real_dir[0], tap); stepgen #(W,F,T) s1(clk, stepcnt, pos1, vel1, dirtime, steptime, real_step[1], real_dir[1], tap); stepgen #(W,F,T) s2(clk, stepcnt, pos2, vel2, dirtime, steptime, real_step[2], real_dir[2], tap); stepgen #(W,F,T) s3(clk, stepcnt, pos3, vel3, dirtime, steptime, real_step[3], real_dir[3], tap); // EPP stuff wire EPP_write = ~nWrite; wire EPP_read = nWrite; wire EPP_addr_strobe = ~nAddrStr; wire EPP_data_strobe = ~nDataStr; wire EPP_strobe = EPP_data_strobe | EPP_addr_strobe; wire EPP_wait; assign nWait = ~EPP_wait; wire [7:0] EPP_datain = pport_data; wire [7:0] EPP_dataout; assign pport_data = EPP_dataout; reg [4:0] EPP_strobe_reg; always @(posedge clk) EPP_strobe_reg <= {EPP_strobe_reg[3:0], EPP_strobe}; wire EPP_strobe_edge1 = (EPP_strobe_reg[2:1]==2'b01); // reg led; assign EPP_wait = EPP_strobe_reg[4]; wire[15:0] EPP_dataword = {EPP_datain, lowbyte}; reg[4:0] addr_reg; reg[7:0] lowbyte; always @(posedge clk) if(EPP_strobe_edge1 & EPP_write & EPP_addr_strobe) begin addr_reg <= EPP_datain[4:0]; end else if(EPP_strobe_edge1 & !EPP_addr_strobe) addr_reg <= addr_reg + 4'd1; always @(posedge clk) begin if(EPP_strobe_edge1 & EPP_write & EPP_data_strobe) begin if(addr_reg[3:0] == 4'd1) vel0 <= EPP_dataword[F:0]; else if(addr_reg[3:0] == 4'd3) vel1 <= EPP_dataword[F:0]; else if(addr_reg[3:0] == 4'd5) vel2 <= EPP_dataword[F:0]; else if(addr_reg[3:0] == 4'd7) vel3 <= EPP_dataword[F:0]; else if(addr_reg[3:0] == 4'd9) begin real_dout <= { EPP_datain[5:0], lowbyte }; end else if(addr_reg[3:0] == 4'd11) begin tap <= lowbyte[7:6]; steptime <= lowbyte[T-1:0]; Spolarity <= EPP_datain[7]; // EPP_datain[6] is do_enable_wdt dirtime <= EPP_datain[T-1:0]; end else lowbyte <= EPP_datain; end end reg [31:0] data_buf; always @(posedge clk) begin if(EPP_strobe_edge1 & EPP_read && addr_reg[1:0] == 2'd0) begin if(addr_reg[4:2] == 3'd0) data_buf <= pos0; else if(addr_reg[4:2] == 3'd1) data_buf <= pos1; else if(addr_reg[4:2] == 3'd2) data_buf <= pos2; else if(addr_reg[4:2] == 3'd3) data_buf <= pos3; else if(addr_reg[4:2] == 3'd4) data_buf <= din; end end // the addr_reg test looks funny because it is auto-incremented in an always // block so "1" reads the low byte, "2 and "3" read middle bytes, and "0" // reads the high byte I have a feeling that I'm doing this in the wrong way. wire [7:0] data_reg = addr_reg[1:0] == 2'd1 ? data_buf[7:0] : (addr_reg[1:0] == 2'd2 ? data_buf[15:8] : (addr_reg[1:0] == 2'd3 ? data_buf[23:16] : data_buf[31:24])); wire [7:0] EPP_data_mux = data_reg; assign EPP_dataout = (EPP_read & EPP_wait) ? EPP_data_mux : 8'hZZ; // assign do_enable_wdt = EPP_strobe_edge1 & EPP_write & EPP_data_strobe & (addr_reg[3:0] == 4'd9) & EPP_datain[6]; // assign led = do_tristate ? 1'BZ : (real_step[0] ^ real_dir[0]); assign led = do_tristate ? 1'bZ : (real_step[0] ^ real_dir[0]); assign nConfig = epp_nReset; // 1'b1; assign do_enable_wdt = EPP_strobe_edge1 & EPP_write & EPP_data_strobe & (addr_reg[3:0] == 4'd9) & EPP_datain[6]; endmodule // This is a component of pluto_step, a hardware step waveform generator // Copyright 2007 Jeff Epler <jepler@unpythonic.net> // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA module stepgen(clk, enable, position, velocity, dirtime, steptime, step, dir, tap); `define STATE_STEP 0 `define STATE_DIRCHANGE 1 `define STATE_DIRWAIT 2 parameter W=12; parameter F=10; parameter T=5; input clk, enable; output [W+F-1:0] position; reg [W+F-1:0] position; input [F:0] velocity; input [T-1:0] dirtime, steptime; input [1:0] tap; output step, dir; reg step, dir; reg [T-1:0] timer; reg [1:0] state; reg ones; wire dbit = velocity[F]; wire pbit = (tap == 0 ? position[F] : (tap == 1 ? position[F+1] : (tap == 2 ? position[F+2] : position[F+3]))); wire [W+F-1:0] xvelocity = {{W{velocity[F]}}, {1{velocity[F-1:0]}}}; `ifdef TESTING // for testing: initial position = 1'b0; initial state = `STATE_STEP; initial timer = 0; initial dir = 0; initial ones = 0; `endif always @(posedge clk) begin if(enable) begin // $display("state=%d timer=%d position=%h velocity=%h dir=%d dbit=%d pbit=%d ones=%d", state, timer, position, xvelocity, dir, dbit, pbit, ones); if((dir != dbit) && (pbit == ones)) begin if(state == `STATE_DIRCHANGE) begin if(timer == 0) begin dir <= dbit; timer <= dirtime; state <= `STATE_DIRWAIT; end else begin timer <= timer - 1'd1; end end else begin if(timer == 0) begin step <= 0; timer <= dirtime; state <= `STATE_DIRCHANGE; end else begin timer <= timer - 1'd1; end end end else if(state == `STATE_DIRWAIT) begin if(timer == 0) begin state <= `STATE_STEP; end else begin timer <= timer - 1'd1; end end else begin if(timer == 0) begin if(pbit != ones) begin ones <= pbit; step <= 1'd1; timer <= steptime; end else begin step <= 0; end end else begin timer <= timer - 1'd1; end if(dir == dbit) position <= position + xvelocity; end end end endmodule
     
  3. boldive

    boldive

    Регистрация:
    5 апр 2012
    Сообщения:
    53
    Симпатии:
    0
    после беглого просмотра кода что-то подсказывает мне что обычная плата опторазвязки делает то-же самое и с меньшим напрягом. вы можете на пальцах объяснить для чего это надо? ведь это не драйвер шагового двигателя, эта штука стоит между lpt портом и платой драйвера шд.
     
  4. Impartial

    Impartial

    Регистрация:
    6 апр 2012
    Сообщения:
    62
    Симпатии:
    0
    Первое и самое главное! Это и есть полноценные драйвера как шаговых двигателей, так и сервоприводов. Когда я писал о подключении модуля Мориса, то имел ввиду не железо, а программу на Верилоге. Второе Для полноценной работы системы управления приводом необходимо получать не точку(степ/дир) а вектор, что эта плата и делает, обрабатывая полученный с компа вектор с параметрами начало/конец, скорость ... Третье В данном случае Л
     
  5. ATLab

    ATLab

    Регистрация:
    6 апр 2012
    Сообщения:
    497
    Симпатии:
    0
    А еще нужен разгон/торможение... И если дело дошло до передачи векторов, то, выходит, этот код в ПЛИС заменяет собой интерпретатор G-кода в компьютере? Я правильно понял? За это уже брались многократно, например был проект на французском, реализован, правда, на PIC, с ЖК индикатором и т.д. Сошлись на том, что самый дешевый и доступный интерпретатор G-кода - компьютер. И я с этим согласен, поскольку отладить интерпретатор - дело не одного дня и не одного человека. Третье ...Я начинал модернизировать станки с написания эмулятора процессора PDP11 (частный случай Электроника 60, МС1201,02) для станков советского производства с разворованными стойками управления. Однако мы уперлись в тупик, связанный с невозможностью модернизации штатного программного обеспечения этих станков. А это, согласитесь, проблема неразрешимая. [/QUOTE] Вы просто пошли по ошибочному пути: нужно было просто модернизировать аппаратную часть так, чтобы она понимала DIR/STEP и использовать любой готовый управляющий софт. Это гораздо проще и быстрее, чем написать эмулятор PDP11. Или Вы не выбираете легких дорог? Поэтому мы сделали ставку на открытое ПО под ОС Linux - EMC2. Лично я благодарен людям создавшим его и отдавшим всем в свободное пользование все, включая исходники. На этой базе, сейчас можно создавать любые встроенные контроллеры для управления, аппаратно состоящие из набора микросхем, насчитывающих не более десяти наименований. И этим постом я хочу привлечь Ваше внимание, и предложить идти в этом направлении сообща. На мой взгляд этот путь самый малозатратный и универсальный... [/QUOTE] Зачем тратить кучу времени на разработку специализированного контроллера управления? Это же нужно взять как минимум ARM9, адаптировать к нему Linux, добиться стабильной работы... Вместо этого берется готовый компьютер mini-ITX (или промышленный комп, по вкусу) на который ставится проверенная легкая конфигурация Linux, EMC-2 и все работает (см. работу в этом направлении на cnczone.ru). Вот это и есть малозатратный и универсальный путь - не изобретать лишних сущностей. А Ваш специализированный контроллер не скоро достигнет аналогичного уровня работоспособности и по цене будет дороже. Есть, правда, одна для ниша специализированного контроллера - скоростная работа - но это уже далеко выходит за рамки хобби, поэтому толк от потраченного времени будет сомнительным. Ну не зря ведь такое широкое распространение получил Мач? Значит его возможностей достаточно большинству пользователей.
     
  6. Impartial

    Impartial

    Регистрация:
    6 апр 2012
    Сообщения:
    62
    Симпатии:
    0
    ну по порядку.
    не правильно! интерпретатор g кода остался в компе.
    если бы все было так просто! сервоприводом вы тоже предлагаете управлять по dir/step? а электоавтоматикой станка чем управлять?
    вот по этому пути и идем. только не надо ничего изобретать уже все изобретено и адаптировано. и стоимость контроллера получается (аппаратно) не сравнимая даже с самыми дешевыми
     
  7. ATLab

    ATLab

    Регистрация:
    6 апр 2012
    Сообщения:
    497
    Симпатии:
    0
    Тогда поясните, pls, назначение этого устройства, я пока не понимаю зачем оно нужно: интерпретатор G-кода - компьютер, драйверы есть готовые - DIR/STEP (в том числе и для серво). Зачем еще что-то?

    Домой работник правоохранительных органов в ближайшее время вряд ли придет, а для работы это не те затраты (на ПО), на которых стоит экономить. CAD/CAM, конечно, более заметные расходы, но тоже подъемны, пусть и не сразу, если работа - это работа, а не хобби на работе.

    Да нет такой проблемы: кому нужен станок для работы - покупает готовые драйверы, кто хочет поковыряться - паяет сам, схем уже много. Платка Pluto - ни то, ни се, один из вариантов отладочных плат на ПЛИС. То, что ВЫ написали, imho даже не стартовая точка для обсуждения - нечего пока обсуждать, в отличие от драйвера Марисса 5 Microstep Drive. P.S. Вы уж как-нибудь попроще объясняйте - на пальцах - и без загадок и умолчаний. А то, может оно мне уже давно надо, а я об этом не догадываюсь
     
  8. Impartial

    Impartial

    Регистрация:
    6 апр 2012
    Сообщения:
    62
    Симпатии:
    0
    да какие загадки, когда уже исходники выше? я же все и так на пальцах объяснил. чтобы исчезла загадочность и недомолвки ну ознакомьтесь с описанием emc2 и hal! не сделаете вы подобный контроллер ни на чем более просто! вы хотя бы вникните в суть вопроса!
     
  9. vmarkiv

    vmarkiv

    Регистрация:
    6 апр 2012
    Сообщения:
    111
    Симпатии:
    0
    Здравствуйте знатоки Pluto-p платы !
    Тема использования платы для меня актуальна . Я купил микросхему ЕР1К.... от Альтеры , но сделать плату под неё не смог по утюжной технологии .
    Вопросы :
    1. У кого есть готовая Pluto-p плата , или хотя бы хорошая разводка с принципиальной схемой ?
    2 . Аналог платы Pluto-p я видел на сайте www.pico-systems.com/univpwm.html , может кто-то сможет повторить , или сделать аналог на базе EP1K30TC144 по предложеной програме .
    3 . Можно ли сделать аналог платы для использования с програмным пакетом MACH3 ? Это было-бы очень интересно , так как MACH3 очень гибкий пакет , но ему не хватает расширения каналов ввода-вывода и замкнутой обратной связи по положению .
     
  10. boldive

    boldive

    Регистрация:
    5 апр 2012
    Сообщения:
    53
    Симпатии:
    0
    Хотите хорошую плату, забудьте про утюжную технологию. Купите текстолит с уже нанесенным фоторезистом, или баллончик с фоторезистом или пленку с фоторезистом (который потом через ламинатор переносится на текстолит). Вот с фоторезистом плата получится.
     
  11. mura

    mura

    Регистрация:
    5 апр 2012
    Сообщения:
    210
    Симпатии:
    0
    На Украине еденичные платы делают не так.
    1 отправляешь файл в Херсон
    2 получаешь счет, оплачиваешь в ближайшем банке (у меня это ~10-15$)
    3 через неделю получаешь плату с металлизацией и "зеленкой"
     
  12. Impartial

    Impartial

    Регистрация:
    6 апр 2012
    Сообщения:
    62
    Симпатии:
    0
    А ссылку можно? В Александрии только подготовка производства около 500гр.
     
  13. mura

    mura

    Регистрация:
    5 апр 2012
    Сообщения:
    210
    Симпатии:
    0
    В каждом номере Chip-News его визитка pcb{dog}cdmaua.com tel. 0552-444821
     
  14. Impartial

    Impartial

    Регистрация:
    6 апр 2012
    Сообщения:
    62
    Симпатии:
    0
    конечно, никакой мк без аппаратного квадратурного энкодера не сможет отработать сигнал с инкрементного оптического датчика без потерь. а если необходимо подключить резольвер то надо еще больше городить на рассыпухе. на fpga это все реализуется довольно просто.
     
  15. maxvovk

    maxvovk

    Регистрация:
    6 апр 2012
    Сообщения:
    105
    Симпатии:
    0
    Impartial -
    Вы первый тут, кто вменяемо и толково написал об этом простом и интересном устройстве .

    Скажем честно - аккуратно реализованный буфер на триггере Шмидта - и любая АВРка прекрасно считает сигналы с енкодеров.
    Дело в другом, и вы это прекрасно видите - на одном кристалле мы делаем многоканальный и универсальный драйвер + легко расширяемая логика обработки сигналов для автоматики. И все это через один медленный LPT. И ри этом никаких ограничений на частоту степа (кто пробовал микрошаг 10 и больше - тот понимает, о чем речь).
    Я уже давно это использую, конкретно EP2C8, некоторое кол-во плат рисовал в пикаде и заказывал в тепро.
    Что крайне радует - и вы тоже это заметили - позволяет использовать промышленные приводы, без степ-дира.
    Вообще скажу - не парьтесь, сделайте и используйте. Работает изумительно, стоит копейки - что еще нужно? А другие со скептисом на уровне непонимания принципа работы - пусть используют что принято и всем известно.
    Удачи!
     
  16. vmarkiv

    vmarkiv

    Регистрация:
    6 апр 2012
    Сообщения:
    111
    Симпатии:
    0
    Здравствуйте знатоки Плуто плат ! Спасибо Maxvovk за аккуратный комментарий по теме . Из высказанного видно , что тема переноса программного с ядра ЕР1К10 на ядро Циклон успешно пройдена . Так что всем любителям можно дерзать . Дальше по теме – для монтажа ЕР1К10 можно использовать платы-переходники TQFP32, QFN32, TQFP44, QFN44, TQFP64, LQFP100 и LQFP144 http://emkit.com.ua/products/adapter_boards_a2/ http://www.kosmodrom.com.ua/table.php?name=emkit&page=0 , я себе собираюсь купить несколько . У меня вопрос : Можно ли использовать несколько плат Плуто-П при работе с Linux EMC - сконфигурировать одну плату на LPT1 в качестве сервоконтролера ( например на 6 осей ) , вторую на LPT2 в качестве контроллера электроавтоматики ( 20 -30 входов \выходов ) и т.д.? С уважением Василий Маркив
     
  17. Impartial

    Impartial

    Регистрация:
    6 апр 2012
    Сообщения:
    62
    Симпатии:
    0
    Cконфигурировать можно без проблем, только зачем?
    нужно сразу отказаться от ер1к10 и использовать более емкие кристаллы в 144 корпусе. например в ер1к30тс144-3 можно использовать 104 вывода.
    правда при этом возникают проблемы с использованием штатного загрузчика, но это легко обходится, если использовать аппаратную загрузку микрокода. и это даже более приемлемый вариант, так как исключает случайный перевод fpga в режим загрузки микрокода, в случае непредвиденного использования лпт порта операционной системой.
    простой расчет показывает
    обслуживание lpt порта -13 выводов.
    6 осей сервопривода/шаговый биполярный - управление силовыми ключами - 24 вывода.
    в случае использования сервопривода + 18 выводов для енкодеров. остается 49 выводов для управления электроавтоматикой.
    при периоде сервоцикла 1мс и максимальной скоростью lpt порта 0.8-1 мб/сек машина
    типа duron 1000 успевает обработать все 6 осей в самом тяжелом варианте - сервопривода.
     
  18. Impartial

    Impartial

    Регистрация:
    6 апр 2012
    Сообщения:
    62
    Симпатии:
    0
    спасибо за моральную поддержку.
    скажите, какой вывод lpt порта вы используете для перевода fpga в режим загрузки микрокода?
     
  19. Sergh

    Sergh

    Регистрация:
    6 апр 2012
    Сообщения:
    309
    Симпатии:
    0
    Если не секрет, что вы использовали для сопряжения по уровням LPT и Cyclone?
     
  20. vmarkiv

    vmarkiv

    Регистрация:
    6 апр 2012
    Сообщения:
    111
    Симпатии:
    0
    Здравствуйте !
    Я согласен с Impartial , что использование ЕР1К10 уже дело прошлых лет , все сразу нужно делать на хорошем кристалле . Maxvovk рекомендовал ПЛИС EP2C8 , для нее есть макетка LDM-EP2C8-T144 в www.ldm-systems.ru или www.terraelectronica.ru , а на Космодроме в Харькове ее цена 1132 грн , там также есть описание выводов и т.д. На сайте www.xDevs.com хорошие примеры по использованию Циклонов http://forum.xdevs.com/viewtopic.php?f=16&t=140 .
    Я согласен с Impartial , лучше микрокод ( программу ПЛИС ) прошить прямо в ПЛИС и вывести сигналы готовности программного обеспечения Linux EMC и готовности электроавтоматики на отдельный вход ПЛИС , это позволит избежать ложных срабатываний при включении системы . Для МАСН3 я ставлю отдельную схему автоматики , которая запрещает работу сервоприводов при нештатных ситуациях , так как драйвера параллельного порта часто обращаются к порту для поиска ключа защиты , тестирования .
    Из темпа развития обсуждаемой темы я вижу ( и надеюсь ) , что через месяц мы уже будем обсуждать практическую часть проэкта .
    С уважением
    Василий Маркив