Activity

электродвигатели TURNIGY

Да это наверное так, но нужно, чтобы пацаны сами сделали и получили от этого удовлетворение и уверенность в себе.
Что неисправен двигатель определили. Теперь нужно или перемотать или заменить на новый.
Наверное придется перематывать.

Вопросы новичка
mataor:

Вот если вместо андроида запустить на железе чисто линукс с пропатченым ядром на однозадачность… тогда еще чот возможно…

Из своего опыта могу утверждать, что сервоцикл в 2 мс можно уверенно получить без изменений в ядре линукса на указанной выше платформе.
При этом параллельной задачей как раз и было кодирование видео 1920х1080. Хотя это не совсем корректно, так как на кодирование в основном работает не процессор, а Neon и Mali.
Скажите, а какой длительности сервоцикл используется в бортовых системах управления?
Под сервоциклом подразумевается цикл работы ПИД регуляторов системы стабилизации. Т.е. получение данных с акселерометра и гироскопа, расчет текущего цикла ПИД и выдача управления на двигатели.

Вопросы новичка
devv:

качайте и смотрите код github.com/MegaPirateNG/ardupilot-mpng

Увидел, спасибо. Пде только неудобны в переделке. Зачем их придумали непонятно.

kren-DEL:

Как быстро откликается смартфон на поворот изображения при повороте смарта?

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

Вопросы новичка
mataor:

вы уже не первый и не десятый кто такое предлагает… не выйдет…

Я буду аргументировать за.

  1. Двухядерный процессор плюс аппаратный видеокодер для передачи видео
    есть возможность распределить процессоры по задачам, встроенный WI-FI который можно (при доработке антены) использовать как канал управления.
  2. Высокоскоростные USB порта для подключения системы управления (ESC блоки и блок датчиков) , а так-же камеры с разрешением до 1920х1080.
    ESC блоки и блок датчиков подключаются через хаб и работают в полноскоростном режиме как HID устройства. При этом серво цикл может составлять 100-200 нс.
    Я немного продвинулся в этом направлении и у меня есть разработка блока ESC с управлением по USB на STM32,а так же системы сбора информации с датчиков на том же проце. (правда все это не для коптера).
    Коптером хочу заняться как хобби сына.
    Только вот все бросить и написать с ноля (что не реально) или адаптировать к андроиду тот же опенпилот позволить себе не могу.
Вопросы новичка

Подскажите новичку! Существуют ли программы с открытым кодом под ОС Андроид для управления коптером (двигателями), аналогичные OpenPilot?
Есть идея сделать управление ESC блоками и получать данные с датчиков по USB, используя что нибудь типа МК808 habrahabr.ru/post/160831/

Помогите разобраться с мотором и блоком управления

Пытаюсь разобраться в этом чуде.

Если с двигателем все более-менее понятно, то с блоком управления ничего не понятно.
Он без всяких маркировок, заказан на алиэкспресс, как и двигатель.
Не понятно, как вообще он может работать. Написано в рекламе, что 40А.
Сколько вольт не понятно.
Если транзисторы, в сумме, вроде и тянут 40А, то принцип управления ими не не влазит не в одну теорию.
Там стоит контроллер АТМеgа8L, и управление затворами нижних ключей происходит прямо от выхода контроллера.
Судя по входной емкости одного затвора (около 3000пф) да умножить на 3 -9000пф. По идее сквозными токами его должно выбить сразу при включении.
Верхние вообще через какай то хлипкий инвертор не транзисторе.
Помогите ссылками на новую китайскую теорию управления силовыми ключами в инверторе.
Второй вопрос по принципу управления инвертором. Я никогда не сталкивался с модельным управлением.
Управление по одному проводу, судя по ножке проца куда он приходит - цифровое. Вход проца INT0. Можно предположить, что это какая то кодовая комбинация.
Где почитать что туда нужно подавать?
Все это хозяйство пока включать боюсь.

Бюджетный usb-контроллер для mach3 - кому интересно присоединяйтесь.

Плагин естественно пишу сам, для пользователя все прозрачно - никаких окон настройки, все через стандартные настройки мача, только номероа пинов можно задавать от 1 до 32 причем пин может работать как на ввод так и на вывод в зависимости от настройки мача.

Скажите, а какие параметры передаете/принимаете в контроллер?

Открытый проект универсального зарядника
anton_z:

