1 2 3 4 5 6 7 8 9 10 10/10 10,00оценок: 1

Делительная головка на Arduino Mega

Тема в разделе "Самодельные инструменты и оборудование", создана пользователем DIYMan, 28.09.18.

  1. DIYMan
    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.888

    DIYMan

    Любопытный рукосуй :)

    DIYMan

    Любопытный рукосуй :)

    Регистрация:
    19.05.13
    Сообщения:
    8.309
    Благодарности:
    6.888
    Адрес:
    80 км от Краснодара
    Расчётами. При деление на угол высчитывается точное кол-во шагов для угла, перемещается. Ошибка дробной части при этом никуда не девается, естественно. Но при последующих перемещениях эта ошибка учитывается. Т. е., грубо говоря - если у нас на угол получилось 10,5 шагов, то первый угол прошивка прошагает 10 шагов, второй - 11 шагов, третий - 10 шагов, четвертый - 11 шагов и т. п. Т. е. ошибка размазана по всей окружности равномерно.

    Вот кусок кода, где высчитывается кол-во шагов на текущем и предыдущем шаге:

    Код:
    
    // в totalNumOfDivisions - угол, на который надо повернуть
    float stepsPerDivision = (stepsPerRevolution*totalNumOfDivisions)/360;
    
    // расчёт кол-ва шагов, currentPosition - кол-во сделанных шагов
    int thisPosition =  currentPosition/totalNumOfDivisions;
    
          int currentStepsCount = thisPosition * stepsPerDivision;
          int nextStepsCount = (thisPosition + 1.00)  * stepsPerDivision;
      
          stepsComputed = (nextStepsCount - currentStepsCount);
    
    // шагаем
    step(stepsComputed);
    
    // как только остановились, то
    currentPosition += totalNumOfDivisions;
    if(currentPosition > 360)
    currentPosition -= 360;
    
    
    Это навскидку, из проекта выдирал. Но принцип виден, надеюсь - кол-во шагов текущего шага высчитывается как разница между "следующим углом плюс единица" и "текущим углом". Таким образом - ошибка равномерно распределяется по окружности. Вот расклад по делению на 115 градусов, 200 шагов на оборот, первая, вторая, третья и четвёртая итерации:

    Итерация номер 1:
    Код:
    // делим на угол 115 градусов
    float stepsPerDivision = (200*115)/360; // 63.8 шага
    currentPosition = 0;
    
    // расчёт кол-ва шагов, currentPosition - кол-во сделанных шагов
    int thisPosition =  0/115; // 0
    
          int currentStepsCount = 0 * 63.8; // 0
          int nextStepsCount = (0 + 1.00)  * 63.8; // 63
      
          stepsComputed = (63 - 0); // 63 шага
    
    Итерация номер 2:
    Код:
    // делим на угол 115 градусов
    float stepsPerDivision = (200*115)/360; // 63.8 шага
    currentPosition = 115;
    
    // расчёт кол-ва шагов, currentPosition - кол-во сделанных шагов
    int thisPosition =  115/115; // 1
    
          int currentStepsCount = 1 * 63.8; // 63
          int nextStepsCount = (1 + 1.00)  * 63.8; // 127
      
          stepsComputed = (127 - 63); // 64 шага
    Итерация номер 3:
    Код:
    // делим на угол 115 градусов
    float stepsPerDivision = (200*115)/360; // 63.8 шага
    currentPosition = 230;
    
    // расчёт кол-ва шагов, currentPosition - кол-во сделанных шагов
    int thisPosition =  230/115; // 2
    
          int currentStepsCount = 2 * 63.8; // 127
          int nextStepsCount = (2 + 1.00)  * 63.8; // 191
      
          stepsComputed = (191 - 127); // 64 шага
    Четвёртая итерация:
    Код:
    // делим на угол 115 градусов
    float stepsPerDivision = (200*115)/360; // 63.8 шага
    currentPosition = 345;
    
    // расчёт кол-ва шагов, currentPosition - кол-во сделанных шагов
    int thisPosition =  345/115; // 3
    
          int currentStepsCount = 3 * 63.8; // 191
          int nextStepsCount = (3 + 1.00)  * 63.8; // 255
      
          stepsComputed = (255 - 191); // 64 шага
    На пятой итерации будет 63 шага (318 - 255), по итогу - погрешность в 0,2 шага будет равномерно размазана по кругу, и с оборотом на 360 градусов позиции погрешности будут совпадать, при условии, что мы всегда движемся в одну и ту же сторону.
     
    Последнее редактирование: 29.08.19
  2. Сергейфывчяфй
    Регистрация:
    25.02.12
    Сообщения:
    317
    Благодарности:
    266

    Сергейфывчяфй

    Живу здесь

    Сергейфывчяфй

    Живу здесь

    Регистрация:
    25.02.12
    Сообщения:
    317
    Благодарности:
    266
    Дмитрий, спасибо за ответ, при разбивке на сектора точно так и сделал, с углами тоже наверно придется идти по этому же пути, просто изначально, в задании был редуктор на 1/180 там все было хорошо, но потом товарищ решил поставить шаговик напрямую, без промежуточного редуктора (сложно закрывать от мелкой стружки). С реверсом похоже придется делать так, поворачиваю на заданный угол + 5 градусов, а потом обратно на 5 градусов (можно и не 5, но гарантированно больше люфта головки).
     
  3. Сергейфывчяфй
    Регистрация:
    25.02.12
    Сообщения:
    317
    Благодарности:
    266

    Сергейфывчяфй

    Живу здесь

    Сергейфывчяфй

    Живу здесь

    Регистрация:
    25.02.12
    Сообщения:
    317
    Благодарности:
    266
    Дмитрий добрый день.
    Проблему с ошибкой при повороте на заданный угол решил следующим образом:
    case LEFT_KEY:
    cur_dir = CCW;
    step_angle_now = (motorSteps * cur_angle) / 360);
    if (cur_dir_old = = cur_dir) {
    stepsperdiv = floor (step_angle_now+errpor_angle);
    errpor_angle= step_angle_now+errpor_angle-stepsperdiv;
    }
    else{
    stepsperdiv = floor (step_angle_now-errpor_angle);
    errpor_angle= step_angle_now-errpor_angle-stepsperdiv;
    }
    move_motor (stepsperdiv, cur_dir);
    cur_dir_old=cur_dir;
    break;
    Запоминаем предыдущее направление и значение ошибки. Если направление для нового поворота совпадают с предыдущим, то добавляем значение ошибки, а если не совпадает то отнимаем.
    Контроллер головок, помимо своего прямого назначения, будет использоваться для изготовления трубчатого объемного каркаса для багги, Используется линейная подача и две головки, одна разворачивает трубу, другая её загибает на нужный угол, немного отпускает замеряет реальный загиб (труба после загиба разгибается) и подгибает окончательно.
     
    Последнее редактирование: 31.08.19