Ви не увійшли.
Сторінки 1
Здравствуйте,
http://arduino-ua.com/prod531-Shagovii_ … -1004A_27V - шаговый двигатель
http://arduino-ua.com/prod527-Draiver_s … ya_DRV8834 - драйвер
Подскажите, пожалуйста. Пытаюсь энкодером регулировать скорость шагового двигателя. В общем всё получается, но скорость регулирования не плавная. К примеру, я кручу ручку энкодера и скорость постепенно увеличивается, затем наступает момент когда скорость не увеличивается. А потом через несколько оборотов энкодера двигатель начинает крутиться как бешеный. Это нормально для шагового двигателя или что-то я сделал не так?
Заранее благодарен.
Неактивний
Вот мой скетч, через консоль вижу постепенное увеличение константы отвечающей за скорость. После доситжения значения 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;
}
*/
}
Остання редакція gorenkov (2016-01-14 21:20:04)
Неактивний
Конденсаторы для убирания помех поставлены, провода не перепутаны, программа не подвисает, в ней переполнения целых типов не происходят? :-)
Конденсаторов - нет
Провода 100% не перепутаны
программа не подвисает, всё работает стабильно и прогнозируемо
насчёт переполнений не уверен - слишком мал опыт в программировании и работе с ардуино.
Неактивний
Чтобы разогнать до большей скорости нужно использовать плавный разгон.
Величина ускорения будет зависеть от момента инерции: чем он больше, тем более плавный разгон нужно будет обеспечивать
Неактивний
у шагового двигателя есть зона разгона
сначала нужно довести скорость до этой зоны, а уже потом разгонять до высоких скоростей
есть теория, схемы, графики
Спасибо за направление. Будем искать...(с)
Неактивний
Ещё заметит одну неприятную для меня особенность. Когда двигатель крутится на малых оборотах, он немного вибрирует и работает микрорывками - вращение не плавное. И соответственно тихонько "бурчит". Когда он крутится быстро - работает тихо и плавно. Это нормально?
Неактивний
gorenkov пише:Когда двигатель крутится на малых оборотах, он немного вибрирует и работает микрорывками - вращение не плавное.
Всё правильно, это же шаговый двигатель, он шагает)
Получается заставить их "плавно" крутиться не получится? А как же тогда он плавно крутится на больших оборотах?
Неактивний
он никогда не крутится плавно - всегда шагами.
просто на больших оборотах это менее заметно.
кроме того на нормальных драйверах есть режим микрошага, который даёт ещё более визуальную плавность
Неактивний
он никогда не крутится плавно - всегда шагами.
просто на больших оборотах это менее заметно.
кроме того на нормальных драйверах есть режим микрошага, который даёт ещё более визуальную плавность
По поводу микрошагов я уже пробовал. Действительно шаги намного менее заметные, движение плавнее. Но мне не хватает скорости вращения. Большое спасибо за ответы.
Буду комбинировать режимы.
Неактивний
Сторінки 1