R2D2, какой версией WinAVR собирается микропрограмма? В последней версии (от 10.01.2010) сначала вылез баг с размещением массивов/строк в флеше. С ним разобрался, но прошивка все равно не работает.

А в чем была проблема с размещением строк в флеше?

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

коль пошла такая пьянка…
Может кто знает, как катушки в spherosyn’e устроены (линейный энкодер от newall.com , тот что с шариками от подшипников в качестве измерительных попугаев )
Сам патент-то я видел, если че…

Не дает покоя эта тема. Народ!, а кто знает где можно купить много калиброванных шариков диаметром от 6 до 8 мм.?

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

В документе bsystem.ru/files/Exploitation_NC_230_B4.3.2.pdf есть хорошая ссылка по промышленному и професиональному использованию EP1K30 в качестве , аналогичном обсуждаемому

А где ссылка? Что-то не нашел.

И еще вопрос к форумчанам.
Есть идея сделать еще более универсальный и быстродействующий драйвер используя
шину IDE на которую подключаются винчестера и CD ROM.
Тоже простой и стандартный интерфейс, подключаемый стандартным шлейфом IDE.

Вопрос не в тему.
Ни у кого нет паспорта на двигатель ДШИ-360-8?

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

А что за токи потребляются этой платой что используются линейные стабилизаторы напряжения в корпусе SOT-223? Может есть смысл поставить что-то из серии LP2985 в корпусе SOT-23-5. Они в два раза меньше по размерам. А последовательно перед стабилизатором на 2.5В еще воткнул-бы светодиод. Какая-никакая индикация напряжения, и работает как предохранитель.

Согласно документу www.altera.com/literature/ds/acex.pdf?GSA_pos=3&WT…
страница 81-83 сама FPGA потребляет от 50 до 100 ма.
Зависит от количества используемых ячеек LEs в конфигурации.
Светодиод явно не справится с таким током, хотя Вы правы напряжение надо погасить перед стабилизатором 2.5 хотя бы диодом или запитать его от 3.3 вольтового.

Прошивка для ATiny2313 откуда берется? И насколько этот контроллер вместе с COM портом необходимы на плате?

Микроконтроллер необходим для загрузки кода конфигурации в FPGA.
Сам код находится в 24с512.
Плата поддерживает три режима загрузки конфигураций:
Пассивный последовательный (PS), пассивный параллельный асинхронный (PPA) и JTAG.
www.altera.com/literature/hb/cfg/cfg_cf51005.pdf?G…
Хочу добавить еще загрузку программы в 24с512 через ком порт.
для этого там и стоит мах232.
Писать программу загрузчика для 2313 еще предстоит.
Хотя от Fox69 уже есть дельная ссылка добавим туда кусок I2C и COM порт и будет загрузчик.
FPGA теряет конфигурацию при выключении питания! Там нет флэша как в ЕР70хх.

Я еще не до конца понимаю назначение этого устройства в целом.

Я внимательно прочитал Ваш пост по микростеп драйверу от Мариса.
Вы ведь уже почти владеете Верилогом! Что мешает подключить эту программу к программе выше для ШД? Разрешение автора?

boldive:

У JTAG разьема реально работают только 6 ног. Не думаю что у всех покупные программаторы. Может 4 ноги разьема выкинуть, высвобождаем место на плате и оставляем простор для трассировки.

В этом деле лучше придерживаться стандарта.

Компьютер под Linux EMC при помощи данной платы передает управление на
силовую часть и принимает сигналы с квадратурных енкодеров которые обрабатывает
по PID алгоритму. Действительно самый простой и дешевый способ управлять
servo двигателями но только под Linux.

Шаговыми тоже!
Linux не обязательно, можно и под Виндой а вот с Мачем действительно засада.
Правда я его не знаю, но пробовал писать задачи реального времени под Винду - геморой страшный! Не реального времени эта ОС. И правильно! Иначе у пользователей был бы с ней тот же геморой.

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

По моему так нарезать каркас секциями на расстоянии 1/4 диаметра шарика с точностью какая получится а потом программно корректировать по какой нибудь метрологической методике.
Неясно только насколько линейной получается характеристика преобразования.

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

При внимательном рассмотрении можно перевести аппаратную часть на AD2S1200/1210 from Analog Device

