Testprogram for TMC2209-Library. Uses Speed-Control via VACTUAL instead of Step/Dir
Dependencies: TMCStepper mRotaryEncoder-os
main.cpp
- Committer:
- charly
- Date:
- 2021-03-18
- Revision:
- 4:12bfa2c1729f
- Parent:
- 3:209a9c414f54
- Child:
- 5:7f250f463aa2
File content as of revision 4:12bfa2c1729f:
#include "mbed.h" #include "platform/mbed_thread.h" #include "TMCStepper.h" #include "mRotaryEncoder.h" /* Testprogram for TMCStepper-Library TMCStepper based on https://github.com/teemuatlut/TMCStepper for Arduino by https://github.com/teemuatlut +++++ Tested with https://github.com/bigtreetech/BIGTREETECH-TMC2209-V1.2 */ DigitalOut ledDir(LED2); //Virtual serial port over USB with 15200 baud 8N1 static BufferedSerial host(USBTX, USBRX,115200); //mRotaryEncoder(PinName pinA, PinName pinB, PinName pinSW, PinMode pullMode=PullUp, int debounceTime_us=1000) mRotaryEncoder wheel(p16, p17, p18,PullUp,1500); // hardware parameters: // MOTOR Steps per Revolution ( 1/8 Microsteps, 200Steps per Rev / 1.8 degrees per FullStep) #define MSPR 1600 // Gear Ratio #define GR 288 #define DRIVER_ADDRESS 0b00 // TMC2209 Driver address according to MS1 and MS2 #define R_SENSE 0.11f // R-Sense in OHM.Match to your driver #define MICROSTEPS 128 // # of microsteps #define RMSCURRENT 600 // RMS current of Stepper Coil in mA // A TMCStepper-object with UART and given address and R-Sense //RX, TX, RS, Addr TMC2209Stepper stepper(p14, p13, R_SENSE, DRIVER_ADDRESS); bool enc_pressed = false; // Button of rotaryencoder was pressed bool enc_rotated = false; // rotary encoder was totaded left or right int lastGet; int thisGet; //interrup-Handler for button on rotary-encoder void trigger_sw() { enc_pressed = true; // just set the flag, rest is done outside isr } //interrup-Handler for rotary-encoder rotation void trigger_rotated() { enc_rotated = true; // just set the flag, rest is done outside isr } // Assumes little endian void printBits(size_t const size, void const * const ptr) { unsigned char *b = (unsigned char*) ptr; unsigned char byte; int i, j; // puts("#"); for (i = size-1; i >= 0; i--) { for (j = 7; j >= 0; j--) { byte = (b[i] >> j) & 1; printf("%u", byte); } } // puts("#"); } int main() { printf("\r\nConnected to mbed\r\n"); //Int-Handler for RotaryEncoder // call trigger_sw() when button of rotary-encoder is pressed wheel.attachSW(&trigger_sw); // call trigger_rot() when the shaft is rotaded left or right wheel.attachROT(&trigger_rotated); lastGet = 0; // set encrotated, so startup enc_rotated = true; stepper.begin(); // UART: Init SW UART (if selected) with default baudrate stepper.toff(3); // Enables driver in software - 3, 5 ???? stepper.rms_current(RMSCURRENT); // Set motor RMS current in mA / min 500 for 24V/speed:3000 // 1110, 800 stepper.microsteps(MICROSTEPS); // Set microsteps to 1:Fullstep ... 256: 1/256th stepper.en_spreadCycle(true); // Toggle spreadCycle on TMC2208/2209/2224: default false, true: much faster!!!! stepper.pwm_autoscale(true); // Needed for stealthChop printf("TMC-Version: %02X\r\n",stepper.version()); bool shaft = false; //direction CW or CCW while(1) { /* // printf("TSTEP(): %i\r\n", stepper.TSTEP()); uint32_t status = stepper.DRV_STATUS(); printf("DRV_STATUS(): "); printBits(sizeof(status),&status);printf("\r\n"); uint32_t ioin = stepper.IOIN(); printf("IOIN(): "); printBits(sizeof(ioin),&ioin);printf("\r\n"); // uint32_t otp = stepper.OTP_READ(); // printf("OTP_READ(): ");printBits(sizeof(otp),&otp);printf("\r\n"); printf("VACTUAL(): %zu \r\n", stepper.VACTUAL()); // increase uint32_t maxspeed = 3000; //max 3400 or 3000 uint32_t actspeed = 0; while (actspeed < maxspeed) { actspeed += 200; if (actspeed > maxspeed) { actspeed = maxspeed; } printf("actspeed: %i",actspeed); stepper.VACTUAL(actspeed*MICROSTEPS);// Set Speed to value ThisThread::sleep_for(25ms); //wait } printf("VACTUAL(): %zu \r\n", stepper.VACTUAL()); ThisThread::sleep_for(5s); // decrease maxspeed = 0; while (actspeed > maxspeed) { actspeed -= 200; if (actspeed < 0) { actspeed = 0; } printf("actspeed: %i",actspeed); stepper.VACTUAL(actspeed*MICROSTEPS);// Set Speed to value ThisThread::sleep_for(25ms); //wait } // stepper.VACTUAL(400*MICROSTEPS);// Set Speed to value ThisThread::sleep_for(5s); //wait // inverse direction shaft = !shaft; stepper.shaft(shaft); // Read Interace-Count printf("IFCNT(): %zu \r\n",stepper.IFCNT()); printf("...\r\n"); */ // shaft has been rotated? if (enc_rotated) { enc_rotated = false; thisGet = wheel.Get(); stepper.VACTUAL(thisGet*100*MICROSTEPS);// Set Speed to value printf("actspeed: %i\r\n",thisGet*100); } // Button pressed? if (enc_pressed) { enc_pressed = false; wheel.Set(0); thisGet = wheel.Get(); stepper.VACTUAL(thisGet*100*MICROSTEPS);// Set Speed to value printf("actspeed: %i\r\n",thisGet*100); } } // while 1 }