前言

        步进电机的精准控制是一个比较麻烦的事,要是不想深入学习电机控制而且又有精准控制的需求的话,可以在某宝搜买闭环驱动器,这里我使用的是张大头42步进电机闭环控制器,“可恶”的是up主没有在他的例程中提供函数,然后自己写了一个,供大家参考,也望大家批评指正。


一、接线

这个支撑多个电机挂在一个usart上面,只需要手动设置电机的地址就可以了,十分的方便

二、代码

这里直接给出了代码,代码也先当简单,不会看对象的话直接调用下面void loop中的那些函数就行。

因为其中有几处讲解的地方就是lastControlBytes,为了防止arduino一直在循环里给步进电机控制器一直发送消息,就做了数据更新的判断,所以大家大胆的在循环中调用set_speed()。

这里只做了速度的控制,还可以进行位置的控制,因为这次没用到,下次用到的时候再写给大家。

#include <Arduino.h>

class StepperMotorControl {
  private:
    byte controlBytes[6] = {0x00, 0xF6, 0x14, 0xFF, 0x00, 0x6B};
    byte lastControlBytes[6] = {0x00, 0xF6, 0x14, 0xFF, 0x00, 0x6B};
    Stream *serialPort;

    bool hasChanged() {
      for (byte i = 0; i < 6; i++) {
        if (controlBytes[i] != lastControlBytes[i]) {
          return true;
        }
      }
      return false;
    }

    void updateLastControlBytes() {
      for (byte i = 0; i < 6; i++) {
        lastControlBytes[i] = controlBytes[i];
      }
    }    

    void sendCommand() {
      if (hasChanged()) {
        serialPort->write(controlBytes, 6);
        updateLastControlBytes();
      }
    }

  public:

    StepperMotorControl(byte address, Stream *_serialPort) {
      controlBytes[0] = address; // 在构造函数中设置电机地址
      serialPort = _serialPort;
    }    

    void set_speed(bool direction, uint16_t speed) {
      if (direction) {
        controlBytes[2] = (0x10) | ((speed >> 8) & 0x0F); // 逆时针方向
      } else {
        controlBytes[2] = (0x00) | ((speed >> 8) & 0x0F); // 顺时针方向
      }
      controlBytes[3] = speed & 0xFF;
      sendCommand();
    }

    void set_acceleration(uint16_t acceleration)
    {
      controlBytes[4] = acceleration;
      sendCommand();
    }
};

// 设置步进电机使用的串口
StepperMotorControl stepper(0x01,&Serial);

void setup() {
  // 初始化串口
  Serial.begin(115200);
}

void loop() {
  // 设置电机为逆时针方向,速度为0x4FF
  stepper.set_speed(1, 0x4FF);
  delay(5000); // 等待5秒

  // 设置电机为顺时针方向,速度为0x4FF
  stepper.set_speed(0, 0x4FF);
  delay(5000); // 等待5秒
}


Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