Шаговый двигатель вращается неожиданно медленно

Я хочу управлять шаговым двигателем с помощью ESP32 и USB-подключения. Кажется, мне сложно понять, почему шаговый двигатель работает так медленно. Подозреваю, что это связано с тем, что питание на двигатель каким-то образом подаётся через плату ESP32.

Используя эту настройку и осторожно используя очень консервативные настройки тока на TMC2209 (примерно 50–100 мА), шаговый двигатель вращается очень медленно.

Наблюдения:

  • При использовании внешнего источника питания двигатель вращается, как и ожидалось, довольно быстро.
  • Когда я отключаю/подключаю питание 20 В от платы питания PD к TMC2209, он снова вращается в соответствии со скоростью внешнего источника питания после первоначального медленного вращения.
  • подача питания/заземления на контакты MS1/MS2 не оказывает никакого влияния на это

Аппаратное обеспечение)

  • Стандартная плата ESP32 devkit с cp2101
  • tmc2209 — это V3 (с дурацкими неправильными маркировками) отсюда
  • питание — плата триггера PD с AliExpress (кажется, обеспечивает стабильные 20 В)
  • переменный понижающий преобразователь — это это

Программное обеспечение) Для библиотеки TMC2209 я использую этот пример скетча с использованием одного кабеля UART.

Вопросы)

  1. Почему двигатель вращается быстрее при использовании внешнего источника питания (подключенного непосредственно к TMC2209)?
  2. Какой дизайн был бы лучше или что можно улучшить в этой установке?
  3. Как не сжечь больше плат ESP32 / драйверов шаговых двигателей?

Этот код, из примеров

#include <TMC2209.h>

// Этот пример не будет работать на платах Arduino без портов HardwareSerial,
// такие как Uno, Nano и Mini.
//
// Более подробную информацию см. в этой ссылке:
// https://www.arduino.cc/reference/en/language/functions/communication/serial/
//
// Чтобы заставить эту библиотеку работать с этими платами, обратитесь к этому примеру библиотеки:
// примеры/Однонаправленная связь/Программный последовательный порт

HardwareSerial & serial_stream = Serial2;
const int TX_PIN = 17;
const int RX_PIN = 16;
const long SERIAL_BAUD_RATE = 115200;

const int32_t RUN_VELOCITY = 10000;
const int32_t STOP_VELOCITY = 0;
const int RUN_DURATION = 2000;
const int STOP_DURATION = 1000;
// текущие значения могут потребоваться уменьшить, чтобы предотвратить перегрев в зависимости от
// конкретное напряжение двигателя и источника питания
const uint8_t RUN_CURRENT_PERCENT = 100;


// Создать экземпляр TMC2209
TMC2209 stepper_driver;
bool invert_direction = false;

void setup()
{
// stepper_driver.setup(serial_stream);
  stepper_driver.setup(serial_stream, SERIAL_BAUD_RATE, TMC2209::SERIAL_ADDRESS_0, RX_PIN, TX_PIN);
  stepper_driver.setRunCurrent(RUN_CURRENT_PERCENT);
  stepper_driver.enableCoolStep();
  stepper_driver.enable();
}

void loop()
{
  stepper_driver.moveAtVelocity(STOP_VELOCITY);
  delay(STOP_DURATION);
  if (invert_direction)
  {
    stepper_driver.enableInverseMotorDirection();
  }
  else
  {
    stepper_driver.disableInverseMotorDirection();
  }
  invert_direction = not invert_direction;

  stepper_driver.moveAtVelocity(RUN_VELOCITY);

  delay(RUN_DURATION);
}

, 👍-1

Обсуждение

Честно говоря, скорее всего, это как-то связано со значениями библиотеки по умолчанию, поскольку при правильной инициализации вращается медленно. Но если сбросить питание, то работает. Правда, это не объясняет, почему он работает с внешним источником питания с тем же напряжением, что и при запуске..., @user2305193


1 ответ


0

Действительно, это была проблема со значением по умолчанию.

 stepper_driver.setMicrostepsPerStep(1);

или

 stepper_driver.setMicrostepsPerStep(8);

Проблема решена. Не уверен, где именно в библиотеке находится строка кода, которая инициализирует MicrostepsPerStep на 256, что обеспечивает чрезвычайно точное, но медленное движение. Возможно, это связано с версией tmc2209 или tmc2209, которую я использую.

,