Интересная штука!
Можно конечно использовать и резольверные преобразователи, но проще сделать DDS синтезатор и прицепить два ноль детектора, а фазу вычислять измеряя количество импульсов заполнения между нолем синтезатора и выходами ноль детекторов. На Atmel 90PWM3 наверное должно получиться довольно просто.

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

Может кто знает, как катушки в spherosyn’e устроены (линейный энкодер от newall.com , тот что с шариками от подшипников в качестве измерительных попугаев )
Сам патент-то я видел, если че…

Maximum Traverse Rate 2MHz (2m/s at 1µm resolution)

Круто!
А где можно глянуть на патент?

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

И если дело дошло до передачи векторов, то, выходит, этот код в ПЛИС заменяет собой интерпретатор G-кода в компьютере? Я правильно понял?
За это уже брались многократно, например был проект на французском, реализован, правда, на PIC, с ЖК индикатором и т.д. Сошлись на том, что самый дешевый и доступный интерпретатор G-кода - компьютер. И я с этим согласен, поскольку отладить интерпретатор - дело не одного дня и не одного человека.

Кстати, вот исходник интерпретатора G кода из ЕМС2.
Прекрасно компилируется и работает на платформах (ядрах) ARM и NIOS2 в Циклоне III.

vmarkiv:
  1. У кого есть готовая Pluto-p плата , или хотя бы хорошая разводка с принципиальной схемой ?

Вот разводка и структура регистров ЕР1К10 платы pluto-p.

rs274ngc.rarpluto_servo.rar

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

maxvovk

Я уже давно это использую, конкретно EP2C8, некоторое кол-во плат рисовал в пикаде и заказывал в тепро.

Спасибо за моральную поддержку.
Скажите, какой вывод LPT порта Вы используете для перевода FPGA в режим загрузки микрокода?

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

Cконфигурировать можно без проблем, только зачем?
Нужно сразу отказаться от ЕР1К10 и использовать более емкие кристаллы в 144 корпусе. Например в ЕР1К30ТС144-3 можно использовать 104 вывода.
Правда при этом возникают проблемы с использованием штатного загрузчика, но это легко обходится, если использовать аппаратную загрузку микрокода. И это даже более приемлемый вариант, так как исключает случайный перевод FPGA в режим загрузки микрокода, в случае непредвиденного использования ЛПТ порта операционной системой.
Простой расчет показывает
Обслуживание LPT порта -13 выводов.
6 осей сервопривода/шаговый биполярный - управление силовыми ключами - 24 вывода.
В случае использования сервопривода + 18 выводов для енкодеров. Остается 49 выводов для управления электроавтоматикой.
При периоде сервоцикла 1мс и максимальной скоростью LPT порта 0.8-1 мб/сек машина
типа DURON 1000 успевает обработать все 6 осей в самом тяжелом варианте - сервопривода.

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

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

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

Раз пытались сделать плату, значит схема и печатка уже есть?
Такое-же, ( по идеологии) как указано в ссылке и делаю.
У МАСН3, по моему, нет языка описания аппаратуры, аналогичного HAL в EMC.

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

Да какие загадки, когда уже исходники выше?
Я же все и так на пальцах объяснил.
Чтобы исчезла загадочность и недомолвки ну ознакомьтесь с описанием EMC2 и HAL!
Не сделаете Вы подобный контроллер ни на чем более просто!
Вы хотя бы вникните в суть вопроса!

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

Ну по порядку.

ATLab:

А еще нужен разгон/торможение…
И если дело дошло до передачи векторов, то, выходит, этот код в ПЛИС заменяет собой интерпретатор G-кода в компьютере? Я правильно понял?

Не правильно! Интерпретатор G кода остался в компе.

ATLab:

Вы просто пошли по ошибочному пути: нужно было просто модернизировать аппаратную часть так, чтобы она понимала DIR/STEP и использовать любой готовый управляющий софт. Это гораздо проще и быстрее, чем написать эмулятор PDP11. Или Вы не выбираете легких дорог?

Если бы все было так просто!
Сервоприводом Вы тоже предлагаете управлять по DIR/STEP?😃
А электоавтоматикой станка чем управлять?

ATLab:

Зачем тратить кучу времени на разработку специализированного контроллера управления? Это же нужно взять как минимум ARM9, адаптировать к нему Linux, добиться стабильной работы…
Вместо этого берется готовый компьютер mini-ITX (или промышленный комп, по вкусу) на который ставится проверенная легкая конфигурация Linux, EMC-2 и все работает (см. работу в этом направлении на cnczone.ru). Вот это и есть малозатратный и универсальный путь - не изобретать лишних сущностей.
А Ваш специализированный контроллер не скоро достигнет аналогичного уровня работоспособности и по цене будет дороже.

Вот по этому пути и идем.
Только не надо ничего изобретать уже все изобретено и адаптировано.
И стоимость контроллера получается (аппаратно) не сравнимая даже с самыми дешевыми РС. И работают там те-же Linux и EMC2.

ATLab:

Ну не зря ведь такое широкое распространение получил Мач? Значит его возможностей достаточно большинству пользователей.

Не возражаю!
Но посчитайте затраты на ПО! Они ведь сравнимы по стоимости железу!
Я уже не говорю о CAD/CAM системах.
Лично меня не устраивает позиция, в которую меня ставит нахватавшийся азов общения с компом в плане проверки лицензионности ПО, работник правоохранительных органов. И он по большому счету прав!
И последнее.
Вы конечно же правы что специализированный контроллер выходит за рамки хоббийного применения.
Но я же не предлагаю здесь это обсуждать, а тем более разрабатывать.
Я предлагаю решение проблемы драйвера привода, что и является темой этого раздела.

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

Первое и самое главное!
Это и есть полноценные драйвера как шаговых двигателей, так и сервоприводов.
Когда я писал о подключении модуля Мориса, то имел ввиду не железо, а программу на Верилоге.
Второе
Для полноценной работы системы управления приводом необходимо получать не точку(степ/дир) а вектор, что эта плата и делает, обрабатывая полученный с компа вектор с параметрами начало/конец, скорость …
Третье
В данном случае ЛРТ порт, работающий а ЕРР режиме, выполняет функции шины обмена типа ISA, PCI, USB …, только с меньшей скоростью и разрядностью, но в данном случае этого достаточно. Не зря ведь все серьёзные платы используют эти интерфейсы, однако на коленке собрать такие платы либо сложно в изготовлении, либо связано с задачей написания драйверов под определенную операционку.
И потом, согласитесь, что самое главное это управляющая программа, в которую множество людей (низкий им поклон) вложило столько сил и времени.
Я начинал модернизировать станки с написания эмулятора процессора PDP11 (частный случай Электроника 60, МС1201,02) для станков советского производства с разворованными стойками управления. Однако мы уперлись в тупик, связанный с невозможностью модернизации штатного программного обеспечения этих станков.
А это, согласитесь, проблема неразрешимая.
Поэтому мы сделали ставку на открытое ПО под ОС Linux - EMC2.
Лично я благодарен людям создавшим его и отдавшим всем в свободное пользование все, включая исходники.
На этой базе, сейчас можно создавать любые встроенные контроллеры для управления, аппаратно состоящие из набора микросхем, насчитывающих не более десяти наименований.
И этим постом я хочу привлечь Ваше внимание, и предложить идти в этом направлении сообща. На мой взгляд этот путь самый малозатратный и универсальный.
Не малую роль в этом деле играют авторские права, стоимость лицензий на ПО.
Я к этому отношусь очень ответственно и уважительно.
Вот собственно и все, что хотел сказать.
Если не ответил на Ваши вопросы, эадавайте конкретно, постараюсь ответить.
С Уважением.

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

// 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

5-Microstep Drive. Xilinx CPLD

Схему сейчас разрабатываю на EP1K30TC144 потому что много в наличии.
Программирование по PPA. Штатное по PS.
Разводка поддерживает и то и другое.
Занимаюсь сервоприводом.
Вам какой исходник?
Вот штатный на сервопривод.
Тут три модуля
1 Servo
2 Quad
3 WDT
Компилится в Квартусе без проблем.
На отладчике тоже вроде все ОК.
На железе еще не пробовал.

