步进闭环控制、速度控制(张大头Emm_V4.2驱动器)速度控制——Arduino

文章介绍了如何使用张大头42步进电机闭环控制器进行步进电机的精准控制,提供了Arduino代码示例,包括速度控制函数,并强调了代码中的数据更新判断以避免重复发送消息。此外,还提到可以进行位置控制但未在本次示例中包含。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

        步进电机的精准控制是一个比较麻烦的事,要是不想深入学习电机控制而且又有精准控制的需求的话,可以在某宝搜买闭环驱动器,这里我使用的是张大头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秒
}


### Arduino 控制 42 步进电机实现闭环控制 #### 使用 A4988 驱动器和 SimpleFOC 库进行闭环控制 为了实现对 42 步进电机闭环控制,可以使用 A4988 驱动器配合编码器反馈以及 `SimpleFOC` 库。这种组合能够提供精确的位置控制并改善系统的响应特性。 ```cpp #include <Wire.h> #include <AS5600.h> // 如果使用 AS5600 编码器则引入此文件 #include <SimpleFOC.h> // 初始化电机对象,并指定相数、电流传感器引脚(如果适用) BLDCMotor motor = BLDCMotor(7, 6, 5); // 若使用其他类型的旋转编码器,则需替换为相应的类实例化语句 AS5600 sensor; void setup() { Serial.begin(9600); // 开始 I2C 总线通信用于与编码器通讯 Wire.begin(); // 对编码器初始化设置 sensor.init(); // 设置电机参数配置 motor.init(); } void loop() { // 获取当前位置信息 float angle = sensor.getAngle(); // 将获取的角度转换成弧度作为目标位置发送给电机 motor.setTarget(angle * DEG_TO_RAD); // 执行一次 FOC 运算周期更新电机状态 motor.loopFOC(); // 调试输出当前角度值以便观察运行情况 Serial.print("Current Angle: "); Serial.println(angle); // 延迟一段时间等待下一轮循环开始 delay(100); } ``` 上述代码展示了如何通过读取来自磁性编码器 (如 AS5600)[^3] 的实时数据来调整步进电机的目标位置,从而形成一个完整的反馈回路。值得注意的是,在实际应用中可能还需要考虑更多细节,比如 PID 参数调优等以获得更好的动态性能[^1]。 对于具体型号为 "42" 的步进电机而言,其物理尺寸较小而力矩相对有限,因此特别适合应用于桌面级 CNC 或者小型 3D 打印机这类需要高精度定位但负载不大的场合。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值