Re: АВТОНОМНЫЙ КОНТРОЛЛЕР
Добавлено: 20 окт 2015, 20:50
А Вы сами пробовали этот алгоритм? Или как всегда теория?Сергей Саныч писал(а): не преобразуя их в вектора и не пользуясь "тяжелыми" операциями типа умножения и деления.
Статьи, обзоры, цены на станки и комплектующие.
https://www.cnc-club.ru/forum/
А Вы сами пробовали этот алгоритм? Или как всегда теория?Сергей Саныч писал(а): не преобразуя их в вектора и не пользуясь "тяжелыми" операциями типа умножения и деления.
Да.grakun писал(а):А Вы сами пробовали этот алгоритм?
Это тот самый случай, про который сказано: "Нет ничего практичнее хорошей теории".grakun писал(а):Или как всегда теория?
Вот кусок кода из моего ЧПУ контроллера:grakun писал(а):А Вы сами пробовали этот алгоритм? Или как всегда теория?Сергей Саныч писал(а): не преобразуя их в вектора и не пользуясь "тяжелыми" операциями типа умножения и деления.
Код: Выделить всё
void RunTaskPulse(int32_t countX,int32_t countY,int32_t countZ)
{
//подготовим данные для сортировки
tChanels chA = {countX, 0,0}; // 26 тактов
tChanels chB = {countY, 2,0}; // 31 такт
tChanels chC = {countZ, 4,0}; // 31 такт
//теперь ABC сортировка
tChanels chTemp = {0,0,0}; // 18 тактов
//сортировка между AB
if (chB.pulse > chA.pulse) // 20 тактов
{
chTemp = chA; // 69
chA = chB; // 69
chB = chTemp; // 69
}
//сортировка между AC
if (chC.pulse > chA.pulse) // 22
{
chTemp = chA; // 69
chA = chC; // 69
chC = chTemp; // 69
}
//сортировка между BC
if (chC.pulse > chB.pulse) // 22
{
chTemp = chB; // 69
chB = chC; // 69
chC = chTemp; // 69
}
//вот теперь запускаем алгоритм Брезенхема
int32_t errorAB = chA.pulse - chB.pulse; //вычисляем разницу между парой AB 32 импульса
int32_t errorAC = chA.pulse - chC.pulse; //вычисляем разницу между парой AC 32 импульса
//получим текущие данные
CNCdata = PINA; //7
//а теперь собственно сам цикл выполнения
for (int32_t i=0; i<chA.pulse; i++) //33-первая итерация, 43 импульса последующие итерации
{
const int32_t cErrorAB = errorAB * 2; //так-же добавим переменные доп. ошибки 20 импульсов
const int32_t cErrorAC = errorAC * 2; //так-же добавим переменные доп. ошибки 20 импульсов
//Первый канал выполняется всегда
errorAB -= chB.pulse; //32
errorAC -= chC.pulse; //32
chA.pulseNow += 1; //20
CNCdata ^= (1<<chA.numAxes);//16
//второй канал выполнятся реже
if (cErrorAB < chA.pulse) //22
{
errorAB += chA.pulse; //28
chB.pulseNow +=1; //20
CNCdata ^= (1<<chB.numAxes);//31
}
//а этот ещё реже :-)
if (cErrorAC < chA.pulse) //22
{
errorAC += chA.pulse; //28
chC.pulseNow +=1; //20
CNCdata ^= (1<<chC.numAxes); //46
}
//выполним Шаг там где нужно
PORTA = CNCdata;//7
}
}
Код: Выделить всё
typedef struct // tChanels - Структура описания количества импульсов, и номер канала оси где это выполнять, и сколько уже выполнено
{
int32_t pulse; //количество импульсов нужно выполнить
uint8_t numAxes; // номер оси: 1 - ось X, 2 - ось Y, 3 - ось Z И номер бита у "порта А"
int32_t pulseNow; //количество импульсов уже выполнено
}tChanels;
Спасибо за код, попробую разобраться.selenur писал(а):ещё забыл добавить описание типа данных
Алгоритм простой:grakun писал(а):Спасибо за код, попробую разобраться.selenur писал(а):ещё забыл добавить описание типа данных
Здесь понятно для x и y, выбирается максимальное значение, но причем здесь z ? Фрезу ломать? Или это для принтера. Ось z должна включаться при отсутствии импульсов x и y. Какой смысл такой сортировки?selenur писал(а):1) По убыванию, сортируется количество импульсов для выполнения, например нужно сделать по оси X=150 импульсов, Y=70, Z =90 импульсов. Выполняется сортировка 150,90,70 (и запоминается порядок осей X,Z,Y)
Зачем вычислять ошибку при каждой итерации, на это уходит драгоценное время. У меня просчитывается алгоритм цикла до его выполнения, после сортировки. Например для Вашего примера, 90 импульсов накладываются на 150. Это каждый второй и каждый десятый. Это вычисляется до цикла.selenur писал(а):2) Запускается цикл который повторятся 150 раз, и при каждой итерации цикла вычисляется "ошибка" благодаря которой выполнение 90 и 70 импульсов растягиваются равномерно относительно 150 импульсов
Ну это понятно, альтернативы нет.selenur писал(а):3) и при каждой итерации цикла в порту А, инвертируется нужный бит, соответствующий нужной оси.
Мне кажется программа подготовки кода Аркам это делает без интерполяции оси z, я делал алгоритм под нее. Там есть опция наклонное врезание. Прекрасно работает. Рельеф тоже прекрасно получается. Спираль не пробовал, попробую.selenur писал(а):Так-же, бывают разные методики обработки, например врезка в материал, движение по спирали с углублением, там движение происходит сразу по 3-м осям.
Я в то время позарился одновременно делать управляющий софт для компьютера, с 3d визуализацией и прочими бантиками, и разрабатывать контроллер, а для хобби было не так много времени, поэтому использовал уже готовый алгоритм, как лучше и оптимальнее сделать на тот момент не задумывался...grakun писал(а):Зачем вычислять ошибку при каждой итерации, на это уходит драгоценное время. У меня просчитывается алгоритм цикла до его выполнения, после сортировки. Например для Вашего примера, 90 импульсов накладываются на 150. Это каждый второй и каждый десятый. Это вычисляется до цикла.selenur писал(а):2) Запускается цикл который повторятся 150 раз, и при каждой итерации цикла вычисляется "ошибка" благодаря которой выполнение 90 и 70 импульсов растягиваются равномерно относительно 150 импульсов
Понятно, я в был в такой же ситуации. Нужно сделать, а времени нет. Компьютер, миниатюрный чпу и контроллер, все на столе. Программируешь и сразу смотришь результат, потом думаешь что получилось.selenur писал(а):Я в то время позарился одновременно делать управляющий софт для компьютера, с 3d визуализацией и прочими бантиками, и разрабатывать контроллер, а для хобби было не так много времени, поэтому использовал уже готовый алгоритм, как лучше и оптимальнее сделать на тот момент не задумывался.
Попробовал движение по спирали, работает только режиме черновой обработки. Вообще в черновом режиме получаются все рельефы. В режиме чистовой обработки Арткам выдает уже совершенно другой код. Там нужна интерполяция z. Вы совершенно правы. Для 100 процентной функциональности буду добавлять интерполяцию оси z.selenur писал(а):Так-же, бывают разные методики обработки, например врезка в материал, движение по спирали с углублением, там движение происходит сразу по 3-м осям.
Я бы сказал для 1%.grakun писал(а):Для 100 процентной функциональности буду добавлять интерполяцию оси z.
Сказать можно все, нужны аргументы. Под 100 процентами я понимаю возможность, с помощью контроллера, изготовить любую модель для трехосного станка.michael-yurov писал(а):Я бы сказал для 1%.
Вообще под работоспособностью понимают работоспособность. (Материал из Википедии )Работоспособность-свойство элемента или системы непрерывно выполнять свои задачи при определённых условиях эксплуатации......michael-yurov писал(а):Это называется «работоспособность».
Не "что-то", а "выполнять свои задачи". Т.е. выполнять те функции, для которых предназначено данное устройство.grakun писал(а):Так вот, работоспособность это возможность что то выполнять.
Что значит «полный набор функций»?grakun писал(а):Если есть хотя бы один, но полный набор функции для работы
Я не хотел спорить и доказывать. Я лишь отметил, как я сам бы выразился в данной ситуации.grakun писал(а):почему это 1 процент?
То, что в принципе можно требовать / хотеть / ожидать от пульта ЧПУ.grakun писал(а):Что Вы имеете ввиду под 100 процентами? Все что уже придумано? А кто нибудь это знает?
В принципе то спора и нет. Я во многом согласен. Под полным набором я имею ввиду лишь необходимые вещи.michael-yurov писал(а):Я прошу прощения, не хотел вступать в спор.
Но функциональность на самом деле более чем скромная, и заявлять о 100% функциональности довольно странно.