1.
Шаговый двигатель Nema 17 (17HS4401) и модуль A4988
Сообщений 1 страница 8 из 8
Поделиться22024-02-05 14:13:29
Ограничение тока.
Перед использованием драйвера нам нужно сделать небольшую настройку. Для этого нужно ограничить максимальный ток, протекающий через катушки шагового двигателя, и предотвратить превышение номинального тока двигателя.
На драйвере A4988 есть небольшой потенциометр, который можно использовать для установки ограничения тока.
На драйвере A4988 есть небольшой потенциометр, который можно использовать для установки ограничения тока. Вы должны установить ограничение по току равным или ниже номинального тока двигателя.
Расчет и установка ограничещего тока драйвер шагового двигателя A4988.
В данном случае мы собираемся установить ограничение тока путем измерения напряжения (Vref) на выводе «ref».
Взгляните на техническое описание вашего шагового двигателя. Запишите его номинальный ток. Для примера расчета будем использовать NEMA 17 200 шагов/об, 12 В 350 мА.
Переведите драйвер в полношаговый режим, оставив три контакта выбора микрошага отключенными.
Удерживайте двигатель в фиксированном положении, не синхронизируя вход STEP.
Во время регулировки измерьте напряжение Vref (один щуп мультиметра на минус питания, а другой к металлическому корпусу потенциометра).
Отрегулируйте напряжение Vref по формуле:
Vref = Imax * 8 * (RS)
Imax — ток двигателя;
RS — сопротивление резистора. В моем случае RS = 0,100.
Формула Vref для A4988 изменяется от номинала токочувствительных резисторов. Это два черных прямоугольника на плате драйвера. Обычно подписаны R050 или R100.
Формула Vref для A4988 изменяется от номинала токочувствительных резисторов. Это два черных прямоугольника на плате драйвера. Обычно подписаны R050 или R100.
Для 17HS4401 Vref = 1,7 * 8 * 0,100 = 1,36 В.
В связи с тем что рабочий ток двигателя равен 70% от тока удержания. Полученное значение нам нужно умножить на 0,7. В противном случае двигателя в режиме удержания будут сильно греться.
Для 17HS4401 Vref ист. = 1,36*0,7 = 0,952 В.
Аналогично можно рассчитать значения для EM-181
Vref = 1,2 * 8 * 0,100 = 0,96 В
Vrefист. = 0,96*0,7 = 0 ,672 В.
Поделиться32024-02-05 14:15:58
https://cnc-tex.ru/news/4/draiver-shagovogo-dvigatelya-a4988.html
Скетч вращения шагового двигателя NEMA 17, драйвер A4988.
Программа для вращения шагового двигателя NEMA 17, драйвер A4988. Сначала мотор совершает полный оборот в одну сторону, потом в другую.
// Подключаем библиотеку AccelStepper
#include <AccelStepper.h>
// Устанавливаем выводы
const int dirPin = 2;
const int stepPin = 3;
// Определение тип интерфейса двигателя
#define motorInterfaceType 1
// Создаем экземпляр
AccelStepper myStepper(motorInterfaceType, stepPin, dirPin);
void setup() {
// Устанавливаем максимальную скорость, коэффициент ускорения,
// начальную скорость и целевую позицию
myStepper.setMaxSpeed(1000);
myStepper.setAcceleration(50);
myStepper.setSpeed(200);
myStepper.moveTo(200);
}
void loop() {
// Изменение направления вращения, когда двигатель достигнет целевого положения
if (myStepper.distanceToGo() == 0)
myStepper.moveTo(-myStepper.currentPosition());
// Передвинуть на 1 шаг
myStepper.run();
}
Поделиться52024-02-17 19:26:10
https://how2electronics.com/control-ste … r-arduino/ Схема подключения рабочая
Поделиться62024-02-18 14:54:46
Описание команд библиотеки AccelStepper.h
AccelStepper mystepper(DRIVER, step, direction); // Шаговый двигатель, управляемый драйвером ШД по STEP и DIR
AccelStepper mystepper(FULL2WIRE, pinA, pinB); // Шаговый двигатель, управляемый Н-мостом
AccelStepper mystepper(FULL4WIRE, pinA1, pinA2, pinB1, pinB2);// Управление униполярным шаговым двигателем
myStepper.setMaxSpeed(stepsPerSecond);// Установка скорости оборотов в минуту
myStepper.setSpeed(stepsPerSecond);// Установка скорости в шагах за секунду
myStepper.setAcceleration(stepsPerSecondSquared);// Установка ускорения
myStepper.currentPosition(); // Возвращает текущее положение в шагах
myStepper.setCurrentPosition (long position); Обнуляет текущую позицию до нуля
myStepper.targetPosition(); // Конечное положение в шагах
myStepper.distanceToGo(); // Возвращает расстояние до указанного положения
myStepper.moveTo(long absolute); // Переместиться в абсолютно указанное положение
myStepper.move(long relative); // Переместиться в относительно указанное положение
myStepper.run(); // Начать движение с ускорением, функцию следует вызывать повторно
myStepper.runToPosition(); // Начать движение до указанной точки
myStepper.runToNewPosition(); // Начать движение с ускорением до заданной позиции
myStepper.stop(); // Максимально быстрая остановка (без замедления)
myStepper.runSpeed(); // Начать движение с заданной скоростью без плавного ускорения
myStepper.runSpeedToPosition(); // Начать движение без плавного ускорения, до позиции
myStepper.disableOutputs(); // Деактивация зарезервированных пинов и установка их в LOW. Снимает напряжение с обмоток двигателя, экономя энергию
myStepper.enableOutputs(); // Активация зарезервированных пинов и установка их в режим OUTPUT. Вызывается автоматически при запуске двигателя
Поделиться82024-03-07 13:26:06
Проблема с вибрацией:
https://electronics.stackexchange.com/q … ly-at-idle
3
Я работаю с двигателем NEMA-17 (17PM-K310-32VS) с драйвером двигателя DRV8225, для которого я следую этому руководству, используя точно такую же схему, которую они предоставили, но с добавлением одной кнопки, запрограммированной на запуск и остановку двигателя. Я использую библиотеки AccelStepper и EzButton для драйвера и кнопки соответственно со следующим кодом.
#include <AccelStepper.h>
#include <ezButton.h>
#define MOTOR_SPEED 200
#define dirPin 2
#define stepPin 3
#define motorInterfaceType 1
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
ezButton motor_switch(4);
void setup()
{
stepper.setMaxSpeed(200);
stepper.setSpeed(0);
}
void loop()
{
motor_switch.loop();
if(motor_switch.isPressed())
{
stepper.speed()==0 ? stepper.setSpeed(MOTOR_SPEED) : stepper.setSpeed(0);
}
if(stepper.speed()==0)
{
stepper.stop();
//stepper.disableInputs();
}
else
{
//stepper.enableInputs();
stepper.runSpeed();
}
}
Я работаю с двигателем NEMA-17 (17PM-K310-32VS) с драйвером двигателя DRV8225, для которого я следую этому руководству, используя точно такую же схему, которую они предоставили, но с добавлением одной кнопки, запрограммированной на запуск и остановку двигателя. Я использую библиотеки AccelStepper и EzButton для драйвера и кнопки соответственно со следующим кодом.
введите описание изображения здесь
#include <AccelStepper.h>
#include <ezButton.h>
#define MOTOR_SPEED 200
#define dirPin 2
#define stepPin 3
#define motorInterfaceType 1
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
ezButton motor_switch(4);
void setup()
{
stepper.setMaxSpeed(200);
stepper.setSpeed(0);
}
void loop()
{
motor_switch.loop();
if(motor_switch.isPressed())
{
stepper.speed()==0 ? stepper.setSpeed(MOTOR_SPEED) : stepper.setSpeed(0);
}
if(stepper.speed()==0)
{
stepper.stop();
//stepper.disableInputs();
}
else
{
//stepper.enableInputs();
stepper.runSpeed();
}
}
Проблема: Схема и код работают так, как задумано, поскольку я могу запускать и останавливать двигатель нажатием кнопки, но я сталкиваюсь с одной проблемой. Мой двигатель NEMA-17 произвольно вибрирует на холостом ходу. Частота вибрации также случайна, то есть иногда он вибрирует очень короткое время (менее секунды), но в других случаях он вибрирует 5-10 секунд. Также я заметил, что двигатель нагревается даже на холостом ходу. Почему это происходит и как это исправить? Что я делал до сих пор: для устранения неполадок я перепробовал множество способов:
Меняя Arduino, я пробовал использовать UNO, NANO и MEGA.
Изменение библиотеки драйверов и даже загрузка пустого эскиза. (Я также попробовал функции disableInputs от Accelstepper)
Обзор подключений.
Замена двигателей.
Замена драйвера двигателя другим модулем DRV8225.
Изменение предела тока драйвера с помощью его потенциометра.
Надеюсь, что найду что-нибудь здесь. Спасибо.
Я смог устранить проблему. Я обнаружил, что двигатель не находится в режиме ожидания, я прочитал о выводах SLP и reset в руководстве DRV8225 и узнал, что спящим режимом можно управлять с помощью вывода SLP. SLP должно быть высоким, чтобы отключить спящий режим, и низким, чтобы включить его.
Оригинальное руководство и многие другие руководства, которые я нашел в Интернете, показывают прямое подключение с помощью SLP и первых контактов DRV8825 для простого подключения, вероятно, для начинающих. Но ни один из них не упомянул о последствиях этого прямого подключения, и в лучшем случае немногие из них просто упомянули состояние по умолчанию для этих контактов.
Итак, я подключил вывод режима ожидания к цифровым выводам Arduino, и теперь я могу управлять режимом ожидания через sketch и должен обязательно включать режим ожидания каждый раз, когда я хочу, чтобы мой двигатель останавливался и оставался в режиме ожидания. Итак, обновленный код выглядит следующим образом.
#include <AccelStepper.h>
#include <ezButton.h>
#define MOTOR_SPEED 200
#define dirPin 2
#define stepPin 3
#define motorInterfaceType 1
#define SLEEP_PIN 5
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
ezButton motor_switch(4);
void setup()
{
pinMode(SLEEP_PIN,OUTPUT);
digitalWrite(SLEEP_PIN,LOW);
delay(2);
motor_switch.setDebounceTime(50);
stepper.setMaxSpeed(200);
stepper.setSpeed(0);
}
void loop()
{
motor_switch.loop();
if(motor_switch.isPressed())
{
if(stepper.speed()==0)
{
digitalWrite(SLEEP_PIN,HIGH);
delay(2);
stepper.setSpeed(MOTOR_SPEED)
}
else
{
digitalWrite(SLEEP_PIN,LOW);
delay(2);
stepper.setSpeed(0);
}
}
if(stepper.speed()==0)
{
stepper.stop();
}
else
{
stepper.runSpeed();
}
}
Поскольку двигатель сейчас находится в режиме ожидания, как вибрации, так и отвод тепла на холостом ходу двигателя исчезли. Я не знаю, был ли этот нагрев точной причиной вибраций, но на данный момент это исправлено.
______________________________________
Справочник > Язык > Функции > Цифровой ввод > Digitalwrite
digitalWrite()
[Цифровой ввод-вывод]
Описание
Запишите HIGH или LOW значение на цифровой вывод.
Если вывод был настроен как OUTPUT с pinMode(), его напряжение будет установлено на соответствующее значение: 5 В (или 3,3 В на платах 3,3 В) для HIGH, 0 В (заземление) для LOW.
Если вывод настроен как INPUT, digitalWrite() включит (HIGH) или отключит (LOW) внутреннее вытягивание на входном выводе. Рекомендуется установить pinMode() на INPUT_PULLUP, чтобы включить внутренний подтягивающий резистор. Смотрите Руководство по цифровым выводам для получения дополнительной информации.
Если вы не установите pinMode() на OUTPUT и не подключите светодиод к контакту, при вызове digitalWrite(HIGH) светодиод может казаться тусклым. Без явной настройки pinMode(), digitalWrite() будет включен внутренний подтягивающий резистор, который действует как большой токоограничивающий резистор.
Синтаксис
digitalWrite(pin, value)
Параметры
pin: pin-код Arduino.
value: HIGH или LOW.
ВОЗВРАТ
Ничего
Пример кода
Код преобразует цифровой вывод 13 в OUTPUT и переключает его, чередуя HIGH и LOW с частотой в одну секунду.
void setup() {
pinMode(13, OUTPUT); // sets the digital pin 13 as output
}
void loop() {
digitalWrite(13, HIGH); // sets the digital pin 13 on
delay(1000); // waits for a second
digitalWrite(13, LOW); // sets the digital pin 13 off
delay(1000); // waits for a second
}
Примечания и предупреждения
Контакты аналогового входа могут использоваться как цифровые контакты, обозначаемые как A0, A1 и т.д. Исключение составляют контакты A6 и A7 Arduino Nano, Pro Mini и Mini, которые могут использоваться только как аналоговые входы.
ПРО Функцию digitalWrite https://arduinomaster.ru/program/funkts … italwrite/