// This is a component of pluto_servo, a PWM servo driver and quadrature
// counter for emc2
// Copyright 2006 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 pluto_servo(clk, led, nConfig, epp_nReset, pport_data, nWrite, nWait, nDataStr,
nAddrStr, dout, din, quadA, quadB, quadZ, up, down);
parameter QW=14;
input clk;
output led, nConfig;
inout [7:0] pport_data;
input nWrite;
output nWait;
input nDataStr, nAddrStr, epp_nReset;
wire do_tristate;
reg[9:0] real_dout; output [9:0] dout = do_tristate ? 10’bZZZZZZZZZZ : real_dout;
input [7:0] din;
input [3:0] quadA;
input [3:0] quadB;
input [3:0] quadZ;
wire[3:0] real_up; output [3:0] up = do_tristate ? 4’bZZZZ : real_up;
wire[3:0] real_down; output [3:0] down = do_tristate ? 4’bZZZZ : real_down;
reg Zpolarity;

wire [2*QW:0] quad0, quad1, quad2, quad3;

wire do_enable_wdt;
wire pwm_at_top;
wdt w(clk, do_enable_wdt, pwm_at_top, do_tristate);

// PWM stuff
// PWM clock is about 20kHz for clk @ 40MHz, 11-bit cnt
reg [10:0] pwmcnt;
wire [10:0] top = 11’d2046;
assign pwm_at_top = (pwmcnt == top);
reg [15:0] pwm0, pwm1, pwm2, pwm3;
always @(posedge clk) begin
if(pwm_at_top) pwmcnt <= 0;
else pwmcnt <= pwmcnt + 11’d1;
end

wire [10:0] pwmrev = {
pwmcnt[4], pwmcnt[5], pwmcnt[6], pwmcnt[7], pwmcnt[8], pwmcnt[9],
pwmcnt[10], pwmcnt[3:0]};
wire [10:0] pwmcmp0 = pwm0[14] ? pwmrev : pwmcnt;
// wire [10:0] pwmcmp1 = pwm1[14] ? pwmrev : pwmcnt;
// wire [10:0] pwmcmp2 = pwm2[14] ? pwmrev : pwmcnt;
// wire [10:0] pwmcmp3 = pwm3[14] ? pwmrev : pwmcnt;
wire pwmact0 = pwm0[10:0] > pwmcmp0;
wire pwmact1 = pwm1[10:0] > pwmcmp0;
wire pwmact2 = pwm2[10:0] > pwmcmp0;
wire pwmact3 = pwm3[10:0] > pwmcmp0;
assign real_up[0] = pwm0[12] ^ (pwm0[15] ? 1’d0 : pwmact0);
assign real_up[1] = pwm1[12] ^ (pwm1[15] ? 1’d0 : pwmact1);
assign real_up[2] = pwm2[12] ^ (pwm2[15] ? 1’d0 : pwmact2);
assign real_up[3] = pwm3[12] ^ (pwm3[15] ? 1’d0 : pwmact3);
assign real_down[0] = pwm0[13] ^ (~pwm0[15] ? 1’d0 : pwmact0);
assign real_down[1] = pwm1[13] ^ (~pwm1[15] ? 1’d0 : pwmact1);
assign real_down[2] = pwm2[13] ^ (~pwm2[15] ? 1’d0 : pwmact2);
assign real_down[3] = pwm3[13] ^ (~pwm3[15] ? 1’d0 : pwmact3);

// Quadrature stuff
// Quadrature is digitized at 40MHz into 14-bit counters
// Read up to 2^13 pulses / polling period = 8MHz for 1kHz servo period
reg qtest;
wire qr0, qr1, qr2, qr3;
quad q0(clk, qtest ? real_dout[0] : quadA[0], qtest ? real_dout[1] : quadB[0], qtest ? real_dout[2] : quadZ[0]^Zpolarity, qr0, quad0);
quad q1(clk, quadA[1], quadB[1], quadZ[1]^Zpolarity, qr1, quad1);
quad q2(clk, quadA[2], quadB[2], quadZ[2]^Zpolarity, qr2, quad2);
quad q3(clk, quadA[3], quadB[3], quadZ[3]^Zpolarity, qr3, quad3);

