Activity
Двигатель нашли. С какого то фотоаппарата. Модель 35 E22DA .
Да это наверное так, но нужно, чтобы пацаны сами сделали и получили от этого удовлетворение и уверенность в себе.
Что неисправен двигатель определили. Теперь нужно или перемотать или заменить на новый.
Наверное придется перематывать.
Помогите опознать двигатель из серво Turnigy TGY-90S.
На нем ничего не написано. Чем его можно заменить?
Вот если вместо андроида запустить на железе чисто линукс с пропатченым ядром на однозадачность… тогда еще чот возможно…
Из своего опыта могу утверждать, что сервоцикл в 2 мс можно уверенно получить без изменений в ядре линукса на указанной выше платформе.
При этом параллельной задачей как раз и было кодирование видео 1920х1080. Хотя это не совсем корректно, так как на кодирование в основном работает не процессор, а Neon и Mali.
Скажите, а какой длительности сервоцикл используется в бортовых системах управления?
Под сервоциклом подразумевается цикл работы ПИД регуляторов системы стабилизации. Т.е. получение данных с акселерометра и гироскопа, расчет текущего цикла ПИД и выдача управления на двигатели.
качайте и смотрите код github.com/MegaPirateNG/ardupilot-mpng
Увидел, спасибо. Пде только неудобны в переделке. Зачем их придумали непонятно.
Как быстро откликается смартфон на поворот изображения при повороте смарта?
Наверное все таки не смартфон, а ПО обрабатывающее акселерометр. Реакция тачскрина на пару порядков быстрее чем человека.
Ну и смартфон не очень удобно использовать как наземную станцию(мал для этого) . Лучше планшет. (это я кино насмотрелся)
Спасибо за ссылки, но там только ПО для наземной станции, а я имел в виду бортовую. Т.е. что то типа ардукоптера.
вы уже не первый и не десятый кто такое предлагает… не выйдет…
Я буду аргументировать за.
- Двухядерный процессор плюс аппаратный видеокодер для передачи видео
есть возможность распределить процессоры по задачам, встроенный WI-FI который можно (при доработке антены) использовать как канал управления. - Высокоскоростные 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. Можно предположить, что это какая то кодовая комбинация.
Где почитать что туда нужно подавать?
Все это хозяйство пока включать боюсь.
Что представляет из себя защитная сетка? Она видна из любой точки возможных траекторий?
Не противоречит правилам ориентация по этой сетке?
Плагин естественно пишу сам, для пользователя все прозрачно - никаких окон настройки, все через стандартные настройки мача, только номероа пинов можно задавать от 1 до 32 причем пин может работать как на ввод так и на вывод в зависимости от настройки мача.
Скажите, а какие параметры передаете/принимаете в контроллер?
пустил сигнал nWait c матрицы на LPT через инвертор ( 555лн1) ,
Или переписать эту строчку
wire EPP_wait; assign nWait = ~EPP_wait;
так
wire EPP_wait; assign nWait = EPP_wait;
R2D2, какой версией WinAVR собирается микропрограмма? В последней версии (от 10.01.2010) сначала вылез баг с размещением массивов/строк в флеше. С ним разобрался, но прошивка все равно не работает.
А в чем была проблема с размещением строк в флеше?
коль пошла такая пьянка…
Может кто знает, как катушки в spherosyn’e устроены (линейный энкодер от newall.com , тот что с шариками от подшипников в качестве измерительных попугаев )
Сам патент-то я видел, если че…
Не дает покоя эта тема. Народ!, а кто знает где можно купить много калиброванных шариков диаметром от 6 до 8 мм.?
Отрежьте со старой компьютерной материнской платы блок питания процессора. Там уже все готово.😃
Может это поможет, нам помогло
www.electroprivod.ru/microstep.htm
собственно эта часть
" если ни одна часть магнитной цепи двигателя не насыщается."
В документе bsystem.ru/files/Exploitation_NC_230_B4.3.2.pdf есть хорошая ссылка по промышленному и професиональному использованию EP1K30 в качестве , аналогичном обсуждаемому
А где ссылка? Что-то не нашел.
И еще вопрос к форумчанам.
Есть идея сделать еще более универсальный и быстродействующий драйвер используя
шину IDE на которую подключаются винчестера и CD ROM.
Тоже простой и стандартный интерфейс, подключаемый стандартным шлейфом IDE.
Вопрос не в тему.
Ни у кого нет паспорта на двигатель ДШИ-360-8?
А что за токи потребляются этой платой что используются линейные стабилизаторы напряжения в корпусе 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хх.
Я еще не до конца понимаю назначение этого устройства в целом.
Я внимательно прочитал Ваш пост по микростеп драйверу от Мариса.
Вы ведь уже почти владеете Верилогом! Что мешает подключить эту программу к программе выше для ШД? Разрешение автора?
У JTAG разьема реально работают только 6 ног. Не думаю что у всех покупные программаторы. Может 4 ноги разьема выкинуть, высвобождаем место на плате и оставляем простор для трассировки.
В этом деле лучше придерживаться стандарта.
Компьютер под Linux EMC при помощи данной платы передает управление на
силовую часть и принимает сигналы с квадратурных енкодеров которые обрабатывает
по PID алгоритму. Действительно самый простой и дешевый способ управлять
servo двигателями но только под Linux.
Шаговыми тоже!
Linux не обязательно, можно и под Виндой а вот с Мачем действительно засада.
Правда я его не знаю, но пробовал писать задачи реального времени под Винду - геморой страшный! Не реального времени эта ОС. И правильно! Иначе у пользователей был бы с ней тот же геморой.
Извиняюсь!
Это файл ORCAD CAPTURE.
Нужно ведь чтобы можно было в конце сделать трассировку.
В PDF формате как же его корректировать?
Можно его импортировать в ALTIUM DESIGNER.
Возвращаясь в тему.
Предлагаю схему для критики, исправлений, добавлений …
По моему так нарезать каркас секциями на расстоянии 1/4 диаметра шарика с точностью какая получится а потом программно корректировать по какой нибудь метрологической методике.
Неясно только насколько линейной получается характеристика преобразования.
При внимательном рассмотрении можно перевести аппаратную часть на AD2S1200/1210 from Analog Device
Интересная штука!
Можно конечно использовать и резольверные преобразователи, но проще сделать DDS синтезатор и прицепить два ноль детектора, а фазу вычислять измеряя количество импульсов заполнения между нолем синтезатора и выходами ноль детекторов. На Atmel 90PWM3 наверное должно получиться довольно просто.
Может кто знает, как катушки в spherosyn’e устроены (линейный энкодер от newall.com , тот что с шариками от подшипников в качестве измерительных попугаев )
Сам патент-то я видел, если че…
Maximum Traverse Rate 2MHz (2m/s at 1µm resolution)
Круто!
А где можно глянуть на патент?
И если дело дошло до передачи векторов, то, выходит, этот код в ПЛИС заменяет собой интерпретатор G-кода в компьютере? Я правильно понял?
За это уже брались многократно, например был проект на французском, реализован, правда, на PIC, с ЖК индикатором и т.д. Сошлись на том, что самый дешевый и доступный интерпретатор G-кода - компьютер. И я с этим согласен, поскольку отладить интерпретатор - дело не одного дня и не одного человека.
Кстати, вот исходник интерпретатора G кода из ЕМС2.
Прекрасно компилируется и работает на платформах (ядрах) ARM и NIOS2 в Циклоне III.
- У кого есть готовая Pluto-p плата , или хотя бы хорошая разводка с принципиальной схемой ?
Вот разводка и структура регистров ЕР1К10 платы pluto-p.
maxvovk
Я уже давно это использую, конкретно EP2C8, некоторое кол-во плат рисовал в пикаде и заказывал в тепро.
Спасибо за моральную поддержку.
Скажите, какой вывод LPT порта Вы используете для перевода FPGA в режим загрузки микрокода?
Cконфигурировать можно без проблем, только зачем?
Нужно сразу отказаться от ЕР1К10 и использовать более емкие кристаллы в 144 корпусе. Например в ЕР1К30ТС144-3 можно использовать 104 вывода.
Правда при этом возникают проблемы с использованием штатного загрузчика, но это легко обходится, если использовать аппаратную загрузку микрокода. И это даже более приемлемый вариант, так как исключает случайный перевод FPGA в режим загрузки микрокода, в случае непредвиденного использования ЛПТ порта операционной системой.
Простой расчет показывает
Обслуживание LPT порта -13 выводов.
6 осей сервопривода/шаговый биполярный - управление силовыми ключами - 24 вывода.
В случае использования сервопривода + 18 выводов для енкодеров. Остается 49 выводов для управления электроавтоматикой.
При периоде сервоцикла 1мс и максимальной скоростью LPT порта 0.8-1 мб/сек машина
типа DURON 1000 успевает обработать все 6 осей в самом тяжелом варианте - сервопривода.
Конечно, никакой МК без аппаратного квадратурного энкодера не сможет отработать сигнал с инкрементного оптического датчика без потерь. А если необходимо подключить резольвер то надо еще больше городить на рассыпухе.
На FPGA это все реализуется довольно просто.
А ссылку можно?
В Александрии только подготовка производства около 500гр.
Раз пытались сделать плату, значит схема и печатка уже есть?
Такое-же, ( по идеологии) как указано в ссылке и делаю.
У МАСН3, по моему, нет языка описания аппаратуры, аналогичного HAL в EMC.
Да какие загадки, когда уже исходники выше?
Я же все и так на пальцах объяснил.
Чтобы исчезла загадочность и недомолвки ну ознакомьтесь с описанием EMC2 и HAL!
Не сделаете Вы подобный контроллер ни на чем более просто!
Вы хотя бы вникните в суть вопроса!
Ну по порядку.
А еще нужен разгон/торможение…
И если дело дошло до передачи векторов, то, выходит, этот код в ПЛИС заменяет собой интерпретатор G-кода в компьютере? Я правильно понял?
Не правильно! Интерпретатор G кода остался в компе.
Вы просто пошли по ошибочному пути: нужно было просто модернизировать аппаратную часть так, чтобы она понимала DIR/STEP и использовать любой готовый управляющий софт. Это гораздо проще и быстрее, чем написать эмулятор PDP11. Или Вы не выбираете легких дорог?
Если бы все было так просто!
Сервоприводом Вы тоже предлагаете управлять по DIR/STEP?😃
А электоавтоматикой станка чем управлять?
Зачем тратить кучу времени на разработку специализированного контроллера управления? Это же нужно взять как минимум ARM9, адаптировать к нему Linux, добиться стабильной работы…
Вместо этого берется готовый компьютер mini-ITX (или промышленный комп, по вкусу) на который ставится проверенная легкая конфигурация Linux, EMC-2 и все работает (см. работу в этом направлении на cnczone.ru). Вот это и есть малозатратный и универсальный путь - не изобретать лишних сущностей.
А Ваш специализированный контроллер не скоро достигнет аналогичного уровня работоспособности и по цене будет дороже.
Вот по этому пути и идем.
Только не надо ничего изобретать уже все изобретено и адаптировано.
И стоимость контроллера получается (аппаратно) не сравнимая даже с самыми дешевыми РС. И работают там те-же Linux и EMC2.
Ну не зря ведь такое широкое распространение получил Мач? Значит его возможностей достаточно большинству пользователей.
Не возражаю!
Но посчитайте затраты на ПО! Они ведь сравнимы по стоимости железу!
Я уже не говорю о CAD/CAM системах.
Лично меня не устраивает позиция, в которую меня ставит нахватавшийся азов общения с компом в плане проверки лицензионности ПО, работник правоохранительных органов. И он по большому счету прав!
И последнее.
Вы конечно же правы что специализированный контроллер выходит за рамки хоббийного применения.
Но я же не предлагаю здесь это обсуждать, а тем более разрабатывать.
Я предлагаю решение проблемы драйвера привода, что и является темой этого раздела.
Первое и самое главное!
Это и есть полноценные драйвера как шаговых двигателей, так и сервоприводов.
Когда я писал о подключении модуля Мориса, то имел ввиду не железо, а программу на Верилоге.
Второе
Для полноценной работы системы управления приводом необходимо получать не точку(степ/дир) а вектор, что эта плата и делает, обрабатывая полученный с компа вектор с параметрами начало/конец, скорость …
Третье
В данном случае ЛРТ порт, работающий а ЕРР режиме, выполняет функции шины обмена типа ISA, PCI, USB …, только с меньшей скоростью и разрядностью, но в данном случае этого достаточно. Не зря ведь все серьёзные платы используют эти интерфейсы, однако на коленке собрать такие платы либо сложно в изготовлении, либо связано с задачей написания драйверов под определенную операционку.
И потом, согласитесь, что самое главное это управляющая программа, в которую множество людей (низкий им поклон) вложило столько сил и времени.
Я начинал модернизировать станки с написания эмулятора процессора PDP11 (частный случай Электроника 60, МС1201,02) для станков советского производства с разворованными стойками управления. Однако мы уперлись в тупик, связанный с невозможностью модернизации штатного программного обеспечения этих станков.
А это, согласитесь, проблема неразрешимая.
Поэтому мы сделали ставку на открытое ПО под ОС Linux - EMC2.
Лично я благодарен людям создавшим его и отдавшим всем в свободное пользование все, включая исходники.
На этой базе, сейчас можно создавать любые встроенные контроллеры для управления, аппаратно состоящие из набора микросхем, насчитывающих не более десяти наименований.
И этим постом я хочу привлечь Ваше внимание, и предложить идти в этом направлении сообща. На мой взгляд этот путь самый малозатратный и универсальный.
Не малую роль в этом деле играют авторские права, стоимость лицензий на ПО.
Я к этому отношусь очень ответственно и уважительно.
Вот собственно и все, что хотел сказать.
Если не ответил на Ваши вопросы, эадавайте конкретно, постараюсь ответить.
С Уважением.
// 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
Схему сейчас разрабатываю на 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
Если вопрос ко мне, то здесь “src/hal/drivers/pluto_servo_firmware/”
там же и на шаговики, но с выходом step/dir.
Для полного управления надо подключить модуль, аналогичный рассматриваемому в этом посте.
Речь идет о UBUNTU.
Однако там изначально нет этих исходников.
Необходимо их скачать штатными средствами UBUNTU.
Если интересно, опишу подробнее.
Наверное Вы правы!
Но ведь именно на эту плату есть готовые драйвера в EMC2 для работы как сервоприводов, и не в режиме step/dir, так и шаговых двигателей.
Вроде по теме, ведь здесь попытка найти тоже решение.
Извиняюсь и может не по теме.
А никто не пробовал такое сделать для управления станком?
www.knjn.com/FPGA-Parallel.html
Ведь преимуществ много!
Легко перенастраивается с шагового режима на серво, не требует программатора, много входов-выходов и простое подключение к LPT порту.
Исходный код открытый под GPL лицензией в ЕМС2.
При желании и знании Verilog или VHDL можно описать и запрограммировать любую конфигурацию оборудования. Но и так существует уже готовое решение и не надо заморачиваться с программированием.
И цена на FPGA типа Cyclone 1,2,3 в районе 10$.