Arduino与TMC2209通信

Arduino communication with TMC2209

我正在尝试使用 Arduino nano Every 与 TMC2209(步进驱动器)通信。 我将引脚 RX 连接到引脚 D2 上,将 TX 连接到引脚 D3 上。 我在 TX 和 RX 之间放置了一个 1K 的电阻。 似乎我可以写参数(即使我正在深入测试,我现在不太确定..)但我不能 从驱动程序中读取任何内容。

图片添加于 15/04/2021 与 TMC2209 数据表相关

在我的测试中,我只尝试了一个地址为 0 的驱动器,意味着 MS1_AD0 和 MS2_AD1 连接到 GND。

        driver1.microsteps(MICROSTEPS);
        SerialPort.print("Counter1=");
        SerialPort.print(driver1.IFCNT());
        SerialPort.print(", Status=");
        SerialPort.println(driver1.DRV_STATUS());            

我尝试读取 IFCNT 和 DRV_STATUS,总是零。

初始化是这样完成的:

#include <Wire.h>
#include <AG_AS5600.h>
#include <TMCStepper.h>
#include <AccelStepper.h>

#define ENCODER           false
#define FEEDBACK_I2C      true
#define GEARBOX           139 //51
#define MICROSTEPS        16
#define MIN_SPEED         20
#define MAX_SPEED         3000
double offsetHome       = 77.0;

#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
  #define SerialPort SerialUSB
  #define SYS_VOL   3.3
#else
  #define SerialPort Serial
  #define SYS_VOL   5
#endif

#define SW_RX             2       // TMC2208/TMC2224 SoftwareSerial receive pin
#define SW_TX             3       // TMC2208/TMC2224 SoftwareSerial transmit pin
#define EN_PIN            7       // Enable
#define DIR_PIN           8       // Direction
#define STEP_PIN          9       // Step
#define SERIAL_PORT       Serial1 // TMC2208/TMC2224 HardwareSerial port
#define DRIVER_ADDRESS1   0b00    // TMC2209 Driver address according to MS1 and MS2

#define R_SENSE           0.11f   // Match to your driver
                                  // SilentStepStick series use 0.11
                                  // UltiMachine Einsy and Archim2 boards use 0.2
                                  // Panucatt BSD2660 uses 0.1
                                  // Watterott TMC5160 uses 0.075

AG_AMS_5600 ams5600;

TMC2209Stepper driver1(SW_RX, SW_TX, R_SENSE, DRIVER_ADDRESS1);
AccelStepper stepper = AccelStepper(stepper.DRIVER, STEP_PIN, DIR_PIN);

String cmd            = {};
    
void setup()
{
  SerialPort.begin(115200);
  Wire.begin();
  Wire.setTimeout(10);
  SerialPort.println(">>>>>>>>>> Program started <<<<<<<<<<");
        
  pinMode(EN_PIN, OUTPUT);
  pinMode(STEP_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
  digitalWrite(EN_PIN, HIGH);     // Enable driver in hardware

                                  // Enable one according to your setup
  SPI.begin();                    // SPI drivers
  driver1.beginSerial(115200);     // SW UART drivers

  driver1.begin();                 //  SPI: Init CS pins and possible SW SPI pins
                                  // UART: Init SW UART (if selected) with default 115200 baudrate
  driver1.toff(5);                 // Enables driver in software
  driver1.rms_current(2000);       // Set stepper current to 600mA. The command is the same as command TMC2130.setCurrent(600, 0.11, 0.5);
  driver1.microsteps(MICROSTEPS);
  driver1.pwm_autoscale(true);     // Needed for stealthChop 
    
  stepper.setMaxSpeed(degToSteps(500.0));   // steps/s
  stepper.setAcceleration(degToSteps(1.0)); // steps/s^2
  stepper.setEnablePin(EN_PIN);
  stepper.setPinsInverted(false, false, true);
  stepper.disableOutputs();
}


void loop()
{
    unsigned long t0 = micros();  
            
    switch (step) {
      
      case 0:
        cmd = SerialPort.readString();
        
        if (cmd.charAt(0)=='a' && cmd.charAt(1)=='=') {
            acc = degToSteps(cmd.substring(2).toDouble());
            SerialPort.print("Acceleration=");
            SerialPort.println(acc);
            cmd = "";
          }
        else if (cmd.charAt(0)=='d' && cmd.charAt(1)=='=') {
            dec = cmd.substring(2).toInt();
            SerialPort.print("Deceleration=");
            SerialPort.println(dec);            
            cmd = "";
          }
        else if (cmd.charAt(0)=='c' && cmd.charAt(1)=='?') {
            driver1.microsteps(MICROSTEPS);
            driver2.microsteps(MICROSTEPS);
            SerialPort.print("Counter1=");
            SerialPort.print(driver1.IFCNT());
            SerialPort.print(", Counter2=");
            SerialPort.print(driver2.IFCNT());            
            SerialPort.print(", Status=");
            SerialPort.println(driver1.DRV_STATUS());            
            cmd = "";
          }
}

硬件应该没问题,因为 UART 的跳线默认配置在 pin4 上。

谁能帮我理解为什么?

谢谢 安德里亚

找到了! 问题是“软件”串行端口的处理。 不幸的是,我很困惑,因为“TMCstepper.h”库的许多示例都使用两个引脚作为 TX 和 RX,所以我确信内部引脚被处理为发送和接收……但事实并非如此。

所以我找到的解决方案是:

#include <SoftwareSerial.h>
SoftwareSerial            SerialDriver1(SW_RX, SW_TX);
TMC2209Stepper driver1(&SerialDriver1, R_SENSE, DRIVER_ADDRESS1);

void setup()
{
  SerialDriver1.begin(57600);
  SerialDriver1.listen();
...

评论真的很重要:

 //driver1.beginSerial(115200);     // SW UART drivers

我猜这很重要,因为我已经在设置中打开了该端口。 并且有必要指定要收听的软件端口,而不是由TMC库完成。

最后的提示,使用 Arduino Nano 每次我发现软件串行似乎可以在 57600 的最大波特率下工作,115200 不工作。