【单片机】ESP32-S3+多TMC2209控制步进电机系列3 使用TMC2209库实现UART通讯

目录

1.下载TMC2209.h库

在Arudino环境中,有两个不错的库可以驱动TMC2209。

  • TMC2209库
  • TMCStepper库
    TMC2209库只针对TMC2209驱动器,而TMCStepper库除了能够支持TMC2209驱动器,还能够支持其他TMC的驱动器,如下图。
    TMC2209库体积小,不复杂。本文将使用TMC2209库来完成对驱动器的通讯。
    打开Arduino的库管理器,搜索TMC2209,点击安装即可。如果无法在线安装,可在其GitHub中下载离线ZIP进行安装,TMC2209库GitHub链接

2.代码部分

本文对是3个TMC2209驱动器进行通讯,对1个电机进行控制(手里就有一个电机现在。。)为例。

cpp 复制代码
#include <TMC2209.h>

//使用串口1对驱动进行通讯
HardwareSerial & serial_stream = Serial1;

// 细分步 1.8°的电机一圈所需脉冲微 360/1.8*MICROSTEPPING
#define MICROSTEPPING 64
// 实例化3个 TMC2209驱动器
TMC2209 stepper_driver_0;
const TMC2209::SerialAddress SERIAL_ADDRESS_0 = TMC2209::SERIAL_ADDRESS_0;
TMC2209 stepper_driver_1;
const TMC2209::SerialAddress SERIAL_ADDRESS_1 = TMC2209::SERIAL_ADDRESS_1;
TMC2209 stepper_driver_2;
const TMC2209::SerialAddress SERIAL_ADDRESS_2 = TMC2209::SERIAL_ADDRESS_2;
//串口通讯的波特率
const long SERIAL_BAUD_RATE = 115200;
const int StepperEnaPin = 3; // 驱动器使能引脚
const int RX_PIN = 18;
const int TX_PIN = 17;
//串口输出延迟
const int DELAY = 2000;
//驱动器响应延迟 
const uint8_t REPLY_DELAY = 4;

//电机运行电流 0~100%
const uint8_t RUN_CURRENT_PERCENT = 40;
const int32_t VELOCITY = 12800;

void setup()
{
  Serial.begin(SERIAL_BAUD_RATE);
  stepper_driver_0.setup(serial_stream, SERIAL_BAUD_RATE, SERIAL_ADDRESS_0, RX_PIN, TX_PIN);
  stepper_driver_0.setReplyDelay(REPLY_DELAY);
  stepper_driver_1.setup(serial_stream, SERIAL_BAUD_RATE, SERIAL_ADDRESS_1, RX_PIN, TX_PIN);
  stepper_driver_1.setReplyDelay(REPLY_DELAY);
  stepper_driver_2.setup(serial_stream, SERIAL_BAUD_RATE, SERIAL_ADDRESS_2, RX_PIN, TX_PIN);
  stepper_driver_2.setReplyDelay(REPLY_DELAY);
  // 设置引脚为输出模式
  pinMode(StepperEnaPin, OUTPUT);
  // 输出高电平
  digitalWrite(StepperEnaPin, LOW);
  delay(DELAY);

  if (stepper_driver_0.isSetupAndCommunicating())
  {
    Serial.println("[Success]:Stepper driver 0 is setup and communicating!");
  }
  else {
    Serial.println("[Fail]:Stepper driver 0 is not setup and communicating!");
  }

  if (stepper_driver_1.isSetupAndCommunicating())
  {
    Serial.println("[Success]:Stepper driver 1 is setup and communicating!");
  }
  else {
    Serial.println("[Fail]:Stepper driver 1 is not setup and communicating!");
  }

  if (stepper_driver_2.isSetupAndCommunicating())
  {
    Serial.println("[Success]:Stepper driver 2 is setup and communicating!");
  }
  else {
    Serial.println("[Fail]:Stepper driver 2 is not setup and communicating!");
  }
  
  // 设置微步
  stepper_driver_0.setMicrostepsPerStep(MICROSTEPPING);
  stepper_driver_0.setHardwareEnablePin(StepperEnaPin);
  stepper_driver_0.setRunCurrent(RUN_CURRENT_PERCENT);
  stepper_driver_0.enableCoolStep();
  stepper_driver_0.enable();
  stepper_driver_0.moveAtVelocity(VELOCITY);
  delay(DELAY);

}
void loop()
{

  if (not stepper_driver_0.isSetupAndCommunicating())
  {
    Serial.println("Stepper driver not setup and communicating!");
    return;
  }

  bool hardware_disabled = stepper_driver_0.hardwareDisabled();
  TMC2209::Settings settings = stepper_driver_0.getSettings();
  TMC2209::Status status = stepper_driver_0.getStatus();

  if (hardware_disabled)
  {
    Serial.println("Stepper driver is hardware disabled!");
  }
  else if (not settings.software_enabled)
  {
    Serial.println("Stepper driver is software disabled!");
  }
  else if ((not status.standstill))
  {
    Serial.print("Moving at velocity ");
    Serial.println(VELOCITY);

    uint32_t interstep_duration = stepper_driver_0.getInterstepDuration();
    Serial.print("which is equal to an interstep_duration of ");
    Serial.println(interstep_duration);
  }
  else
  {
    Serial.println("Not moving, something is wrong!");
  }

  Serial.println();
  delay(DELAY);


}

3.效果展示

如果硬件和代码都没问题的话,你就能看到电机在以每1RPM的转速转动,串口中出现一下通讯情况啦。

需要注意的是,TMC2209原生库只能完成对电机的速度控制,如果要实现对电机的微步控制,加速度控制等功能,就需要配合其他库来完成,如AccelStepper库。因为说白了,TMC2209只是对驱动器进行设置的库,驱动器还是需要接受来自控制器的脉冲信号才能驱动电机旋转。

下一篇将介绍如何使用TMC2209库和AccelStepper库完成对电机的精确位置控制。

相关推荐
DIY机器人工房2 小时前
[6-2] 定时器定时中断&定时器外部时钟 江协科技学习笔记(41个知识点)
笔记·stm32·单片机·学习·江协科技
矿渣渣4 小时前
ZYNQ处理器在发热后功耗增加的原因分析及解决方案
嵌入式硬件·fpga开发·zynq
小智学长 | 嵌入式5 小时前
单片机-STM32部分:13-1、蜂鸣器
stm32·单片机·嵌入式硬件
#金毛5 小时前
六、STM32 HAL库回调机制详解:从设计原理到实战应用
stm32·单片机·嵌入式硬件
欢乐熊嵌入式编程7 小时前
智能手表固件升级 OTA 策略文档初稿
嵌入式硬件·学习·智能手表
欢乐熊嵌入式编程7 小时前
智能手表 MCU 任务调度图
单片机·嵌入式硬件·智能手表
【云轩】7 小时前
电机密集型工厂环境下的无线通信技术选型与优化策略
经验分享·嵌入式硬件
sword devil9008 小时前
将arduino开发的Marlin部署到stm32(3D打印机驱动)
stm32·单片机·嵌入式硬件
GodKK老神灭8 小时前
STM32 变量存储
stm32·单片机·嵌入式硬件
木宁kk8 小时前
51单片机引脚功能概述
单片机·嵌入式硬件