You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将TMC2209Stepper实例以指针形式传入Arduino自定义类?

解决方法:将驱动实例传入自定义类

针对你的需求,有两种常用的实现方式,都能让自定义类安全复用外部的TMC2209Stepper实例,同时避免主代码因状态变量臃肿:


方法一:使用指针存储驱动实例

这种方式灵活,允许后续修改指向的实例(如果需要),适配Arduino环境的内存管理习惯:

1. 自定义类实现(MyCustomController.h)

#include <TMCStepper.h>

class MyCustomController {
private:
    // 声明指向TMC2209Stepper的指针成员
    TMC2209Stepper* _driver;
    // 封装的私有状态变量
    bool _someState = false;
    bool _someOtherState = true;

public:
    // 构造函数:接收驱动实例的指针
    MyCustomController(TMC2209Stepper* driver) : _driver(driver) {}

    void setSpeed(int speed) {
        // 空指针检查避免崩溃,通过指针调用驱动方法
        if (_driver != nullptr) {
            _driver->VACTUAL(speed);
        }
    }

    // 可添加更多自定义功能,比如状态切换
    void toggleState() {
        _someState = !_someState;
    }
};

2. 主代码使用方式

#include <TMCStepper.h>
// 创建驱动实例
TMC2209Stepper driver(&Serial1, 0.11f, 0b00);

#include "MyCustomController.h"
// 传入驱动实例的指针(&driver获取地址)
MyCustomController customControl(&driver);

void setup() {
    driver.begin();
    driver.rms_current(2000);
    driver.microsteps(32);
}

void loop() {
    // 通过自定义类设置速度
    customControl.setSpeed(100);
    // 调用自定义功能示例
    // customControl.toggleState();
}

方法二:使用引用存储驱动实例

引用是变量的别名,一旦绑定就无法修改指向,适合确定不会更换驱动实例的场景:

1. 自定义类实现(MyCustomController.h)

#include <TMCStepper.h>

class MyCustomController {
private:
    // 声明TMC2209Stepper的引用成员
    TMC2209Stepper& _driver;
    bool _someState = false;
    bool _someOtherState = true;

public:
    // 引用必须在构造函数初始化列表中完成初始化
    MyCustomController(TMC2209Stepper& driver) : _driver(driver) {}

    void setSpeed(int speed) {
        // 直接通过引用调用驱动方法
        _driver.VACTUAL(speed);
    }

    // 自定义状态查询方法
    bool getState() {
        return _someState;
    }
};

2. 主代码使用方式

#include <TMCStepper.h>
TMC2209Stepper driver(&Serial1, 0.11f, 0b00);

#include "MyCustomController.h"
// 直接传入驱动实例(自动转为引用)
MyCustomController customControl(driver);

void setup() {
    driver.begin();
    driver.rms_current(2000);
    driver.microsteps(32);
}

void loop() {
    customControl.setSpeed(100);
}

关键注意点

  • 两种方式都避免了复制TMC2209Stepper实例(复制可能导致硬件资源冲突),仅传递实例的地址或别名
  • 指针方式建议添加空指针检查,防止传入无效指针导致程序崩溃
  • 引用方式必须在构造函数的初始化列表中完成初始化,不能在函数体内赋值

内容的提问来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:56:25