microrobotics icon

SparkFun Brushless Motor Driver - 3-Phase (TMC6300)

microrobotics | PRO | 06/05/23 08:05:30 AM UTC | 0 ⭐ | 2486 👁️ | Never ⏰ | []
Arduino |

2.87 KB

|

None

|

0 👍

/

0 👎

/*
We will initialize the TMC6300 motor driver with the sensorless operation feature, and use stallGuard for stall detection. We will also enable features like spreadCycle, stealthChop, and coolStep, and configure some related parameters.
 
In this example, the driver is set up in sensorless mode. It checks for stalls every loop, and if it detects a stall, it will stop the motor, wait for a second, and then try to restart the motor.
 
Remember that the parameters used here are just examples and you should adjust them to suit your motor's needs. Always check the datasheets and technical documents for your specific motor and driver to make sure you're setting safe and appropriate values.
 
You can find the documentation for the TMC6300 library here: https://www.trinamic.com/fileadmin/assets/Products/ICs_Documents/TMC6300_Datasheet_V100.pdf
 
This code was written for the Arduino platform. If you're using a different platform or microcontroller, you may need to adjust the code to suit your needs. Always remember to be cautious when working with motors, as they can draw high currents that could damage your driver, motor, or microcontroller.
 
This code assumes the library for TMC6300 from Trinamic is installed, which contains all the necessary methods and definitions to communicate with the driver and control the motor. It's also assumed you're using the SPI interface.
*/
 
#include <SPI.h>
#include <TMC6300.h>
 
// Define pins
#define PIN_MOSI  11
#define PIN_MISO  12
#define PIN_SCK   13
#define PIN_CS    10
 
// Instantiate a TMC6300 instance
TMC6300Stepper driver(PIN_CS);
 
void setup() {
  // Initialize SPI
  SPI.begin();
  SPI.setClockDivider(SPI_CLOCK_DIV4);
 
  // Initialize driver
  driver.begin();
  
  // Enable and configure sensorless operation
  driver.S2VSA(3);  // Set sensorless amplifier voltage gain (1-3)
  driver.S2VSB(3);  // Set sensorless blanking time (1-3)
  
  // Set stall detection parameters
  driver.sgFilter(1);   // StallGuard filter enable
  driver.sgThreshold(5); // StallGuard threshold
  
  // Enable features
  driver.stealthChop(1); // Enable stealthChop
  driver.spreadCycle(1); // Enable spreadCycle
  
  // Configure coolStep (assumes the driver is in coolStep mode)
  driver.lowerSgThreshold(1); // Lower StallGuard threshold for coolStep
  driver.SGTHRS(1); // Set coolStep threshold
  driver.semin(5); // Minimum coolStep current
  driver.semax(2); // Maximum coolStep current
  driver.sedn(0b01); // coolStep current decrement speed
  driver.seup(0b01); // coolStep current increment speed
  
  // Set the motor to run at 1000 RPM
  driver.VACTUAL(1000);
}
 
void loop() {
  // Check for a stall
  if (driver.sgResult() < driver.sgThreshold()) {
    Serial.println("Motor stall detected!");
    driver.VACTUAL(0); // Stop the motor
    delay(1000);
    driver.VACTUAL(1000); // Try to restart the motor
  }
}
 

Comments