Плавная регулировка скорости вращения ШД с помощью потенциометра

Вопросы об управлении шаговыми двигателями
Олег
Сообщения: 1
Зарегистрирован: 30 янв 2018, 13:16

Плавная регулировка скорости вращения ШД с помощью потенциометра

Сообщение Олег » 30 янв 2018, 13:25

Помогите чайнику разобраться-)
Имеем Ардуино Уно
Драйвер Step/Dir TB6560-V2.
Шаговый двигатель 200 шагов за оборот.

На данном этапе необходимо:

иметь возможность ПЛАВНО регулировать скорость вращения двигателя в диапазоне 100-350 оборотов в минуту с помощью потенциометра, с выводом значения на 7-сегментный LED индикатор.

Посоветуйте, пожалуйста, какие библиотеки использовать.


Эдуард
Администратор
Сообщения: 476
Зарегистрирован: 30 окт 2016, 20:53

Re: Плавная регулировка скорости вращения ШД с помощью потенциометра

Сообщение Эдуард » 30 янв 2018, 14:14

Здравствуйте!
Можете попробовать использовать мои библиотеки.
    Для STEP/DIR драйвера библиотека StepDirDriver (урок 35).
    Для управления LED индикатором библиотека Led4Digits (урок 20).
Я бы советовал придерживаться следующей последовательности разработки программы.

1. Из урока 35 загрузить в Ардуино скетч программы драйвера ШД с управлением AT командами, и с помощью программы верхнего уровня (из того же урока) проверить работу драйвера, самого двигателя, диапазон регулировки скорости, крутящий момент двигателя и т.п. Таким образом вы сможете полностью проверить работу вашей системы, как электронику, так и механику. Только регулировка будет не от потенциометра, а с компьютера.

2. Если все устраивает, тогда начинаете писать программу. Пишите простейший вариант, который просто вращает двигатель с постоянной скоростью.

Код: Выделить всё

#include <TimerOne.h>
#include <StepDirDriver.h>

StepDirDriver myMotor(10, 11, 12);  // создаем объект типа StepDirDriver, задаем выводы для сигналов

void setup() {
  Timer1.initialize(250);  // инициализация таймера 1, период 250 мкс
  Timer1.attachInterrupt(timerInterrupt, 250);  // задаем обработчик прерываний
  myMotor.setMode(0, false);  // шаговый режим, без фиксации при остановке
  myMotor.setDivider(10);     // делитель частоты 10 (1 оборот в сек)
}

void loop() {
  myMotor.step(100); 
}

//-------------------------------------- обработчик прерывания 0,25 мс
void  timerInterrupt() {
  myMotor.control(); // управление двигателем
}


3. К этому скелету программы начинаете добавлять все остальное. Подключаете потенциометр и считываете его значение. Я бы настоятельно советовал это значение усреднить. Об этом написано в уроке 13.

4. Масштабируете значение потенциометра в необходимый вам диапазон для скорости вращения (setDivider). Рабочий диапазон определяете на пером этапе.

5. Загружаете масштабируемое значение в setDivider. Теперь вы можете регулировать скорость вращения двигателя от потенциометра.

6. Остается добавить индикацию. читаете урок 20, добавляете библиотеку, выводите на индикатор значение setDivider. Проверяете.

7. Переводите значение setDivider в нужный вам формат, например число оборотов в минуту.

Я вижу это как-то так.

Nicolaich
Сообщения: 1
Зарегистрирован: 05 сен 2019, 19:10

Re: Плавная регулировка скорости вращения ШД с помощью потенциометра

Сообщение Nicolaich » 13 ноя 2019, 22:21

День добрый. По этой теме у меня получился скетч ( на базе уроков Эдуарда);

Код: Выделить всё

/* Здесь попытка управлять скоростью вращения ШД потенциометром
 *  Функция map(value, fromLow, fromHigh, toLow, toHigh)
Функция пропорционально переносит значение (value) из текущего диапазона зна-
чений (fromLow .. fromHigh) в новый диапазон (toLow .. toHigh), заданный пара-
метрами.
Функция map() не ограничивает значение рамками диапазона, как это делает функ-
ция constrain(). Функция contsrain() может быть использована до или после вы-
зова map(), если необходимо ограничить допустимые значения заданным диапазо-
ном.
Обратите внимание, что "нижняя граница" может быть как меньше, так и больше
"верхней границы". Это может быть использовано, чтобы "перевернуть" диапазон:
y = map(x, 1, 50, 50, 1);
Возможно использование отрицательных значений:
y = map(x, 1, 50, 50, -100);
Функция map() оперирует целыми числами. При пропорциональном переносе
дробная часть не округляется по правилам, а просто отбрасывается.
Параметры:
 value — значение для переноса;
 fromLow — нижняя граница текущего диапазона;
 fromHigh — верхняя граница текущего диапазона;
 toLow — нижняя граница нового диапазона, в который переносится значение;
 toHigh — верхняя граница нового диапазона.
Возвращаемое значение — значение в новом диапазоне

*/
#include <TimerOne.h>
#include <StepDirDriver.h>

StepDirDriver myMotor(10, 11, 12);  // создаем объект типа StepDirDriver, задаем выводы для сигналов
// Step,Dir, Enable
int potPin= A0; // потенциометр
int inputCod;  // код входного напряжения на  A0


void setup() {
    Serial.begin(9600);
   //pinMode(A0, INPUT);установка режима аналогового входа для A0

 
  Timer1.initialize(250);  // инициализация таймера 1, период 250 мкс
  Timer1.attachInterrupt(timerInterrupt, 250);  // задаем обработчик прерываний
  myMotor.setMode(0, false);  // шаговый режим, без фиксации при остановке
  myMotor.setDivider(10);     // делитель частоты 10 (1 оборот в сек)
}

void loop() {

 int  inputCod = analogRead(A0); // чтение напряжения на входе A0
   inputCod = map(inputCod, 0,1023, 5, 15);
   
  Serial.println(inputCod); // смотрим в мониторе порта цифры делителя
  myMotor.step(2000);
  myMotor.setDivider(inputCod); 
}

//-------------------------------------- обработчик прерывания 0,25 мс
void  timerInterrupt() {
  myMotor.control(); // управление двигателем
 
 
}


Вернуться в «Шаговые двигатели и драйверы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей