新手提问步进电机-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 736|回复: 4

[未解决] 新手提问步进电机

[复制链接]
发表于 2022-3-27 21:36 | 显示全部楼层 |阅读模式
本帖最后由 bgsdd 于 2022-3-27 23:04 编辑

新手换个问题,UNO板,工业42步进电机,配专用驱动器,设置200个脉冲转一圈。  想用串口监视器来调速,折腾了半天,不用FOR循环的话电机不会一直转,只会在串口监视器里输一个数字动一下。用了FOR循环只是把动 一下变成了动一圈或几圈,200是转 一圈,2000就是转10圈,,想让电机一直转,输入数字控制脉冲频率来调速,不知道这个方法为什么不行
//串口监视器控制步进电机调速,UNO控制板,28步进电机


#include <AccelStepper.h>  // 引用步进电机库
const int dir = 8;     // 步进电机方向引脚
const int stepp = 9;    // 步进电机速度脉冲引脚
int ser; //建立整数型变量:ser


void setup() {
  Serial.begin(115200); //启动串口通信,波特率:115200
  pinMode(stepp, OUTPUT);    // 速度引脚为输出模式
  pinMode(dir, OUTPUT);     // 方向引脚为输出模式
  digitalWrite(dir, HIGH);  //步进电机旋转方向
}


void loop() {
  if (Serial.available() > 0) { //判断串口有无接收到数据


    ser = Serial.read(); //如有,则通过Serial.read函数读入变量:ser
    for (int x = 0; x < 200; x++)  { //步进驱动器设置旋转一圈所需脉冲数:200
      digitalWrite(stepp, HIGH);    //电机驱动器输出高脉冲
      delayMicroseconds(ser);   //脉冲频率为串口输入数值
      digitalWrite(stepp, LOW);     //电机驱动器输出低脉冲
      delayMicroseconds(ser);   //脉冲频率为串口输入数值


    }
  }
}




 楼主| 发表于 2022-3-28 08:55 | 显示全部楼层
本帖最后由 bgsdd 于 2022-3-28 09:13 编辑

其实就是根据变位器调节步进电机速度来的,电位器可以实时调节电机速度,为什么串口给出的数字不能实时调节电机实时转速,如果上面不用FOR循环的话,电机只会动一下,不会一直转,输入一个数字动 一下,,为什么用电位器就可以一直转。。。不用IF判断串口有无数据的话串口会自动发送-1,是不是用错FOR循环了?
发表于 2022-3-28 09:31 | 显示全部楼层
    for (int x = 0; x < 200; x++)  { //步进驱动器设置旋转一圈所需脉冲数:200
      digitalWrite(stepp, HIGH);    //电机驱动器输出高脉冲
      delayMicroseconds(ser);   //脉冲频率为串口输入数值
      digitalWrite(stepp, LOW);     //电机驱动器输出低脉冲
      delayMicroseconds(ser);   //脉冲频率为串口输入数值
    }

把这一段拿出来放在if (Serial.available() > 0) { }外面
发表于 2022-3-28 09:32 | 显示全部楼层
void loop() {
  if (Serial.available() > 0) { //判断串口有无接收到数据
    ser = Serial.read(); //如有,则通过Serial.read函数读入变量:ser
  }
    for (int x = 0; x < 200; x++)  { //步进驱动器设置旋转一圈所需脉冲数:200
      digitalWrite(stepp, HIGH);    //电机驱动器输出高脉冲
      delayMicroseconds(ser);   //脉冲频率为串口输入数值
      digitalWrite(stepp, LOW);     //电机驱动器输出低脉冲
      delayMicroseconds(ser);   //脉冲频率为串口输入数值
    }
}
 楼主| 发表于 2022-3-28 21:43 | 显示全部楼层
问题解决了,看来是搞错了,LOOP本身就是不停循环,IF判断把电机运转也包括进去了,这样就是电机得到一个脉冲就要判断一次串口数据,怪不得不会连续转动,犯了低级逻辑错误

const int dir = 8;     // 步进电机方向引脚
const int stepp = 9;    // 步进电机速度脉冲引脚
int ser; //建立整数型变量:ser

void setup() {
  Serial.begin(115200); //启动串口通信,波特率:115200
  pinMode(stepp, OUTPUT);    // 速度引脚为输出模式
  pinMode(dir, OUTPUT);     // 方向引脚为输出模式
  digitalWrite(dir, HIGH);  //步进电机旋转方向
}

void loop() {
  if (Serial.available() > 0) { //判断串口有无接收到数据

    ser = Serial.read(); //如有,则通过Serial.read函数读入变量:ser
  }  
  digitalWrite(stepp, HIGH);    //电机驱动器输出高脉冲
  delayMicroseconds(ser);   //脉冲频率为串口输入数值
  digitalWrite(stepp, LOW);     //电机驱动器输出低脉冲
  delayMicroseconds(ser);   //脉冲频率为串口输入数值
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 11:42 , Processed in 0.105110 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表