真正了解步进电机:
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。 记忆要点:频率、脉冲数、步距角。
由浅入深 - 让电机动起来
记忆要点:pinMode、digitalWrite
void setup()
{
pinMode(8, OUTPUT); //@通过 Arduino pinMode 方法设置 8 脚 为输出模式
pinMode(9, OUTPUT); //@通过 Arduino pinMode 方法设置 9 脚 为输出模式
digitalWrite(8, LOW); //@通过 Arduino digitalWrite 方法设置 8 脚 为低电平
digitalWrite(9, LOW); //@通过 Arduino digitalWrite 方法设置 9 脚 为低电平
}
void loop()
{
digitalWrite(9, HIGH);
delay(1);
digitalWrite(9, LOW);
delay(1);
}
让电机往复转动
记忆要点:pinMode、digitalWrite
/*
@Author: TONYLABS
@Date: 2013/01/22
*/
int Distance = 0; //@声明整型变量 Distance 初始值为 0,以下程序体将不断
void setup()
{
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
}
void loop()
{
digitalWrite(9, HIGH);
delayMicroseconds(100);
digitalWrite(9, LOW);
delayMicroseconds(100);
Distance = Distance + 1; // record this step
// Check to see if we are at the end of our move
if (Distance == 3600)
{
// We are! Reverse direction (invert DIR signal)
if (digitalRead(8) == LOW)
{
digitalWrite(8, HIGH);
}
else
{
digitalWrite(8, LOW);
}
// Reset our distance back to zero since we're
// starting a new move
Distance = 0;
// Now pause for half a second
delay(500);
}
}
使用 AccelStepper 控制加速/减速度
下载 AccelStepper 库,下载后解压缩,并按照此方法加载库文件,或打开 examples 目录下的例程
/*
@Author: TONYLABS
@Date: 2013/01/22
*/
#include <accelstepper.h> //@引入 AccelStepper 库头文件
AccelStepper stepper(1, 9, 8); //@声名一个 AccelStepper 对象:stepper,设置1,9,8脚为步进电机控制脚
int pos = 3600; //@设置电机初始位3600
void setup() //@设置
{
stepper.setMaxSpeed(3000); //@通过 stepper 的 setMaxSpeed 方法设置电机最大转速为 3000
stepper.setAcceleration(1000); //@通过 stepper 的 setAcceleration 方法设置加速度为 1000
}
void loop() //@进入程序体循环
{
if (stepper.distanceToGo() == 0)
{
delay(500); //@延时500毫秒
pos = -pos; //@等负值,即反向
stepper.moveTo(pos); //@通过 stepper 对象的 moveTo 方法,电机将转到 pos
}
stepper.run(); //@通过 stepper 对象的 run 方法,执行
} </accelstepper.h>
多电机驱动
/*
@Author: TONYLABS
@Date: 2013/01/22
*/
#include <accelstepper.h>
AccelStepper stepper1(1, 9, 8);
AccelStepper stepper2(1, 7, 6);
int pos1 = 3600;
int pos2 = 5678;
void setup()
{
stepper1.setMaxSpeed(3000);
stepper1.setAcceleration(1000);
stepper2.setMaxSpeed(2000);
stepper2.setAcceleration(800);
}
void loop()
{
if (stepper1.distanceToGo() == 0)
{
delay(500);
pos1 = -pos1;
stepper1.moveTo(pos1);
}
if (stepper2.distanceToGo() == 0)
{
delay(500);
pos2 = -pos2;
stepper2.moveTo(pos2);
}
stepper1.run();
stepper2.run();
} </accelstepper.h>