Ви не увійшли.
шаговый двигатель не шибко скоростное устройство
а какую скорость вы хотите ?
он никогда не крутится плавно - всегда шагами.
просто на больших оборотах это менее заметно.
кроме того на нормальных драйверах есть режим микрошага, который даёт ещё более визуальную плавность
По поводу микрошагов я уже пробовал. Действительно шаги намного менее заметные, движение плавнее. Но мне не хватает скорости вращения. Большое спасибо за ответы.
Буду комбинировать режимы.
он никогда не крутится плавно - всегда шагами.
просто на больших оборотах это менее заметно.
кроме того на нормальных драйверах есть режим микрошага, который даёт ещё более визуальную плавность
gorenkov пише:Когда двигатель крутится на малых оборотах, он немного вибрирует и работает микрорывками - вращение не плавное.
Всё правильно, это же шаговый двигатель, он шагает)
Получается заставить их "плавно" крутиться не получится? А как же тогда он плавно крутится на больших оборотах?
Когда двигатель крутится на малых оборотах, он немного вибрирует и работает микрорывками - вращение не плавное.
Всё правильно, это же шаговый двигатель, он шагает)
Ещё заметит одну неприятную для меня особенность. Когда двигатель крутится на малых оборотах, он немного вибрирует и работает микрорывками - вращение не плавное. И соответственно тихонько "бурчит". Когда он крутится быстро - работает тихо и плавно. Это нормально?
у шагового двигателя есть зона разгона
сначала нужно довести скорость до этой зоны, а уже потом разгонять до высоких скоростей
есть теория, схемы, графики
Спасибо за направление. Будем искать...(с)
у шагового двигателя есть зона разгона
сначала нужно довести скорость до этой зоны, а уже потом разгонять до высоких скоростей
есть теория, схемы, графики
да энкодер здесь совсем не причём, не подымают обороты шаговика до высоких энкодерами и потенциометрами.
кнопками программно получится
Т.е. достаточно просто плавно поворачивать энкодер? В чём-то тут подвох.
Чтобы разогнать до большей скорости нужно использовать плавный разгон.
Величина ускорения будет зависеть от момента инерции: чем он больше, тем более плавный разгон нужно будет обеспечивать
vvr, а как правильно? плавно?
что с энкодером, что с потенциометром проблемы с регулированием скорости вращения шагового двигателя.
до больших скоростей шаговый двигатель нужно ПРАВИЛЬНО разгонять
Конденсаторы для убирания помех поставлены, провода не перепутаны, программа не подвисает, в ней переполнения целых типов не происходят? :-)
Конденсаторов - нет
Провода 100% не перепутаны
программа не подвисает, всё работает стабильно и прогнозируемо
насчёт переполнений не уверен - слишком мал опыт в программировании и работе с ардуино.
Вот мой скетч, через консоль вижу постепенное увеличение константы отвечающей за скорость. После доситжения значения 200 и больше, скорость не увеличивается. После 300 двигатель начинает быстро крутиться. Если вращаю ручку энкодера в обратную сторону, происходит обратный эффект. Сначала скорость падает, но не уменьшается, а при значении меньше 200, скорость начинает уменьшаться.
/*
Stepper Motor Control - one revolution
This program drives a unipolar or bipolar stepper motor.
The motor is attached to digital pins 8 - 11 of the Arduino.
The motor should revolve one revolution in one direction, then
one revolution in the other direction.
Created 11 Mar. 2007
Modified 30 Nov. 2009
by Tom Igoe
*/
#include <Stepper.h>
const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution
int beg = 0;
int dir = 1;
// for your motor
//int button = 6;
//int switcher = 6;
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 2, 3);
//these pins can not be changed 2/3 are special pins
// Setting up the counter
int reading = 0;
int lowest = -500;
int highest = 500;
int changeamnt = 40;
// Timing for polling the encoder
unsigned long currentTime;
unsigned long lastTime;
// Pin definitions
const int pinA = 4;
const int pinB = 5;
int button = 6;
// Storing the readings
boolean encA;
boolean encB;
boolean lastA = false;
void setup() {
// set the speed at 60 rpm:
//myStepper.setSpeed(200);
// initialize the serial port:
pinMode(button, INPUT);
// pinMode(switcher, INPUT);
// set the two pins as inputs with internal pullups
pinMode(pinA, INPUT_PULLUP);
pinMode(pinB, INPUT_PULLUP);
//pinMode(SW, INPUT_PULLUP);
digitalWrite(button , HIGH);
// Set up the timing of the polling
currentTime = millis();
lastTime = currentTime;
// Start the serial monitor for debugging
Serial.begin(9600);
}
void loop() {
// Read elapsed time
currentTime = millis();
// Check if it's time to read
if(currentTime >= (lastTime + 5))
{
// read the two pins
encA = digitalRead(pinA);
encB = digitalRead(pinB);
// check if A has gone from high to low
if ((!encA) && (lastA))
{
// check if B is high
if (encB)
{
// clockwise
if (reading + changeamnt <= highest)
{
reading = reading + changeamnt;
beg = reading;
}
}
else
{
// anti-clockwise
if (reading - changeamnt >= lowest)
{
reading = reading - changeamnt;
beg = reading;
}
}
// Output reading for debugging
Serial.print("Reading ");
Serial.println(reading);
Serial.print("Dir ");
Serial.println(dir);
// Serial.print("SW ");
// Serial.println(switcher);
/* Serial.print("lastA ");
Serial.println(lastA);
Serial.print("lastTime ");
Serial.println(lastTime);
*/
}
// store reading of A and millis for next loop
lastA = encA;
lastTime = currentTime;
}
if (beg == 0)
{
myStepper.setSpeed(0);
myStepper.step(0);
}
if (beg > 0)
{
// dir = 1;
myStepper.setSpeed(beg);
myStepper.step(dir);
}
if (beg < 0)
{
myStepper.setSpeed(-beg);
myStepper.step(-dir);
}
if ( digitalRead (button))
{}
else
{
beg = 0;
reading = 0;
Serial.println("Stop");
}
/* if ( digitalRead(switcher) )
{
beg = 0;
reading = 0;
}
*/
}