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

Dependencies:   TMCStepper mRotaryEncoder-os

Committer:
charly
Date:
Sun Mar 21 13:31:53 2021 +0000
Revision:
5:7f250f463aa2
Parent:
4:12bfa2c1729f
Child:
6:6ad7bc10ac20
Speed limit; Show direction on leds

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 5:7f250f463aa2 40 volatile bool enc_pressed = false; // Button of rotaryencoder was pressed
charly 5:7f250f463aa2 41 volatile bool enc_rotated = false; // rotary encoder was totaded left or right
charly 5:7f250f463aa2 42 volatile bool enc_action = false; // any change happened
charly 4:12bfa2c1729f 43 int lastGet;
charly 4:12bfa2c1729f 44 int thisGet;
charly 4:12bfa2c1729f 45
charly 4:12bfa2c1729f 46 //interrup-Handler for button on rotary-encoder
charly 4:12bfa2c1729f 47 void trigger_sw() {
charly 4:12bfa2c1729f 48 enc_pressed = true; // just set the flag, rest is done outside isr
charly 4:12bfa2c1729f 49 }
charly 4:12bfa2c1729f 50
charly 4:12bfa2c1729f 51 //interrup-Handler for rotary-encoder rotation
charly 4:12bfa2c1729f 52 void trigger_rotated() {
charly 4:12bfa2c1729f 53 enc_rotated = true; // just set the flag, rest is done outside isr
charly 4:12bfa2c1729f 54 }
charly 4:12bfa2c1729f 55
charly 0:3f4cfbeda9d3 56 // Assumes little endian
charly 0:3f4cfbeda9d3 57 void printBits(size_t const size, void const * const ptr)
charly 0:3f4cfbeda9d3 58 {
charly 0:3f4cfbeda9d3 59 unsigned char *b = (unsigned char*) ptr;
charly 0:3f4cfbeda9d3 60 unsigned char byte;
charly 0:3f4cfbeda9d3 61 int i, j;
charly 0:3f4cfbeda9d3 62 // puts("#");
charly 0:3f4cfbeda9d3 63 for (i = size-1; i >= 0; i--) {
charly 0:3f4cfbeda9d3 64 for (j = 7; j >= 0; j--) {
charly 0:3f4cfbeda9d3 65 byte = (b[i] >> j) & 1;
charly 0:3f4cfbeda9d3 66 printf("%u", byte);
charly 0:3f4cfbeda9d3 67 }
charly 0:3f4cfbeda9d3 68 }
charly 0:3f4cfbeda9d3 69 // puts("#");
charly 0:3f4cfbeda9d3 70 }
charly 0:3f4cfbeda9d3 71
charly 0:3f4cfbeda9d3 72 int main()
charly 0:3f4cfbeda9d3 73 {
charly 0:3f4cfbeda9d3 74 printf("\r\nConnected to mbed\r\n");
charly 4:12bfa2c1729f 75
charly 5:7f250f463aa2 76 //Intitiallize RotaryEncoder
charly 4:12bfa2c1729f 77 // call trigger_sw() when button of rotary-encoder is pressed
charly 4:12bfa2c1729f 78 wheel.attachSW(&trigger_sw);
charly 4:12bfa2c1729f 79 // call trigger_rot() when the shaft is rotaded left or right
charly 4:12bfa2c1729f 80 wheel.attachROT(&trigger_rotated);
charly 4:12bfa2c1729f 81 lastGet = 0;
charly 4:12bfa2c1729f 82 // set encrotated, so startup
charly 4:12bfa2c1729f 83 enc_rotated = true;
charly 5:7f250f463aa2 84 enc_action = true;
charly 5:7f250f463aa2 85 ledCW = 1;
charly 5:7f250f463aa2 86 ledCCW = 1;
charly 5:7f250f463aa2 87
charly 5:7f250f463aa2 88 // Initialize Stepper
charly 5:7f250f463aa2 89 printf("connecting to TMC-Module...\r\n");
charly 2:94c5b3f09463 90 stepper.begin(); // UART: Init SW UART (if selected) with default baudrate
charly 5:7f250f463aa2 91 printf("TMC-Version: %02X\r\n",stepper.version());
charly 2:94c5b3f09463 92 stepper.toff(3); // Enables driver in software - 3, 5 ????
charly 2:94c5b3f09463 93 stepper.rms_current(RMSCURRENT); // Set motor RMS current in mA / min 500 for 24V/speed:3000
charly 1:60419aa0c030 94 // 1110, 800
charly 5:7f250f463aa2 95 // working: 800 12V/0,6Amax, Speed up to 5200=4U/min
charly 5:7f250f463aa2 96
charly 0:3f4cfbeda9d3 97 stepper.microsteps(MICROSTEPS); // Set microsteps to 1:Fullstep ... 256: 1/256th
charly 1:60419aa0c030 98 stepper.en_spreadCycle(true); // Toggle spreadCycle on TMC2208/2209/2224: default false, true: much faster!!!!
charly 0:3f4cfbeda9d3 99 stepper.pwm_autoscale(true); // Needed for stealthChop
charly 0:3f4cfbeda9d3 100
charly 5:7f250f463aa2 101 uint32_t status = stepper.DRV_STATUS();
charly 5:7f250f463aa2 102 printf("DRV_STATUS(): "); printBits(sizeof(status),&status);printf("\r\n");
charly 5:7f250f463aa2 103
charly 5:7f250f463aa2 104 //bool shaft = false; //direction CW or CCW
charly 1:60419aa0c030 105
charly 0:3f4cfbeda9d3 106 while(1) {
charly 5:7f250f463aa2 107 /* Spped-UP/Down-Cycles
charly 0:3f4cfbeda9d3 108 // printf("TSTEP(): %i\r\n", stepper.TSTEP());
charly 0:3f4cfbeda9d3 109 uint32_t status = stepper.DRV_STATUS();
charly 0:3f4cfbeda9d3 110 printf("DRV_STATUS(): "); printBits(sizeof(status),&status);printf("\r\n");
charly 0:3f4cfbeda9d3 111 uint32_t ioin = stepper.IOIN();
charly 0:3f4cfbeda9d3 112 printf("IOIN(): "); printBits(sizeof(ioin),&ioin);printf("\r\n");
charly 0:3f4cfbeda9d3 113 // uint32_t otp = stepper.OTP_READ();
charly 0:3f4cfbeda9d3 114 // printf("OTP_READ(): ");printBits(sizeof(otp),&otp);printf("\r\n");
charly 0:3f4cfbeda9d3 115
charly 1:60419aa0c030 116 printf("VACTUAL(): %zu \r\n", stepper.VACTUAL());
charly 0:3f4cfbeda9d3 117 // increase
charly 1:60419aa0c030 118 uint32_t maxspeed = 3000; //max 3400 or 3000
charly 1:60419aa0c030 119 uint32_t actspeed = 0;
charly 0:3f4cfbeda9d3 120 while (actspeed < maxspeed) {
charly 0:3f4cfbeda9d3 121 actspeed += 200;
charly 1:60419aa0c030 122 if (actspeed > maxspeed) {
charly 1:60419aa0c030 123 actspeed = maxspeed;
charly 1:60419aa0c030 124 }
charly 3:209a9c414f54 125 printf("actspeed: %i",actspeed);
charly 0:3f4cfbeda9d3 126 stepper.VACTUAL(actspeed*MICROSTEPS);// Set Speed to value
charly 1:60419aa0c030 127 ThisThread::sleep_for(25ms); //wait
charly 0:3f4cfbeda9d3 128 }
charly 0:3f4cfbeda9d3 129 printf("VACTUAL(): %zu \r\n", stepper.VACTUAL());
charly 3:209a9c414f54 130 ThisThread::sleep_for(5s);
charly 0:3f4cfbeda9d3 131 // decrease
charly 0:3f4cfbeda9d3 132 maxspeed = 0;
charly 0:3f4cfbeda9d3 133 while (actspeed > maxspeed) {
charly 0:3f4cfbeda9d3 134 actspeed -= 200;
charly 1:60419aa0c030 135 if (actspeed < 0) {
charly 1:60419aa0c030 136 actspeed = 0;
charly 1:60419aa0c030 137 }
charly 3:209a9c414f54 138 printf("actspeed: %i",actspeed);
charly 0:3f4cfbeda9d3 139 stepper.VACTUAL(actspeed*MICROSTEPS);// Set Speed to value
charly 1:60419aa0c030 140 ThisThread::sleep_for(25ms); //wait
charly 0:3f4cfbeda9d3 141 }
charly 1:60419aa0c030 142
charly 1:60419aa0c030 143 // stepper.VACTUAL(400*MICROSTEPS);// Set Speed to value
charly 0:3f4cfbeda9d3 144 ThisThread::sleep_for(5s); //wait
charly 1:60419aa0c030 145 // inverse direction
charly 1:60419aa0c030 146 shaft = !shaft;
charly 1:60419aa0c030 147 stepper.shaft(shaft);
charly 2:94c5b3f09463 148 // Read Interace-Count
charly 2:94c5b3f09463 149 printf("IFCNT(): %zu \r\n",stepper.IFCNT());
charly 1:60419aa0c030 150 printf("...\r\n");
charly 4:12bfa2c1729f 151 */
charly 5:7f250f463aa2 152 ////// Control motor-speed by rotary-encoder
charly 5:7f250f463aa2 153
charly 4:12bfa2c1729f 154 // shaft has been rotated?
charly 4:12bfa2c1729f 155 if (enc_rotated) {
charly 4:12bfa2c1729f 156 enc_rotated = false;
charly 5:7f250f463aa2 157 enc_action = true;
charly 4:12bfa2c1729f 158 thisGet = wheel.Get();
charly 5:7f250f463aa2 159 if (thisGet*100 > MAXSPEED) { //on upper limit?
charly 5:7f250f463aa2 160 wheel.Set( MAXSPEED/100);
charly 5:7f250f463aa2 161 thisGet = wheel.Get();
charly 5:7f250f463aa2 162 }
charly 5:7f250f463aa2 163 if (thisGet*100 < MAXSPEED*(-1)) { //on lower limit?
charly 5:7f250f463aa2 164 wheel.Set( MAXSPEED*(-1)/100);
charly 5:7f250f463aa2 165 thisGet = wheel.Get();
charly 5:7f250f463aa2 166 }
charly 4:12bfa2c1729f 167 stepper.VACTUAL(thisGet*100*MICROSTEPS);// Set Speed to value
charly 4:12bfa2c1729f 168 printf("actspeed: %i\r\n",thisGet*100);
charly 5:7f250f463aa2 169
charly 4:12bfa2c1729f 170 }
charly 4:12bfa2c1729f 171 // Button pressed?
charly 4:12bfa2c1729f 172 if (enc_pressed) {
charly 4:12bfa2c1729f 173 enc_pressed = false;
charly 5:7f250f463aa2 174 enc_action = true;
charly 4:12bfa2c1729f 175 wheel.Set(0);
charly 4:12bfa2c1729f 176 thisGet = wheel.Get();
charly 4:12bfa2c1729f 177 stepper.VACTUAL(thisGet*100*MICROSTEPS);// Set Speed to value
charly 4:12bfa2c1729f 178 printf("actspeed: %i\r\n",thisGet*100);
charly 4:12bfa2c1729f 179
charly 4:12bfa2c1729f 180 }
charly 5:7f250f463aa2 181 // anything changed?
charly 5:7f250f463aa2 182 if (enc_action) {
charly 5:7f250f463aa2 183 enc_action = false;
charly 5:7f250f463aa2 184 // show direction of motor on leds
charly 5:7f250f463aa2 185 if (thisGet > 0) {
charly 5:7f250f463aa2 186 ledCW = 1;
charly 5:7f250f463aa2 187 ledCCW= 0;
charly 5:7f250f463aa2 188 }
charly 5:7f250f463aa2 189 if (thisGet < 0) {
charly 5:7f250f463aa2 190 ledCW = 0;
charly 5:7f250f463aa2 191 ledCCW= 1;
charly 5:7f250f463aa2 192 }
charly 5:7f250f463aa2 193 if (thisGet == 0) {
charly 5:7f250f463aa2 194 ledCW = 1;
charly 5:7f250f463aa2 195 ledCCW= 1;
charly 5:7f250f463aa2 196 }
charly 5:7f250f463aa2 197 }
charly 4:12bfa2c1729f 198 } // while 1
charly 0:3f4cfbeda9d3 199 }