ardiuno ide 下 速度变化分成三段,第一段匀加速 第二段均速运动 第三段 匀减速
#define stp 12 //设置引脚为输出模式plus
#define enable 23 //设置引脚为输出模式 使能
#define dir 27 //设置引脚为输出模式 方向
#define accel_time 1000 //ms 步进电机 最高 1脉300圈,60脉冲/ms 120 240 480 960
#define yunsu_time 5000 //5秒 也可以自行改成脉冲数 代表的距离
unsigned long last_time;
unsigned long velocity; //每ms的脉冲频率,代表电机转速,主要反应脉冲发射速度(频率) ms脉冲 //电机使能,看接线方法,这里是高电平使能
long accel = 1; //加速度系数 每ms 增加的脉冲频率,
void stp_motor() //发送脉冲,控制步进
{
digitalWrite(stp, HIGH);
delayMicroseconds(int(1.00 / 2 / float(velocity) * 1000)); //delayMicroseconds延时us 转化成毫秒
digitalWrite(stp, LOW);
delayMicroseconds(int(1.00 / 2 / float(velocity) * 1000));
}
void Motor() //电机初始化
{
digitalWrite(enable, HIGH);
digitalWrite(dir, HIGH);
}
void setup() {
Motor();
// put your setup code here, to run once:
Serial.begin(115200); //设置通信波特率,查看结果
last_time = millis();
//匀加速代码,加速1秒
while ((millis() - last_time) <= accel_time) {
velocity = accel * (millis() - last_time) ;
if (velocity == 0)
velocity = 1;
stp_motor();
Serial.println(velocity);
}
//匀速代码 3秒
last_time = millis();
while ((millis() - last_time) <= yunsu_time) {
velocity = accel_time * accel ;
stp_motor();
Serial.println(velocity); //串口速度脉冲频率
}
//匀减速代码
last_time = millis();
while ((millis() - last_time) <= accel_time) {
velocity = (accel_time * accel - accel * (millis() - last_time));
if (velocity == 0)
velocity = 1;
stp_motor();
Serial.println(velocity);
}
}
void loop() {
// put your main code here, to run repeatedly:
}