Для реализации такого принципа считывания резольвера обычно применяют спец чипы. но они довольно дорогие. Проще уйти от абсолютного энкодера и сделать обратное преобразование. Т.е. подать квадратуру(синус, косинус) на выхода, а со входа считать компаратором знак. И дальше уже считать позицию счетчиком. Так сделано в большинстве станков советского производства.nkp писал(а):тогда не очень как то ...
UART ... ардуина и LinuxCnC
-
Impartial
- Мастер
- Сообщения: 953
- Зарегистрирован: 23 фев 2011, 01:50
- Репутация: 36
- Контактная информация:
Re: UART ... ардуина и LinuxCnC
-
nkp
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: UART ... ардуина и LinuxCnC
вот это разве не то?Impartial писал(а):Для этого нужен драйвер сом порта работающий в серво потоке, т.е. в реалтаймовой части. Такого штатного нет. Надо самому писать. Однако, если до сих пор он никем не написан, значит там есть какой то непреодолимый бугор.
Код: Выделить всё
component serport """Hardware driver for the digital I/O bits of the 8250 and 16550 serial port.
.B loadrt serport io=\\fIaddr[,addr...]\\fR
.PP
The pin numbers refer to the 9-pin serial pinout. Keep in mind that these ports generally use rs232 voltages, not 0/5V signals.
Specify the I/O address of the serial ports using the module parameter
\\fBio=\\fIaddr[,addr...]\\fR. These ports must not be in use by the kernel.
To free up the I/O ports after bootup, install setserial and execute a command
like:
.RS
sudo setserial /dev/ttyS0 uart none
.RE
but it is best to ensure that the serial port is never used or configured by
the Linux kernel by setting a kernel commandline parameter or not loading
the serial kernel module if it is a modularized driver.
""";
pin out bit pin_1_in "Also called DCD (data carrier detect); pin 8 on the 25-pin serial pinout";
pin out bit pin_6_in "Also called DSR (data set ready); pin 6 on the 25-pin serial pinout";
pin out bit pin_8_in "Also called CTS (clear to send); pin 5 on the 25-pin serial pinout";
pin out bit pin_9_in "Also called RI (ring indicator); pin 22 on the 25-pin serial pinout";
pin out bit pin_1_in_not "Inverted version of pin-1-in";
pin out bit pin_6_in_not "Inverted version of pin-6-in";
pin out bit pin_8_in_not "Inverted version of pin-8-in";
pin out bit pin_9_in_not "Inverted version of pin-9-in";
pin in bit pin_3_out "Also called TX (transmit data); pin 2 on the 25-pin serial pinout";
pin in bit pin_4_out "Also called DTR (data terminal ready); pin 20 on the 25-pin serial pinout";
pin in bit pin_7_out "Also called RTS (request to send); pin 4 on the 25-pin serial pinout";
param rw bit pin_3_out_invert;
param rw bit pin_4_out_invert;
param rw bit pin_7_out_invert;
param r u32 ioaddr;
option count_function;
option extra_setup;
option extra_cleanup;
option constructable no;
function read nofp;
function write nofp;
license "GPL";
;;
#include <asm/io.h>
#include <rtapi_errno.h>
#define MAX 8
int io[MAX] = {0,};
RTAPI_MP_ARRAY_INT(io, MAX, "I/O addresses of serial ports");
int get_count(void) {
int i = 0;
for(i=0; i<MAX && io[i]; i++) { /* Nothing */ }
return i;
}
EXTRA_SETUP() {
rtapi_print_msg(RTAPI_MSG_INFO, "requesting I/O region 0x%x\n",
io[extra_arg]);
if(!rtapi_request_region(io[extra_arg], 7, "serport")) {
// set this I/O port to 0 so that EXTRA_CLEANUP does not release the IO
// ports that were never requested.
rtapi_print_msg(RTAPI_MSG_ERR,
"Could not register port at address 0x%x. See\n"
"'man serport' for information on using 'setserial'\n"
"to make a port available to hal", io[extra_arg]);
io[extra_arg] = 0;
return -EBUSY;
}
ioaddr = io[extra_arg];
return 0;
}
EXTRA_CLEANUP() {
int i;
for(i=0; i < MAX && io[i]; i++) {
rtapi_print_msg(RTAPI_MSG_INFO, "releasing I/O region 0x%x\n",
io[i]);
rtapi_release_region(io[i], 7);
}
}
#define MSR (ioaddr + 6)
#define CTS (1<<4)
#define DSR (1<<5)
#define RI (1<<6)
#define DCD (1<<7)
#define MCR (ioaddr + 4)
#define DTR (1<<0)
#define RTS (1<<1)
#define LCR (ioaddr + 3)
#define BREAK (1<<6)
FUNCTION(read) {
int i = inb(MSR);
pin_9_in = (i & RI) == 0;
pin_9_in_not = (i & RI) == RI;
pin_1_in = (i & DCD) == 0;
pin_1_in_not = !(i & DCD) == DCD;
pin_6_in = (i & DSR) == 0;
pin_6_in_not = (i & DSR) == DSR;
pin_8_in = (i & CTS) == 0;
pin_8_in_not = (i & CTS) == CTS;
}
FUNCTION(write) {
int i = 0, j=0;
if(!pin_4_out ^ !pin_4_out_invert) i |= DTR;
if(!pin_7_out ^ !pin_7_out_invert) i |= RTS;
if(!pin_3_out ^ !pin_3_out_invert) j |= BREAK;
outb(i, MCR);
outb(j, LCR);
}
Последний раз редактировалось nkp 08 фев 2014, 23:35, всего редактировалось 1 раз.
-
aftaev
- Зачётный участник

- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6194
- Откуда: Казахстан.
- Контактная информация:
Re: UART ... ардуина и LinuxCnC
типо этого UART ... ардуина и LinuxCnC #3 ?Impartial писал(а):Для реализации такого принципа считывания резольвера обычно применяют спец чипы. но они довольно дорогие.
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
- Dmaster
- Мастер
- Сообщения: 1272
- Зарегистрирован: 15 июл 2011, 13:36
- Репутация: 476
- Контактная информация:
Re: UART ... ардуина и LinuxCnC
именно!!!!!! uart есть еще у 5i20nkp писал(а):мне кажеться тс хочет использовать как раз uart меса (5и23)
" Linux CNC - наше всё"
-
Impartial
- Мастер
- Сообщения: 953
- Зарегистрирован: 23 фев 2011, 01:50
- Репутация: 36
- Контактная информация:
Re: UART ... ардуина и LinuxCnC
Нет. В данном случае ком порт используется только как расширение лпт. Увеличивает количество входов-выходов. Как последовательный порт он не работает.nkp писал(а):вот это разве не то?
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: UART ... ардуина и LinuxCnC
Теоретически можно, наверное, на основе serport сделать свой компонент, который бы позволял принимать последовательные данные. Работа с 8250/16450 достаточно проста.
Скорее всего, сработал принцип "неуловимого Джо".Impartial писал(а):Однако, если до сих пор он никем не написан, значит там есть какой то непреодолимый бугор.
Чудес не бывает. Бывают фокусы.
-
Impartial
- Мастер
- Сообщения: 953
- Зарегистрирован: 23 фев 2011, 01:50
- Репутация: 36
- Контактная информация:
Re: UART ... ардуина и LinuxCnC
Ну да, это оно. Сколько стоит?aftaev писал(а): типо этого UART ... ардуина и LinuxCnC #3 ?
Врядли. Судя по форумам многие интересуются возможностью управлять движением по ком порту. Есть реализация модбаса, что в принципе одно и тоже, но этот компонент предназначен для работы только в пользовательском режиме. Для пульта это подойдет, а для движения нет. Даже концевики хомов нельзя через него подключать.Сергей Саныч писал(а):Скорее всего, сработал принцип "неуловимого Джо"
-
aftaev
- Зачётный участник

- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6194
- Откуда: Казахстан.
- Контактная информация:
Re: UART ... ардуина и LinuxCnC
там же цена есть в ссылкеImpartial писал(а):Сколько стоит?
aftaev писал(а):На их сайте типо можно заказать бесплатные образцы http://www.analog.com/ru/analog-to-digi ... ct-samples
только для этого нужен корпоративный емайл
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
- selenur
- Почётный участник