// 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];
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) pwm0 <= { EPP_datain, lowbyte };
else if(addr_reg[3:0] == 4’d3) pwm1 <= { EPP_datain, lowbyte };
else if(addr_reg[3:0] == 4’d5) pwm2 <= { EPP_datain, lowbyte };
else if(addr_reg[3:0] == 4’d7) pwm3 <= { EPP_datain, lowbyte };
else if(addr_reg[3:0] == 4’d9) begin
real_dout <= { EPP_datain[1:0], lowbyte };
Zpolarity <= EPP_datain[7];
qtest <= EPP_datain[5];
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 <= quad0;
else if(addr_reg[4:2] == 3’d1) data_buf <= quad1;
else if(addr_reg[4:2] == 3’d2) data_buf <= quad2;
else if(addr_reg[4:2] == 3’d3) data_buf <= quad3;
else if(addr_reg[4:2] == 3’d4)
data_buf <= {quadA, quadB, quadZ, 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 qr0 = EPP_strobe_edge1 & EPP_read & EPP_data_strobe & (addr_reg[4:2] == 3’d0);
assign qr1 = EPP_strobe_edge1 & EPP_read & EPP_data_strobe & (addr_reg[4:2] == 3’d1);
assign qr2 = EPP_strobe_edge1 & EPP_read & EPP_data_strobe & (addr_reg[4:2] == 3’d2);
assign qr3 = EPP_strobe_edge1 & EPP_read & EPP_data_strobe & (addr_reg[4:2] == 3’d3);
assign led = do_tristate ? 1’BZ : (real_up[0] ^ real_down[0]);
assign nConfig = epp_nReset; // 1’b1;
endmodule

// This is a component of pluto_servo, a PWM servo driver and quadrature
// counter for emc2
// Copyright 2006 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-1507 USA

module quad(clk, A, B, Z, zr, out);
parameter W=14;
input clk, A, B, Z, zr;
reg [(W-1):0] c, i; reg zl;
output [2*W:0] out = { zl, i, c };
// reg [(W-1):0] c, i; reg zl;

reg [2:0] Ad, Bd;
reg [2:0] Zc;
always @(posedge clk) Ad <= {Ad[1:0], A};
always @(posedge clk) Bd <= {Bd[1:0], B};

wire good_one = &Zc;
wire good_zero = ~|Zc;
reg last_good;

wire index_pulse = good_one && ! last_good;

wire count_enable = Ad[1] ^ Ad[2] ^ Bd[1] ^ Bd[2];
wire count_direction = Ad[1] ^ Bd[2];

always @(posedge clk)
begin
if(Z && !good_one) Zc <= Zc + 2’b1;
else if(!good_zero) Zc <= Zc - 2’b1;
if(good_one) last_good <= 1;
else if(good_zero) last_good <= 0;
if(count_enable)
begin
if(count_direction) c <= c + 1’d1;
else c <= c - 1’d1;
end
if(index_pulse) begin
i <= c;
zl <= 1;
end else if(zr) begin
zl <= 0;
end
end
endmodule

// This is a component of pluto_servo, a PWM servo driver and quadrature
// counter for emc2
// Copyright 2006 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 wdt(clk, ena, cnt, out);
input clk, ena, cnt;
output out;
reg [6:0] timer;
wire timer_top = (timer == 7’d127);
reg internal_enable;
wire out = internal_enable && timer_top;

always @(posedge clk) begin
if(ena) begin
internal_enable <= 1;
timer <= 0;
end else if(cnt && !timer_top) timer <= timer + 7’d1;
end
endmodule

5-Microstep Drive. Xilinx CPLD

Если вопрос ко мне, то здесь “src/hal/drivers/pluto_servo_firmware/”
там же и на шаговики, но с выходом step/dir.
Для полного управления надо подключить модуль, аналогичный рассматриваемому в этом посте.
Речь идет о UBUNTU.
Однако там изначально нет этих исходников.
Необходимо их скачать штатными средствами UBUNTU.
Если интересно, опишу подробнее.

5-Microstep Drive. Xilinx CPLD

Наверное Вы правы!
Но ведь именно на эту плату есть готовые драйвера в EMC2 для работы как сервоприводов, и не в режиме step/dir, так и шаговых двигателей.
Вроде по теме, ведь здесь попытка найти тоже решение.

5-Microstep Drive. Xilinx CPLD

Извиняюсь и может не по теме.
А никто не пробовал такое сделать для управления станком?
www.knjn.com/FPGA-Parallel.html
Ведь преимуществ много!
Легко перенастраивается с шагового режима на серво, не требует программатора, много входов-выходов и простое подключение к LPT порту.
Исходный код открытый под GPL лицензией в ЕМС2.
При желании и знании Verilog или VHDL можно описать и запрограммировать любую конфигурацию оборудования. Но и так существует уже готовое решение и не надо заморачиваться с программированием.
И цена на FPGA типа Cyclone 1,2,3 в районе 10$.