Testprogram for TMC2209-Library. Uses Speed-Control via VACTUAL instead of Step/Dir

Dependencies:   TMCStepper mRotaryEncoder-os

Committer:
charly
Date:
Mon Mar 22 17:46:39 2021 +0000
Revision:
6:6ad7bc10ac20
Parent:
5:7f250f463aa2
Child:
7:51cb60bf3e2d
Read DIAG-Pin

Who changed what in which revision?

UserRevisionLine numberNew contents of line
charly 0:3f4cfbeda9d3 1 #include "mbed.h"
charly 0:3f4cfbeda9d3 2 #include "platform/mbed_thread.h"
charly 2:94c5b3f09463 3 #include "TMCStepper.h"
charly 4:12bfa2c1729f 4 #include "mRotaryEncoder.h"
charly 2:94c5b3f09463 5
charly 2:94c5b3f09463 6 /*
charly 2:94c5b3f09463 7 Testprogram for TMCStepper-Library
charly 2:94c5b3f09463 8 TMCStepper based on https://github.com/teemuatlut/TMCStepper for Arduino
charly 2:94c5b3f09463 9 by https://github.com/teemuatlut
charly 2:94c5b3f09463 10 +++++
charly 2:94c5b3f09463 11 Tested with https://github.com/bigtreetech/BIGTREETECH-TMC2209-V1.2
charly 2:94c5b3f09463 12 */
charly 0:3f4cfbeda9d3 13
charly 0:3f4cfbeda9d3 14
charly 5:7f250f463aa2 15 DigitalOut ledCW(LED1); // Show totation clockwise
charly 5:7f250f463aa2 16 DigitalOut ledCCW(LED2); // Show rotation counterclockwise
charly 5:7f250f463aa2 17
charly 0:3f4cfbeda9d3 18 //Virtual serial port over USB with 15200 baud 8N1
charly 0:3f4cfbeda9d3 19 static BufferedSerial host(USBTX, USBRX,115200);
charly 0:3f4cfbeda9d3 20
charly 4:12bfa2c1729f 21 //mRotaryEncoder(PinName pinA, PinName pinB, PinName pinSW, PinMode pullMode=PullUp, int debounceTime_us=1000)
charly 5:7f250f463aa2 22 mRotaryEncoder wheel(p16, p17, p18,PullUp,3000); // default 1500
charly 4:12bfa2c1729f 23
charly 2:94c5b3f09463 24 // hardware parameters:
charly 0:3f4cfbeda9d3 25 // MOTOR Steps per Revolution ( 1/8 Microsteps, 200Steps per Rev / 1.8 degrees per FullStep)
charly 0:3f4cfbeda9d3 26 #define MSPR 1600
charly 0:3f4cfbeda9d3 27 // Gear Ratio
charly 0:3f4cfbeda9d3 28 #define GR 288
charly 0:3f4cfbeda9d3 29
charly 0:3f4cfbeda9d3 30 #define DRIVER_ADDRESS 0b00 // TMC2209 Driver address according to MS1 and MS2
charly 5:7f250f463aa2 31 #define R_SENSE 0.11f // R-Sense in OHM. Match to your driver
charly 2:94c5b3f09463 32 #define MICROSTEPS 128 // # of microsteps
charly 5:7f250f463aa2 33 #define RMSCURRENT 800 // RMS current of Stepper Coil in mA
charly 5:7f250f463aa2 34 #define MAXSPEED 5000 // Maximaum speed (5000 with RMS800 @12V/06Amax)
charly 0:3f4cfbeda9d3 35
charly 2:94c5b3f09463 36 // A TMCStepper-object with UART and given address and R-Sense
charly 0:3f4cfbeda9d3 37 //RX, TX, RS, Addr
charly 0:3f4cfbeda9d3 38 TMC2209Stepper stepper(p14, p13, R_SENSE, DRIVER_ADDRESS);
charly 0:3f4cfbeda9d3 39
charly 6:6ad7bc10ac20 40 InterruptIn diag(p21);
charly 6:6ad7bc10ac20 41
charly 5:7f250f463aa2 42 volatile bool enc_pressed = false; // Button of rotaryencoder was pressed
charly 5:7f250f463aa2 43 volatile bool enc_rotated = false; // rotary encoder was totaded left or right
charly 5:7f250f463aa2 44 volatile bool enc_action = false; // any change happened
charly 6:6ad7bc10ac20 45 volatile bool diag_event = false; // DIAG-Pin of TMC
charly 4:12bfa2c1729f 46 int lastGet;
charly 4:12bfa2c1729f 47 int thisGet;
charly 4:12bfa2c1729f 48
charly 4:12bfa2c1729f 49 //interrup-Handler for button on rotary-encoder
charly 4:12bfa2c1729f 50 void trigger_sw() {
charly 4:12bfa2c1729f 51 enc_pressed = true; // just set the flag, rest is done outside isr
charly 4:12bfa2c1729f 52 }
charly 4:12bfa2c1729f 53
charly 4:12bfa2c1729f 54 //interrup-Handler for rotary-encoder rotation
charly 4:12bfa2c1729f 55 void trigger_rotated() {
charly 4:12bfa2c1729f 56 enc_rotated = true; // just set the flag, rest is done outside isr
charly 4:12bfa2c1729f 57 }
charly 4:12bfa2c1729f 58
charly 6:6ad7bc10ac20 59 //interrup-Handler for TMC2209-DIAG-Pin
charly 6:6ad7bc10ac20 60 void trigger_diag() {
charly 6:6ad7bc10ac20 61 diag_event = true; // just set the flag, rest is done outside isr
charly 6:6ad7bc10ac20 62 }
charly 6:6ad7bc10ac20 63
charly 0:3f4cfbeda9d3 64 // Assumes little endian
charly 0:3f4cfbeda9d3 65 void printBits(size_t const size, void const * const ptr)
charly 0:3f4cfbeda9d3 66 {
charly 0:3f4cfbeda9d3 67 unsigned char *b = (unsigned char*) ptr;
charly 0:3f4cfbeda9d3 68 unsigned char byte;
charly 0:3f4cfbeda9d3 69 int i, j;
charly 0:3f4cfbeda9d3 70 // puts("#");
charly 0:3f4cfbeda9d3 71 for (i = size-1; i >= 0; i--) {
charly 0:3f4cfbeda9d3 72 for (j = 7; j >= 0; j--) {
charly 0:3f4cfbeda9d3 73 byte = (b[i] >> j) & 1;
charly 0:3f4cfbeda9d3 74 printf("%u", byte);
charly 0:3f4cfbeda9d3 75 }
charly 0:3f4cfbeda9d3 76 }
charly 0:3f4cfbeda9d3 77 // puts("#");
charly 0:3f4cfbeda9d3 78 }
charly 0:3f4cfbeda9d3 79
charly 0:3f4cfbeda9d3 80 int main()
charly 0:3f4cfbeda9d3 81 {
charly 0:3f4cfbeda9d3 82 printf("\r\nConnected to mbed\r\n");
charly 4:12bfa2c1729f 83
charly 5:7f250f463aa2 84 //Intitiallize RotaryEncoder
charly 4:12bfa2c1729f 85 // call trigger_sw() when button of rotary-encoder is pressed
charly 4:12bfa2c1729f 86 wheel.attachSW(&trigger_sw);
charly 4:12bfa2c1729f 87 // call trigger_rot() when the shaft is rotaded left or right
charly 4:12bfa2c1729f 88 wheel.attachROT(&trigger_rotated);
charly 4:12bfa2c1729f 89 lastGet = 0;
charly 6:6ad7bc10ac20 90 // set enc_rotated, so startup
charly 4:12bfa2c1729f 91 enc_rotated = true;
charly 5:7f250f463aa2 92 enc_action = true;
charly 5:7f250f463aa2 93 ledCW = 1;
charly 5:7f250f463aa2 94 ledCCW = 1;
charly 6:6ad7bc10ac20 95
charly 6:6ad7bc10ac20 96 diag.rise(&trigger_diag);
charly 5:7f250f463aa2 97
charly 5:7f250f463aa2 98 // Initialize Stepper
charly 5:7f250f463aa2 99 printf("connecting to TMC-Module...\r\n");
charly 2:94c5b3f09463 100 stepper.begin(); // UART: Init SW UART (if selected) with default baudrate
charly 5:7f250f463aa2 101 printf("TMC-Version: %02X\r\n",stepper.version());
charly 2:94c5b3f09463 102 stepper.toff(3); // Enables driver in software - 3, 5 ????
charly 2:94c5b3f09463 103 stepper.rms_current(RMSCURRENT); // Set motor RMS current in mA / min 500 for 24V/speed:3000
charly 1:60419aa0c030 104 // 1110, 800
charly 5:7f250f463aa2 105 // working: 800 12V/0,6Amax, Speed up to 5200=4U/min
charly 5:7f250f463aa2 106
charly 0:3f4cfbeda9d3 107 stepper.microsteps(MICROSTEPS); // Set microsteps to 1:Fullstep ... 256: 1/256th
charly 1:60419aa0c030 108 stepper.en_spreadCycle(true); // Toggle spreadCycle on TMC2208/2209/2224: default false, true: much faster!!!!
charly 0:3f4cfbeda9d3 109 stepper.pwm_autoscale(true); // Needed for stealthChop
charly 0:3f4cfbeda9d3 110
charly 6:6ad7bc10ac20 111 uint8_t gstat = stepper.GSTAT();
charly 6:6ad7bc10ac20 112 printf("GSTAT(): "); printBits(sizeof(gstat),&gstat);printf("\r\n");
charly 6:6ad7bc10ac20 113
charly 5:7f250f463aa2 114 uint32_t status = stepper.DRV_STATUS();
charly 5:7f250f463aa2 115 printf("DRV_STATUS(): "); printBits(sizeof(status),&status);printf("\r\n");
charly 5:7f250f463aa2 116
charly 6:6ad7bc10ac20 117 uint32_t ioin = stepper.IOIN();
charly 6:6ad7bc10ac20 118 printf("IOIN(): "); printBits(sizeof(ioin),&ioin);printf("\r\n");
charly 6:6ad7bc10ac20 119
charly 5:7f250f463aa2 120 //bool shaft = false; //direction CW or CCW
charly 1:60419aa0c030 121
charly 0:3f4cfbeda9d3 122 while(1) {
charly 5:7f250f463aa2 123 /* Spped-UP/Down-Cycles
charly 0:3f4cfbeda9d3 124 // printf("TSTEP(): %i\r\n", stepper.TSTEP());
charly 0:3f4cfbeda9d3 125 uint32_t status = stepper.DRV_STATUS();
charly 0:3f4cfbeda9d3 126 printf("DRV_STATUS(): "); printBits(sizeof(status),&status);printf("\r\n");
charly 0:3f4cfbeda9d3 127 uint32_t ioin = stepper.IOIN();
charly 0:3f4cfbeda9d3 128 printf("IOIN(): "); printBits(sizeof(ioin),&ioin);printf("\r\n");
charly 0:3f4cfbeda9d3 129 // uint32_t otp = stepper.OTP_READ();
charly 0:3f4cfbeda9d3 130 // printf("OTP_READ(): ");printBits(sizeof(otp),&otp);printf("\r\n");
charly 0:3f4cfbeda9d3 131
charly 1:60419aa0c030 132 printf("VACTUAL(): %zu \r\n", stepper.VACTUAL());
charly 0:3f4cfbeda9d3 133 // increase
charly 1:60419aa0c030 134 uint32_t maxspeed = 3000; //max 3400 or 3000
charly 1:60419aa0c030 135 uint32_t actspeed = 0;
charly 0:3f4cfbeda9d3 136 while (actspeed < maxspeed) {
charly 0:3f4cfbeda9d3 137 actspeed += 200;
charly 1:60419aa0c030 138 if (actspeed > maxspeed) {
charly 1:60419aa0c030 139 actspeed = maxspeed;
charly 1:60419aa0c030 140 }
charly 3:209a9c414f54 141 printf("actspeed: %i",actspeed);
charly 0:3f4cfbeda9d3 142 stepper.VACTUAL(actspeed*MICROSTEPS);// Set Speed to value
charly 1:60419aa0c030 143 ThisThread::sleep_for(25ms); //wait
charly 0:3f4cfbeda9d3 144 }
charly 0:3f4cfbeda9d3 145 printf("VACTUAL(): %zu \r\n", stepper.VACTUAL());
charly 3:209a9c414f54 146 ThisThread::sleep_for(5s);
charly 0:3f4cfbeda9d3 147 // decrease
charly 0:3f4cfbeda9d3 148 maxspeed = 0;
charly 0:3f4cfbeda9d3 149 while (actspeed > maxspeed) {
charly 0:3f4cfbeda9d3 150 actspeed -= 200;
charly 1:60419aa0c030 151 if (actspeed < 0) {
charly 1:60419aa0c030 152 actspeed = 0;
charly 1:60419aa0c030 153 }
charly 3:209a9c414f54 154 printf("actspeed: %i",actspeed);
charly 0:3f4cfbeda9d3 155 stepper.VACTUAL(actspeed*MICROSTEPS);// Set Speed to value
charly 1:60419aa0c030 156 ThisThread::sleep_for(25ms); //wait
charly 0:3f4cfbeda9d3 157 }
charly 1:60419aa0c030 158
charly 1:60419aa0c030 159 // stepper.VACTUAL(400*MICROSTEPS);// Set Speed to value
charly 0:3f4cfbeda9d3 160 ThisThread::sleep_for(5s); //wait
charly 1:60419aa0c030 161 // inverse direction
charly 1:60419aa0c030 162 shaft = !shaft;
charly 1:60419aa0c030 163 stepper.shaft(shaft);
charly 2:94c5b3f09463 164 // Read Interace-Count
charly 2:94c5b3f09463 165 printf("IFCNT(): %zu \r\n",stepper.IFCNT());
charly 1:60419aa0c030 166 printf("...\r\n");
charly 4:12bfa2c1729f 167 */
charly 5:7f250f463aa2 168 ////// Control motor-speed by rotary-encoder
charly 5:7f250f463aa2 169
charly 6:6ad7bc10ac20 170 // DIAG-PIN showed Error-Condition?
charly 6:6ad7bc10ac20 171 if (diag_event) {
charly 6:6ad7bc10ac20 172 diag_event = false;
charly 6:6ad7bc10ac20 173 printf("DIAG occured!\r\n");
charly 6:6ad7bc10ac20 174 gstat = stepper.GSTAT();
charly 6:6ad7bc10ac20 175 printf("GSTAT(): "); printBits(sizeof(gstat),&gstat);printf("\r\n");
charly 6:6ad7bc10ac20 176 status = stepper.DRV_STATUS();
charly 6:6ad7bc10ac20 177 printf("DRV_STATUS(): "); printBits(sizeof(status),&status);printf("\r\n");
charly 6:6ad7bc10ac20 178 //safty turn off friver
charly 6:6ad7bc10ac20 179 printf("Shutting Down Motordriver...\r\n");
charly 6:6ad7bc10ac20 180 stepper.toff(0);
charly 6:6ad7bc10ac20 181 status = stepper.DRV_STATUS();
charly 6:6ad7bc10ac20 182 printf("DRV_STATUS(): "); printBits(sizeof(status),&status);printf("\r\n");
charly 6:6ad7bc10ac20 183 ioin = stepper.IOIN();
charly 6:6ad7bc10ac20 184 printf("IOIN(): "); printBits(sizeof(ioin),&ioin);printf("\r\n");
charly 6:6ad7bc10ac20 185 printf("stopping programm - manual RESET required!!!!!!\r\n");
charly 6:6ad7bc10ac20 186 while (1) {};
charly 6:6ad7bc10ac20 187
charly 6:6ad7bc10ac20 188 }
charly 6:6ad7bc10ac20 189
charly 4:12bfa2c1729f 190 // shaft has been rotated?
charly 4:12bfa2c1729f 191 if (enc_rotated) {
charly 4:12bfa2c1729f 192 enc_rotated = false;
charly 5:7f250f463aa2 193 enc_action = true;
charly 4:12bfa2c1729f 194 thisGet = wheel.Get();
charly 5:7f250f463aa2 195 if (thisGet*100 > MAXSPEED) { //on upper limit?
charly 5:7f250f463aa2 196 wheel.Set( MAXSPEED/100);
charly 5:7f250f463aa2 197 thisGet = wheel.Get();
charly 5:7f250f463aa2 198 }
charly 5:7f250f463aa2 199 if (thisGet*100 < MAXSPEED*(-1)) { //on lower limit?
charly 5:7f250f463aa2 200 wheel.Set( MAXSPEED*(-1)/100);
charly 5:7f250f463aa2 201 thisGet = wheel.Get();
charly 5:7f250f463aa2 202 }
charly 4:12bfa2c1729f 203 stepper.VACTUAL(thisGet*100*MICROSTEPS);// Set Speed to value
charly 4:12bfa2c1729f 204 printf("actspeed: %i\r\n",thisGet*100);
charly 5:7f250f463aa2 205
charly 4:12bfa2c1729f 206 }
charly 4:12bfa2c1729f 207 // Button pressed?
charly 4:12bfa2c1729f 208 if (enc_pressed) {
charly 4:12bfa2c1729f 209 enc_pressed = false;
charly 5:7f250f463aa2 210 enc_action = true;
charly 4:12bfa2c1729f 211 wheel.Set(0);
charly 4:12bfa2c1729f 212 thisGet = wheel.Get();
charly 4:12bfa2c1729f 213 stepper.VACTUAL(thisGet*100*MICROSTEPS);// Set Speed to value
charly 4:12bfa2c1729f 214 printf("actspeed: %i\r\n",thisGet*100);
charly 4:12bfa2c1729f 215
charly 4:12bfa2c1729f 216 }
charly 5:7f250f463aa2 217 // anything changed?
charly 5:7f250f463aa2 218 if (enc_action) {
charly 5:7f250f463aa2 219 enc_action = false;
charly 5:7f250f463aa2 220 // show direction of motor on leds
charly 5:7f250f463aa2 221 if (thisGet > 0) {
charly 5:7f250f463aa2 222 ledCW = 1;
charly 5:7f250f463aa2 223 ledCCW= 0;
charly 5:7f250f463aa2 224 }
charly 5:7f250f463aa2 225 if (thisGet < 0) {
charly 5:7f250f463aa2 226 ledCW = 0;
charly 5:7f250f463aa2 227 ledCCW= 1;
charly 5:7f250f463aa2 228 }
charly 5:7f250f463aa2 229 if (thisGet == 0) {
charly 5:7f250f463aa2 230 ledCW = 1;
charly 5:7f250f463aa2 231 ledCCW= 1;
charly 5:7f250f463aa2 232 }
charly 5:7f250f463aa2 233 }
charly 4:12bfa2c1729f 234 } // while 1
charly 0:3f4cfbeda9d3 235 }