firmware-base/vendor/qitech/Winder/experiments/FastAccelStepper/FastAccelStepper.cpp
2026-01-28 16:42:43 +01:00

80 lines
2.1 KiB
C++

#include "FastAccelStepper.h"
#include <TMCStepper.h>
using TMC2130_n::DRV_STATUS_t;
// As in StepperDemo for Motor 1 on AVR
//#define dirPinStepper 5
//#define enablePinStepper 6
//#define stepPinStepper 9 // OC1A in case of AVR
// As in StepperDemo for Motor 1 on ESP32
#define dirPinStepper 16
#define enablePinStepper 12
#define stepPinStepper 26
#define CS_PIN 5 // Chip select
FastAccelStepperEngine engine = FastAccelStepperEngine();
FastAccelStepper *stepper = NULL;
TMC2130Stepper driver(CS_PIN, 0.11f);
void setup() {
Serial.begin(115200);
SPI.begin();
// https://www.trinamic.com/fileadmin/assets/Support/AppNotes/AN002-stallGuard2.pdf
driver.begin();
driver.toff(20);
driver.blank_time(54);
driver.rms_current(1200);
driver.microsteps(64);
driver.en_pwm_mode(1); // Enable extremely quiet stepping
driver.TCOOLTHRS(0xFFFFF);
driver.seimin(true);
driver.semin(5);
driver.sgt(3);
engine.init();
stepper = engine.stepperConnectToPin(stepPinStepper);
if (stepper) {
stepper->setDirectionPin(dirPinStepper);
stepper->setEnablePin(enablePinStepper);
stepper->setAutoEnable(true);
// If auto enable/disable need delays, just add (one or both):
// stepper->setDelayToEnable(50);
// stepper->setDelayToDisable(1000);
stepper->setSpeedInUs(100); // the parameter is us/step !!!
stepper->setAcceleration(1000);
stepper->move(10000);
}
}
int callCount = 0;
void loop() {
static uint32_t last_time = 0;
uint32_t ms = millis();
if ((ms - last_time) > 100) { // run every 0.1s
callCount++;
last_time = ms;
DRV_STATUS_t drv_status{0};
drv_status.sr = driver.DRV_STATUS();
Serial.println(drv_status.otpw); // Overtemperatur warning (120°C pre-warning and 150°C thermal shutdown
Serial.print(drv_status.sg_result); // Stall Guard result
Serial.print(" ");
Serial.println(driver.cs2rms(drv_status.cs_actual), DEC); // mA currently consumed
}
if (callCount == 100) {
stepper->runBackward();
}
}