|
|
  |
Система команд сервоконтроллера, обсудим? |
|
|
|
Feb 19 2009, 20:23
|
Cундук
    
Группа: Участник
Сообщений: 1 478
Регистрация: 13-11-06
Из: Ростов-на-Дону
Пользователь №: 22 269

|
Цитата(slog @ Feb 19 2009, 15:45)  Про оптику - это конечно красиво, и у неё много достоинств. Но как-то сложновато. Ничего не сложновато. И даже не очень дорого. Вот пример. [attachment=29918:AV02_1504EN.pdf] А достоинств, в действительности, гораздо больше, чем можно представить себе в начале. Цитата(slog @ Feb 19 2009, 15:45)  А EtherCAT не сложнее Sercos, но гораздо красивее. А вобще, заколебали уже большие производители промэлектроники - каждый изобретает собственный ни с кем не совместимый интерфейс. Даёшь поголовный переход на CoDeSys и EtherCAT !!! Всё что не совместимо - в мусор!!! И почему именно CoDeSys. Там, на самом деле, не все так бесплатно как кажется в начале. А может быть это будет лучше? На самом деле таких систем достаточно большое количество. Хотите примеров? Их есть у меня. Начиная простейшей.ПМСМ, лучше завести отдельную тему для обсуждения всяких PROFIBUS-ов и EtherCAT-ов. К стати, по последним данным, PROFIBUS в ближайшем будущем начнет умирать. SIEMENS готовит ему достойную замену на основе Ethernet.
Сообщение отредактировал Прохожий - Feb 19 2009, 20:31
|
|
|
|
|
Feb 20 2009, 07:14
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Rst7 @ Feb 19 2009, 17:21)  Я тут попробовал покурить, как плагины для своего железа делать к Mach3. Предварительные данные: 1. Чисто сплайн в форме (кстати, zltigo прав насчет трехэтажных выражений) Код /* as*(t^3)+bs*(t^2) etc */
volatile double spline,as,bs,cs,ds,tmp;
tmp = 0.001; // остальные тоже с вменяемыми значениями
spline = ds + tmp * (cs + tmp * (bs + as*tmp)); жрет 860 тактов при -O2 на WinAVR-20080512 с дефолтным libc. Остальные варианты - до 1300 и более тактов. В сад. Кажется форма записи эта называлась полиномом Горнера. При длительности сервоцикла 1 мс как бенчмарковой отправной точки я могу отсчитать до 64 точек траектории либо где-то за 3 мс либо на ходу, что вполне возможно, т.к все хозяйство меньше 50 мкс. Теперь появляется здоровый интерес к DDA[] Вывод: плавучка возможна. Китайский double - это как китайский ватт. double помещается в 32 бита
|
|
|
|
|
Feb 20 2009, 07:22
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Чисто сплайн в форме Дык может все-же фиксированная точка в формате 16.16? Потому как основная зопа в плавучке это + и -. Цитата Кажется форма записи эта называлась полиномом Горнера. Если быть точным - это схема Горнера для вычисления полинома.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Feb 20 2009, 13:52
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Вообщем, если кого интересует, сделал я получение таймстампа в винде с микросекундной дискретностью. Выглядит где-то так (пардон за кривость): CODE //--------------------------------------------------------------------------- #include <windows.h> #include <winbase.h> #include <stdio.h> #include <sys\timeb.h> #pragma hdrstop
//--------------------------------------------------------------------------- static unsigned long long base_m; static double base_d=0; static long long ddm=0;
#pragma argsused double prec_time(void) { LARGE_INTEGER counter_b; LARGE_INTEGER counter_e; LARGE_INTEGER freq; unsigned long long m; struct timeb ct; double d;
QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&counter_b); ftime(&ct); QueryPerformanceCounter(&counter_e); m=(((unsigned long long)counter_b.QuadPart>>1)+((unsigned long long)counter_e.QuadPart>>1)); //m - новая поправка d=ct.time*1000.0+ct.millitm; //Собственно время в миллисекундах if (base_d) { long long dm; double dd=d-base_d; base_m+=(dd)*((double)freq.QuadPart/1000.0); dm=m-base_m; ddm+=dm; if (dd>0) { printf("%d\n",ddm); if (ddm<0) base_m-=freq.QuadPart/300000; else base_m+=freq.QuadPart/300000; ddm=0; } base_d=d; return d+((double)dm/((double)freq.QuadPart/1000.0)); } else { base_m=m; base_d=d; return d; } }
int main(int argc, char* argv[]) { int i; struct timeb ct; double pt=prec_time();
for(i=0;i<10000;i++) { double t1; double t2; ftime(&ct); t1=ct.time*1000.0+ct.millitm; t2=prec_time(); printf("%f - %f = %f, interval = %f\n",t1,t2,t2-t1,t2-pt); pt=t2; Sleep(2); } return 0; }
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Feb 20 2009, 16:02
|
Гуру
     
