M5_TMC2130/M5_TMC2130.ino

256 lines
6.9 KiB
C++

// #define EN_PIN 17 // D1
// #define DIR_PIN 3 // D2
// #define STEP_PIN 1 // D3
// #define CS_PIN 16 // D8
// #define MOSI_PIN 23 // D7
// #define MISO_PIN 19 // D6
// #define SCK_PIN 18 // D5
/*
* You can control the rotation speed with
* 0 Stop
* 1 Resume
* + Speed up
* - Slow down
*/
#define MAX_SPEED 40 // In timer value
#define MIN_SPEED 1000
#define STALL_VALUE 0 // [-64..63]
// Note: You also have to connect GND, 5V and VM.
// A connection diagram can be found in the schematics.
#define EN_PIN 17 // D1
#define DIR_PIN 3 // D2
#define STEP_PIN 1 // D3
#define CS_PIN 16 // D8
#include <TMC2130Stepper.h>
#include <TMC2130Stepper_REGDEFS.h>
TMC2130Stepper driver = TMC2130Stepper(CS_PIN);
bool vsense;
uint16_t rms_current(uint8_t CS, float Rsense = 0.11)
{
return (float)(CS + 1) / 32.0 * (vsense ? 0.180 : 0.325) / (Rsense + 0.02) / 1.41421 * 1000;
}
void setup()
{
//init serial port
{
Serial.begin(250000); //init serial port and set baudrate
while (!Serial)
; //wait for serial port to connect (needed for Leonardo only)
Serial.println("\nStart...");
pinMode(EN_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
pinMode(CS_PIN, OUTPUT);
digitalWrite(EN_PIN, HIGH); //deactivate driver (LOW active)
digitalWrite(DIR_PIN, LOW); //LOW or HIGH
digitalWrite(STEP_PIN, LOW);
digitalWrite(CS_PIN, HIGH);
SPI.begin();
pinMode(MISO, INPUT_PULLUP);
}
//set TMC2130 config
{
driver.push();
driver.toff(3);
driver.tbl(1);
driver.hysteresis_start(4);
driver.hysteresis_end(-2);
driver.rms_current(600); // mA
driver.microsteps(16);
driver.diag1_stall(1);
driver.diag1_active_high(1);
driver.coolstep_min_speed(0xFFFFF); // 20bit max
driver.THIGH(0);
driver.semin(5);
driver.semax(2);
driver.sedn(0b01);
driver.sg_stall_value(STALL_VALUE);
}
// Set stepper interrupt
{
cli(); //stop interrupts
TCCR1A = 0; // set entire TCCR1A register to 0
TCCR1B = 0; // same for TCCR1B
TCNT1 = 0; //initialize counter value to 0
OCR1A = 256; // = (16*10^6) / (1*1024) - 1 (must be <65536)
// turn on CTC mode
TCCR1B |= (1 << WGM12);
// Set CS11 bits for 8 prescaler
TCCR1B |= (1 << CS11); // | (1 << CS10);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
sei(); //allow interrupts
}
//TMC2130 outputs on (LOW active)
digitalWrite(EN_PIN, LOW);
vsense = driver.vsense();
}
ISR(TIMER1_COMPA_vect)
{
PORTF |= 1 << 0;
PORTF &= ~(1 << 0);
}
void loop()
{
static uint32_t last_time = 0;
uint32_t ms = millis();
while (Serial.available() > 0)
{
int8_t read_byte = Serial.read();
if (read_byte == '0')
{
TIMSK1 &= ~(1 << OCIE1A);
digitalWrite(EN_PIN, HIGH);
}
else if (read_byte == '1')
{
TIMSK1 |= (1 << OCIE1A);
digitalWrite(EN_PIN, LOW);
}
else if (read_byte == '+')
if (OCR1A > MAX_SPEED)
OCR1A -= 20;
else if (read_byte == '-')
if (OCR1A < MIN_SPEED)
OCR1A += 20;
}
if ((ms - last_time) > 100) //run every 0.1s
{
last_time = ms;
uint32_t drv_status = driver.DRV_STATUS();
Serial.print("0 ");
Serial.print((drv_status & SG_RESULT_bm) >> SG_RESULT_bp, DEC);
Serial.print(" ");
Serial.println(rms_current((drv_status & CS_ACTUAL_bm) >> CS_ACTUAL_bp), DEC);
}
}
// bool dir = true;
// #include <TMC2130Stepper.h>
// TMC2130Stepper TMC2130 = TMC2130Stepper(EN_PIN, DIR_PIN, STEP_PIN, CS_PIN);
// void setup() {
// Serial.begin(9600);
// TMC2130.begin(); // Initiate pins and registeries
// TMC2130.SilentStepStick2130(600); // Set stepper current to 600mA
// TMC2130.stealthChop(1); // Enable extremely quiet stepping
// digitalWrite(EN_PIN, LOW);
// }
// void loop() {
// digitalWrite(STEP_PIN, HIGH);
// delayMicroseconds(10);
// digitalWrite(STEP_PIN, LOW);
// delayMicroseconds(10);
// uint32_t ms = millis();
// static uint32_t last_time = 0;
// if ((ms - last_time) > 2000) {
// if (dir) {
// Serial.println("Dir -> 0");
// TMC2130.shaft_dir(0);
// } else {
// Serial.println("Dir -> 1");
// TMC2130.shaft_dir(1);
// }
// dir = !dir;
// Serial.println(TMC2130.GCONF(), BIN);
// last_time = ms;
// }
// }
// bool dir = true;
// #define TMC2130DEBUG
// #include <TMC2130Stepper.h>
// // Soft SPI
// TMC2130Stepper driver = TMC2130Stepper(EN_PIN, DIR_PIN, STEP_PIN, CS_PIN, MOSI_PIN, MISO_PIN, SCK_PIN);
// // Hard SPI
// //TMC2130Stepper driver = TMC2130Stepper(EN_PIN, DIR_PIN, STEP_PIN, CS_PIN);
// void setup()
// {
// Serial.begin(9600);
// while (!Serial)
// ;
// Serial.println("Start...");
// driver.begin(); // Initiate pins and registeries
// driver.rms_current(1200); // Set stepper current to 600mA. The command is the same as command TMC2130.setCurrent(600, 0.11, 0.5);
// driver.microsteps(16);
// driver.stealthChop(1); // Enable extremely quiet stepping
// digitalWrite(EN_PIN, LOW);
// Serial.print("DRV_STATUS=0b");
// Serial.println(driver.DRV_STATUS(), BIN);
// }
// bool isKilled = false;
// void loop()
// {
// if (driver.checkOT())
// {
// if (!isKilled)
// {
// Serial.print("Overheat flag triggered: ");
// Serial.println(driver.getOTPW(), DEC);
// driver.TPOWERDOWN();
// isKilled = true;
// Serial.println("Program stopped");
// }
// else
// {
// delay(1000);
// }
// }
// else
// {
// digitalWrite(STEP_PIN, HIGH);
// delayMicroseconds(10);
// digitalWrite(STEP_PIN, LOW);
// delayMicroseconds(10);
// uint32_t ms = millis();
// static uint32_t last_time = 0;
// if ((ms - last_time) > 500)
// {
// if (dir)
// {
// Serial.println("Dir -> 0");
// driver.shaft_dir(0);
// }
// else
// {
// Serial.println("Dir -> 1");
// driver.shaft_dir(1);
// }
// Serial.print("OverTemperature: ");
// Serial.print(driver.getOTPW(), DEC);
// Serial.print(" MSTEP: ");
// Serial.print(driver.microsteps(), DEC);
// Serial.print(" DIR: ");
// Serial.println(driver.dir(), DEC);
// Serial.println("---");
// //Serial.println(driver.checkStatus());
// //driver.checkStatus();
// dir = !dir;
// last_time = ms;
// }
// }
// }