- Сообщения: 4605
- Зарегистрирован: 21 авг 2013, 19:44
- Репутация: 1622
- Настоящее имя: Сергей
- Откуда: Новый Уренгой
- Контактная информация:
Re: UART ... ардуина и LinuxCnC
Я периодически семплы беру у них, но вот время доставки семплов иногда растягивается до 3-х месяцев
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: UART ... ардуина и LinuxCnC
Ничего сложного в работе с COM-портом нет, поскольку устройство древнее и все регистры прекрасно описаны. Проблема, КМК, только в малой скорости самого порта и подключаемых устройств. На типичной для Modbus скорости 19200 бод можно за один сервоцикл (1 мсек) передать или принять меньше двух байт. А цикл обмена по RTU - минимум 20 байтов.Impartial писал(а):Врядли. Судя по форумам многие интересуются возможностью управлять движением по ком порту. Есть реализация модбаса, что в принципе одно и тоже, но этот компонент предназначен для работы только в пользовательском режиме.
Можно, конечно, отказаться от модбаса и использовать упрощенные протоколы и поднять скорость (стандартно максимум до 115200). Но это получатся узкоспециализированые решения, требующие нестандартной периферии. Которые, если и появятся, вряд ли попадут в стандартную поставку LCNC.
Чудес не бывает. Бывают фокусы.
-
nkp
- Мастер
- Сообщения: 8340
- Зарегистрирован: 28 ноя 2011, 00:25
- Репутация: 1589
- Контактная информация:
Re: UART ... ардуина и LinuxCnC
это конечно не существенно в данном ракурсе , но - почему 20?Сергей Саныч писал(а):А цикл обмена по RTU - минимум 20 байтов.
(исходя из протокола)
- Dmaster
- Мастер
- Сообщения: 1272
- Зарегистрирован: 15 июл 2011, 13:36
- Репутация: 476
- Контактная информация:
Re: UART ... ардуина и LinuxCnC
Зачем изобретать велосипед?.. у месы почти каждая anything I/O может общаться по UART
как ТС прошу дать оценку вот этому
https://github.com/araisrobo/linuxcnc/b ... ot2/uart.c
как ТС прошу дать оценку вот этому
https://github.com/araisrobo/linuxcnc/b ... ot2/uart.c
" Linux CNC - наше всё"
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: UART ... ардуина и LinuxCnC
Запрос (в приведенном источнике, табл. 3-4 - 8 байт)nkp писал(а):почему 20?
Пауза (3,5 байтовых интервала)
Ответ (табл. 3-5 - 7 байт)
Пауза (3,5)
Итого 22.
Чудес не бывает. Бывают фокусы.
-
Impartial
- Мастер
- Сообщения: 953
- Зарегистрирован: 23 фев 2011, 01:50
- Репутация: 36
- Контактная информация:
Re: UART ... ардуина и LinuxCnC
Какая разница где этот юарт находится в штатном оборудовании компа или в месе. Штатный даже более предпочтителен. Проблема не уйдет из за перемены места ее пребывания.Dmaster писал(а):Зачем изобретать велосипед?.. у месы почти каждая anything I/O может общаться по UART
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: UART ... ардуина и LinuxCnC
Те, что на платах 5i25/6i25 умеют работать на скоростях до 2 Mbit/s.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
-
Impartial
- Мастер
- Сообщения: 953
- Зарегистрирован: 23 фев 2011, 01:50
- Репутация: 36
- Контактная информация:
Re: UART ... ардуина и LinuxCnC
Штатный тоже это умеет на новых компах. Только это ничего не дает. Все равно мало.
Допустим написали идеальный драйвер умеющий без задержек вытаскивать на уровень приложения данные и без задержек передавать на физический уровень. Что получаем в разрезе движения?
Если использовать весь интервал сервоцикла, то максимальная пропускная способность канала - 200 байт за сервоцикл при 2 мбит скорости.
Для синхронизации с сервоциклом нужно в его начале передать запрос - допустим 1 байт. На этот запрос получаем ответ - данные энкодеров, состояния концевиков, контрольную сумму. Это на 4 оси не менее 20 байт. Дальше комп считает ПИДы и выдает значения текущей скорости, состояния выходов и контрольную сумму. Это еще около 20 байт. Приемная сторона должна настроить по этим данным свои системы управления скоростью. И это все при условии, что в канале нет сбоев, что при 2 мбит маловероятно.
В общем весьма непростая задачка с непредсказуемым выходным результатом.
Допустим написали идеальный драйвер умеющий без задержек вытаскивать на уровень приложения данные и без задержек передавать на физический уровень. Что получаем в разрезе движения?
Если использовать весь интервал сервоцикла, то максимальная пропускная способность канала - 200 байт за сервоцикл при 2 мбит скорости.
Для синхронизации с сервоциклом нужно в его начале передать запрос - допустим 1 байт. На этот запрос получаем ответ - данные энкодеров, состояния концевиков, контрольную сумму. Это на 4 оси не менее 20 байт. Дальше комп считает ПИДы и выдает значения текущей скорости, состояния выходов и контрольную сумму. Это еще около 20 байт. Приемная сторона должна настроить по этим данным свои системы управления скоростью. И это все при условии, что в канале нет сбоев, что при 2 мбит маловероятно.
В общем весьма непростая задачка с непредсказуемым выходным результатом.
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: UART ... ардуина и LinuxCnC
А, тут про управление движением - тогда фик, в Месе эти порты используются только для расширения IO. Максимум на один порт они умеют навешивать полторы тысячи двоичных пинов.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...