Группа: Свой
Сообщений: 3 439
Регистрация: 29-12-04
Пользователь №: 1 741

|
Цитата(Rst7 @ Feb 20 2009, 16:52)  Вообщем, если кого интересует, сделал я получение таймстампа в винде с микросекундной дискретностью. Дрыгоножество LPT порта под виндой-давно пройденный этап нафиг никому ненужный, неработающий на ноутбуках (даже на тех, где порт есть). Для любителя интересен сервоконтроллер, имеющий плугин для Mach3, все остальное- нафиг ненужно. Поскольку Mach3 вываливает в Motion plugin 3 осевое управление и требует наличие круговой интерполяции, то именно это и надо засунуть во внешний контроллер- принимать кадры управления перемещением (в формате Mach3 GMoves), управлять 3 осями, выдавать статус. SDK лежит свободно http://www.machsupport.com/downloads.php В нем есть плугин для контроллера GALIL - вот его и перепахиваем. Интерфейс- любой. Хоть эзернет, хоть USB, или CAN. Кстати, предлагаю забит на AVR и делать на STM32 ARMах - там есть кристаллы где можно выбирать- CAN или USB, причем взаимоисключающе. Для любителя будет USB, для профи-CAN, причем плата и код- практически одинаковый. И ресурсов на интерполяцию хватит.
|
|
|
|
|
Feb 20 2009, 16:20
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата Дрыгоножество LPT порта под виндой-давно пройденный этап нафиг никому ненужный, неработающий на ноутбуках (даже на тех, где порт есть). Причем тут таймстамп к ногодрыжеству? Цитата Поскольку Mach3 вываливает в Motion plugin 3 осевое управление Шестиосевое, шести! Пока принято решение такое: один сервоконтроллер - одна ось. Цитата предлагаю забит на AVR Успеем забить. Цитата И ресурсов на интерполяцию хватит. Хватает и так.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Feb 20 2009, 20:27
|
Гуру
     
Группа: Свой
Сообщений: 3 439
Регистрация: 29-12-04
Пользователь №: 1 741

|
Цитата(Rst7 @ Feb 20 2009, 18:20)  Причем тут таймстамп к ногодрыжеству? Напоминает очень- зафлудить шину управления неизвестно чем, постоянно отрывать процессор на обработку пакетов по шине Цитата Шестиосевое, шести! Пока принято решение такое: один сервоконтроллер - одна ось. Так может все-таки сделать два по 3? И между ними CAN если действительно надо 6 осей. Зато трехосевая интерполяция нормально получиться, если три оси на одном контроллере сидят. По поводу интерполяции. Есть ли исходники цилиндрической интерполяции с контролем скорости перемещения (динамический разгон и остановка, переход к следующему кадру без торможения)? Желательно еще и с цифровым ПИД контроллером по всем осям (для использования серв с энкодерами, а не шаговиков). Вот сомневаюсь я что-то что это удасться впихнуть в Атмегу, особенно если она еще и таймстампы будет постоянно расшифровывать. Цитата(Rst7 @ Feb 19 2009, 16:21)  1. Прямое (которое Jogging) - просто двигаться по нужной оси в направлении со скоростью такой-то 2. GCode movement - движение с координатами.
Я так понимаю, что GCode movement - это его основной режим. И нафлудить он не сможет больше чем раз в миллисекунду. Вот я и думаю - надо в контроллере имплементить понимание таких данных да и всех делов.
Отдельно там идут всякие IO - но тоже вроде небыстро... GCode movement - основной, Jogging- настройка, калибровка, люфты определить, ноль найти итд. Флудит он с частотой 10 Гц, по несколько пакетов GMoves. Пакеты желательно принять про запас- тогда можно предсказывать траектрию движения инструмента и не разгоняться- тормозить на каждом кадре.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|