Высокая точность управления оборотами

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем MXXX, 9 фев 2016.

  1. MXXX

    MXXX Гик

    Когда я повесил на таймер операцию занимающую более 100 миллисекунд, у меня перестали срабатывать аппаратные прерывания. По этому и предположил. Хотя по логике должно быть как Вы пишите. Возможно я что-то другое зацепил.
     
  2. Onkel

    Onkel Гуру

    тогда вы будете ограничены 255 скоростями, и выбор будет только одной из этих 255 скоросте, с той же фичей- дискретностью. Потому что программы с таймерами, если они сделаны по уму- сбрасывают счетчики и (возможно) сбрасывают предделители.
    Wellcome to Hell!
    Даташит вам в помощь, желательно на английском. У меня никогда не стояла задача сделать ряд скоростей, обычно задача- попасть в нужную точку, но я бы предложил так- смотрите таймеры, сделайте таблицу частот (времен) прерывания и соответсвенно скоростей при этих параметрах предделителя и счетчика, потом получите таблицу возможных скоростей. Это я к тому, что, возможно, получить скорость точно 299 об/мин не получится, а будут ближайшие возможные скорости 299,57 или 298,75 - так что придется выбирать либо ту, либо ту.
     
  3. Onkel

    Onkel Гуру

    это ниже пояса. Я бью все функции (даже длинные, вроде вычисления fft) на последовательно выполняемые фрагменты не длиннее 0.5 мс. Кстати, если вы третий день только счастливый мучитель ардуин, рекомендую
    http://easyelectronics.ru/avr-uchebnyj-kurs-operacionnaya-sistema-vvedenie.html
    это сразу придаст импульс в нужном направлении
     
  4. Onkel

    Onkel Гуру

    пы сы я вот взглянул на рассчеты по шд, например с таймером 2 с предделителем 64 у меня с шаговиком 200 ш/об и самописным драйвером получается следующий дискретный шаг скоростей (об/мин, разделены пробелами):
    264,25781 265,29412 266,3386 267,3913 268,4524 269,5219 270,6 271,6867 272,7823 273,8866 275 276,1224 277,2541 278,3951 279,5455 280,7054 281,875 283,0544 (ну и т.д. всего выбор из 255 скоростей, переключаем предделитель- еще 255 скоростей...)
    так что в допуск по точности 0.01 об/мин в 8 разрядным таймером не вписаться. Либо, как заметил, выбор одной из возможных скоростей с одновременным выбором коэффициента предделителя.
     
  5. vvr

    vvr Инженерище

    какая то тема тупиковая
    если теоретические изыскания, то можно мозг ломать
    если практически - где такие требования могут возникнуть ? фигня полная
    давайте ещё температурную корректировку добавим и влияние сторонних магнитных полей
     
  6. MXXX

    MXXX Гик

    А кто сказал, что у меня нет температурных корректировок? Еще как есть и корректировки по температуре и по влажности воздуха и по колебаниям напряжения в сети. Все это нужно отслеживать в режиме реального времени и корректировать различные элементы экструзионной линии. Там допуски как в ювелирном деле, а скорости как на станках грубой обработки. Вот и попробуй совмести...
     
  7. MXXX

    MXXX Гик

    Либо поставить отдельную ардуину чтобы только одним шаговиком управляла. Нужно будет только её как-то подключить к главной ардуине по очень стабильному и быстрому каналу.
     
  8. Onkel

    Onkel Гуру

    у меня модули (не ардуины, а просто atmega8a + 8 мосфитов) управления шаговиками - по два униполярных шаговика на модуль.
    Но имхо вы переоцениваете сложность ногодрыгания для шаговиков, хоть для двух на одном мк- это займет не более 1 мкс на шаг. не мс, а мкс. попробуйте и убедитесь.
     
  9. MXXX

    MXXX Гик

    Я попробую в любом случае. Сомнения же у меня не в сложности и не в скорости этой операции а в возможности плавного управления частотой переключения обмоток. Тут чисто математически если я хочу иметь максимальную частоту 1000 шагов/сек и иметь возможность регулировать скорость с 1000 ступенями. То получается мне нужна управляющая логика на частоте 1 Мгц. В этот микросекундный такт нужно еще уложить логику на принятие решение делать шаг или пропускать такт + логику на переключение обмоток двигателя. Да при этом еще надо бы оставить процессор для других задач. Задачка то сомнительная.
    Но пробовать буду в любом случае. Просто отложу пока. Нужно другие блоки быстро доделать. А то скоро придет оборудование, а я застрял на этом шаговике.
     
  10. MXXX

    MXXX Гик

    Хотя кажется я какую-то муть сгородил )) Это я от недосыпания наверно )) Зачем мне 1 Мгц. Достаточно 1 Кгц. Если пропускаю 999 тактов и делаю переключение обмоток на 1000 такте, то получаю скорость 1 шаг в секунду. Если отрабатываю все 1000 тактов, получаю скорость 1000 шагов в сек. Тогда вообще никаких проблем. На такой частоте вообще без проблем любую управляющую логику написать.
     
  11. MXXX

    MXXX Гик

    Сделал регулировку проще некуда. Просто меняю частоту срабатывания таймера.

    Код (C++):
    #include "Arduino.h"
    #include <TimerOne.h>
    #include <Encoder.h>
    #include <Stepper.h>

    //Наш шаговый двигатель. Подключен через драйвер L298N
    Stepper myStepper(200, 25, 27, 29, 31);

    // Энкодер для управления оборотами
    Encoder InterfaceEncoder = Encoder(18, 19);
    long EncoderPosition = 0;

    // Скорость двигателя
    int MotorSpeed = 3000;

    void setup()
    {
      //Подключенние к аппаратному таймеру прерываний
      Timer1.attachInterrupt(Timer_Action_ForMotorSteps);

      //Обороты побольше, чтобы библиотека Stepper не чудила при ручном управлении шагами
      myStepper.setSpeed(1000);
    }

    //Обработчик прерывания по таймеру
    void Timer_Action_ForMotorSteps()
    {
      //Генерируем шаги мотора
      myStepper.step(1);
    }

    void loop()
    {
      //Если ручка энкодера изменила положение, меняем частоту таймера прерываний
      long NewPosition = InterfaceEncoder.read();
     
      if (NewPosition > EncoderPosition)
      {
        MotorSpeed -= 1;
        Timer1.initialize(MotorSpeed);
      }

      if (NewPosition < EncoderPosition)
      {
        MotorSpeed += 1;
        Timer1.initialize(MotorSpeed);
      }

      EncoderPosition = NewPosition;
    }
    Фактически вся регулировка это 1 строка кода Timer1.initialize(MotorSpeed); И никаких танцев с бубном. Получаю плавные обороты с любым шагом каким захочу и полностью свободный для логики программы loop
     
  12. Onkel

    Onkel Гуру

    да, это 16 бит таймер.
    16 бит