Compare commits

...

3 Commits

Author SHA1 Message Date
JonathanS 5ab406bd3c Fixed CoolStep 2019-01-01 21:09:14 +01:00
JonathanS 158ba22514 bunch of debugging stuff 2019-01-01 20:13:20 +01:00
JonathanS 5b8352fca1 Fix err in TPWMTHRS set 2019-01-01 20:13:04 +01:00
2 changed files with 147 additions and 45 deletions

View File

@ -340,7 +340,7 @@ uint8_t Trinamic_TMC2130::set_TPWMTHRS(uint32_t value)
data = value & TMC_TPWMTHRS_MASK;
write_REG(TMC_REG_TPOWERDOWN, data);
write_REG(TMC_REG_TPWMTHRS, data);
return _status;
}

View File

@ -26,14 +26,31 @@ v0.1 - it works
#include <Trinamic_TMC2130.h>
// pin configuration (this is the X-axis on a standard RAMPS 1.4)
#define CS_PIN 21
#define EN_PIN 18 //enable (CFG6)
#define DIR_PIN 19 //direction
#define STEP_PIN 20 //step
#define CS_PIN 7
#define EN_PIN 8 //enable (CFG6)
#define DIR_PIN 9 //direction
#define STEP_PIN 10 //step
Trinamic_TMC2130 myStepper(CS_PIN);
// hand-tuned constants for our application
const int8_t STALLGUARD_THRESHOLD = 10;
int8_t sgt = STALLGUARD_THRESHOLD;
int8_t irun = 10;
int8_t ihold = 10;
int8_t iholddelay = 10;
int16_t dc_time = 25;
int16_t dc_sg = 2;
void setup(){
Serial.begin(1500000);
while (!Serial);
// pins
@ -48,7 +65,7 @@ void setup(){
digitalWrite(EN_PIN, LOW); // enable driver
// stepper
myStepper.init();
myStepper.init();
Serial.print("REG_IOIN: ");
uint32_t ioin = 0;
@ -79,47 +96,54 @@ void setup(){
while (true);
}
chopconf = chopconf ^ 0x05;
chopconf = 0x0000;
myStepper.write_REG(TMC_REG_CHOPCONF, chopconf);
//myStepper.set_mres(64); // ({1,2,4,8,16,32,64,128,256}) number of microsteps
//myStepper.set_IHOLD_IRUN(31,31,5); // ([0-31],[0-31],[0-5]) sets all currents to maximum
//myStepper.set_I_scale_analog(1); // ({0,1}) 0: I_REF internal, 1: sets I_REF to AIN
//myStepper.set_tbl(1); // ([0-3]) set comparator blank time to 16, 24, 36 or 54 clocks, 1 or 2 is recommended
myStepper.set_toff(8); // ([0-15]) 0: driver disable, 1: use only withTBL>2, 2-15: off time setting during slow decay phase
myStepper.set_tbl(1);
myStepper.set_mres(128);
// myStepper.set_chm(2);
// myStepper.set_toff(8); // ([0-15]) 0: driver disable, 1: use only with TBL>2, 2-15: off time setting during slow decay phase
myStepper.set_hstrt(0);
myStepper.set_hend(13);
myStepper.set_hend(0x3 + -2);
myStepper.set_hstrt(4);
myStepper.set_mres(32);
// configure motor current
myStepper.set_IHOLD_IRUN(1,31,31);
myStepper.set_I_scale_analog(1);
myStepper.set_tbl(4);
// configure dcStep mode
myStepper.set_VDCMIN(1);
myStepper.set_DCCTRL(50, 10);
//myStepper.set_IHOLD_IRUN(1,31,31);
myStepper.set_IHOLD_IRUN(ihold,irun,iholddelay);
//myStepper.set_freewheel(01);
//myStepper.set_I_scale_analog(1); // use external Aref
// configure coolStep
myStepper.set_semin(4); // semin*32 = 128
myStepper.set_semax(3); // (semin + semax + 1)*32 = 256
myStepper.set_seimin(1); // 1/4 of IRUN
myStepper.set_TCOOLTHRS(0xFFFFF);
myStepper.set_THIGH(100);
myStepper.set_TPWMTHRS(1000);
//myStepper.set_sedn(0b01);
// configure dcStep mode
myStepper.set_vhighchm(1);
myStepper.set_vhighfs(1);
myStepper.set_sgt(127);
myStepper.set_TCOOLTHRS(1);
myStepper.set_TPWMTHRS(1);
myStepper.set_VDCMIN(50);
myStepper.set_DCCTRL(dc_time, dc_sg);
myStepper.set_toff(8); // ([0-15]) 0: driver disable, 1: use only with TBL>2, 2-15: off time setting during slow decay phase
// configure StallGuard
myStepper.set_sfilt(1);
myStepper.set_sgt(STALLGUARD_THRESHOLD);
@ -130,36 +154,111 @@ void setup(){
void loop(){
// make a step
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(42);
delayMicroseconds(84);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(42);
delayMicroseconds(84);
static int sometimes = 0;
if (sometimes++ > 100) {
if (sometimes++ > 20) {
sometimes = 0;
int32_t gstat;
myStepper.read_REG(TMC_REG_GSTAT, &gstat);
uint32_t drv_status = 0;
myStepper.read_REG(TMC_REG_DRV_STATUS, &drv_status);
uint32_t stallguard = drv_status & 0x1ff;
uint32_t current = (drv_status >> 16) & 0x1f;
if (gstat || (drv_status >> 24 & 0x0F)) {
Serial.print("ALARM: DRV_ERR=");
Serial.print((drv_status >> 24 & 0x0F), HEX);
}
int32_t lost_steps;
myStepper.read_REG(TMC_REG_LOST_STEPS, &lost_steps);
myStepper.read_REG(TMC_REG_LOST_STEPS, &lost_steps);
uint32_t tstep;
myStepper.read_REG(TMC_REG_TSTEP, &tstep);
uint8_t sgflag = (drv_status >> 24) & 1;
if (sgflag) Serial.println("SG STOP!!!");
static int32_t last_lost_steps = 0;
Serial.print("Lost Steps: ");
Serial.print(lost_steps);
Serial.print(" Current: ");
Serial.print(current);
Serial.print(" TSTEP=");
Serial.print(tstep);
Serial.print(" SGFLAG=");
Serial.print(sgflag);
Serial.print(" Stallguard =");
Serial.print(stallguard);
/*
for (int i = 0; i < 64; i++) {
Serial.print(stallguard * 64 / 512 >= i ? "|" : " ");
}
* */
Serial.print("\r");
if (Serial.available()) {
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; }
else if (read_byte == 'r') { sgt++; myStepper.set_sgt(sgt); }
else if (read_byte == 'f') { sgt--; myStepper.set_sgt(sgt); }
else if (read_byte == 'q') { ihold++; myStepper.set_IHOLD_IRUN(ihold,irun,iholddelay); }
else if (read_byte == 'a') { ihold--; myStepper.set_IHOLD_IRUN(ihold,irun,iholddelay); }
else if (read_byte == 'w') { irun++; myStepper.set_IHOLD_IRUN(ihold,irun,iholddelay); }
else if (read_byte == 's') { irun--; myStepper.set_IHOLD_IRUN(ihold,irun,iholddelay); }
else if (read_byte == 'e') { iholddelay++; myStepper.set_IHOLD_IRUN(ihold,irun,iholddelay); }
else if (read_byte == 'd') { iholddelay--; myStepper.set_IHOLD_IRUN(ihold,irun,iholddelay); }
else if (read_byte == 't') { dc_time++; myStepper.set_DCCTRL(dc_time, dc_sg); }
else if (read_byte == 'g') { dc_time--; myStepper.set_DCCTRL(dc_time, dc_sg); }
else if (read_byte == 'z') { dc_sg++; myStepper.set_DCCTRL(dc_time, dc_sg); }
else if (read_byte == 'h') { dc_sg--; myStepper.set_DCCTRL(dc_time, dc_sg); }
}
const int STEP_THRESHOLD = 5;
const int DIRCHANGE_HOLDOFF = 2;
static int dirchange_timeout = DIRCHANGE_HOLDOFF;
if ((lost_steps >= last_lost_steps + STEP_THRESHOLD) || (lost_steps <= last_lost_steps - STEP_THRESHOLD) ) {
/*
if (stallguard < 1) {
//if ((lost_steps >= last_lost_steps + STEP_THRESHOLD) || (lost_steps <= last_lost_steps - STEP_THRESHOLD) ) {
if (--dirchange_timeout < 0) {
Serial.print("Lost Steps: ");
Serial.println(lost_steps);
Serial.print("Last Lost Steps: ");
Serial.println(lost_steps);
@ -167,10 +266,13 @@ void loop(){
Serial.println(dirchange_timeout);
digitalWrite(DIR_PIN, !digitalRead(DIR_PIN));
delay(2000);
last_lost_steps = lost_steps;
dirchange_timeout = DIRCHANGE_HOLDOFF;
}
}
* */
}
}