├── README.md └── Trinamic_TMC2130 ├── Trinamic_TMC2130.cpp ├── Trinamic_TMC2130.h ├── Trinamic_TMC2130_registers.h ├── examples ├── configuration_tool │ └── configuration_tool.ino └── getting_started │ └── getting_started.ino ├── library.properties └── license.txt /README.md: -------------------------------------------------------------------------------- 1 | # Trinamic TMC2130 Arduino library 2 | This library makes it easy to configure the Trinamic TMC2130 stepper motor driver found on Watterott's "ludicrous" version of the [SilentStepStick motor driver](http://www.watterott.com/de/SilentStepStick-TMC2130), which has it's repository [here](https://github.com/watterott/SilentStepStick). It's also used in my [Marlin Fork](https://github.com/makertum/Marlin), which gets you up and running if you actually want to use these beasts in a 3D-printer-like machine. 3 | 4 | ## Features 5 | - [x] Basic status readings 6 | - [x] All methods follow the naming convention in the [datasheet](http://www.trinamic.com/_articles/products/integrated-circuits/tmc2130/_datasheet/TMC2130_datasheet.pdf). 7 | - [x] All configurable parameters implemented 8 | 9 | ## To do 10 | - [ ] Full status report 11 | - [ ] Some readable parameters are missing 12 | 13 | ## How to use 14 | - Please check out the example sketches for further information. 15 | - The [datasheet](http://www.trinamic.com/_articles/products/integrated-circuits/tmc2130/_datasheet/TMC2130_datasheet.pdf) contains a quick start guide 16 | 17 | ## Status methods (return boolean status information) 18 | 19 | boolean isReset(); 20 | boolean isError(); 21 | boolean isStallguard(); 22 | boolean isStandstill(); 23 | 24 | ## Methods 25 | ### Note 26 | All methods follow the naming convention set_ respectively get_ and return the SPI status flags or the requested parameter. 27 | 28 | All methods expect the encoding stated in the datasheet, with the following exceptions: 29 | 30 | - `set_mres()` sets the microstepping resolution and expects the integer values 1, 2, 4, 8, 16, 32, 64, 128, 256 e.g. `set_mres(128)` 31 | - `set_IHOLD_IRUN()` sets the holding current, running current and holding delay, e.g. `set_IHOLD_IRUN(31,31,15)` 32 | - `set_MSLUTSTART()` sets `start_sin` and `start_sin90` 33 | - `set_DCCTRL()` sets the `dc_time` and `dc_sg` 34 | - `set_XDIRECT()` features an alias that lets you pass the currents for `coil_a` and `coil_b` as 16 bit signed integers (the range is still +- 254, though) e.e. `set_XDIRECT(254,254)` 35 | 36 | ### Configuration Methods (write configuration parameters to the driver) 37 | 38 | uint8_t set_I_scale_analog(uint8_t value); 39 | uint8_t set_internal_Rsense(uint8_t value); 40 | uint8_t set_en_pwm_mode(uint8_t value); 41 | uint8_t set_enc_commutation(uint8_t value); 42 | uint8_t set_shaft(uint8_t value); 43 | uint8_t set_diag0_error(uint8_t value); 44 | uint8_t set_diag0_otpw(uint8_t value); 45 | uint8_t set_diag0_stall(uint8_t value); 46 | uint8_t set_diag1_stall(uint8_t value); 47 | uint8_t set_diag1_index(uint8_t value); 48 | uint8_t set_diag1_onstate(uint8_t value); 49 | uint8_t set_diag1_steps_skipped(uint8_t value); 50 | uint8_t set_diag0_int_pushpull(uint8_t value); 51 | uint8_t set_diag1_int_pushpull(uint8_t value); 52 | uint8_t set_small_hysteresis(uint8_t value); 53 | uint8_t set_stop_enable(uint8_t value); 54 | uint8_t set_direct_mode(uint8_t value); 55 | 56 | uint8_t set_IHOLD_IRUN(uint8_t ihold, uint8_t irun, uint8_t iholddelay); 57 | uint8_t set_TPOWERDOWN(uint8_t value); 58 | uint32_t get_TSTEP(); 59 | uint8_t set_TPWMTHRS(uint32_t value); 60 | uint8_t set_TCOOLTHRS(uint32_t value); 61 | uint8_t set_THIGH(uint32_t value); 62 | uint8_t set_XDIRECT(int32_t value); 63 | int32_t get_XDIRECT(); 64 | uint8_t set_VDCMIN(int32_t value); 65 | 66 | uint8_t set_MSLUT0(uint32_t value); 67 | uint8_t set_MSLUT1(uint32_t value); 68 | uint8_t set_MSLUT2(uint32_t value); 69 | uint8_t set_MSLUT3(uint32_t value); 70 | uint8_t set_MSLUT4(uint32_t value); 71 | uint8_t set_MSLUT5(uint32_t value); 72 | uint8_t set_MSLUT6(uint32_t value); 73 | uint8_t set_MSLUT7(uint32_t value); 74 | uint8_t set_MSLUTSEL(uint32_t value); 75 | uint8_t set_MSLUTSTART(uint8_t start_sin, uint8_t start_sin90); 76 | uint16_t get_MSCNT(); 77 | int32_t get_MSCURACT(); 78 | 79 | uint8_t set_dedge(uint8_t value); 80 | uint8_t set_diss2g(uint8_t value); 81 | uint8_t set_intpol(uint8_t value); 82 | uint16_t set_mres(uint8_t value); 83 | uint8_t set_sync(uint8_t value); 84 | uint8_t set_vhighchm(uint8_t value); 85 | uint8_t set_vhighfs(uint8_t value); 86 | uint8_t set_vsense(uint8_t value); 87 | uint8_t set_tbl(uint8_t value); 88 | uint8_t set_chm(uint8_t value); 89 | uint8_t set_rndtf(uint8_t value); 90 | uint8_t set_disfdcc(uint8_t value); 91 | uint8_t set_fd(uint8_t value); 92 | uint8_t set_hend(uint8_t value); 93 | uint8_t set_hstrt(uint8_t value); 94 | uint8_t set_toff(uint8_t value); 95 | uint8_t set_sfilt(uint8_t value); 96 | uint8_t set_sgt(uint8_t value); 97 | uint8_t set_seimin(uint8_t value); 98 | uint8_t set_sedn(uint8_t value); 99 | uint8_t set_semax(uint8_t value); 100 | uint8_t set_seup(uint8_t value); 101 | uint8_t set_semin(uint8_t value); 102 | 103 | uint8_t set_DCCTRL(uint16_t dc_time, uint16_t dc_sg); 104 | 105 | uint8_t set_freewheel(uint8_t value); 106 | uint8_t set_pwm_symmetric(uint8_t value); 107 | uint8_t set_pwm_autoscale(uint8_t value); 108 | uint8_t set_pwm_freq(uint8_t value); 109 | uint8_t set_PWM_GRAD(uint8_t value); 110 | uint8_t set_PWM_AMPL(uint8_t value); 111 | 112 | uint8_t set_ENCM_CTRL(uint8_t value); 113 | 114 | ## Further methods (reading information from driver and helper functions) 115 | 116 | uint8_t read_STAT(); 117 | uint8_t read_REG( uint8_t address , uint32_t *data ); 118 | uint8_t write_REG( uint8_t address, uint32_t data ); 119 | uint8_t alter_REG(uint8_t address, uint32_t data, uint32_t mask); 120 | 121 | uint8_t set_GCONF(uint8_t bit, uint8_t value); 122 | uint8_t set_CHOPCONF(uint8_t position, uint8_t value); 123 | uint8_t alter_COOLCONF(uint32_t data, uint32_t mask); 124 | uint8_t set_COOLCONF(uint8_t position, uint8_t value); 125 | uint8_t alter_PWMCONF(uint32_t data, uint32_t mask); 126 | uint8_t set_PWMCONF(uint8_t position, uint8_t value); 127 | 128 | ## FAQ 129 | 130 | ### Why? 131 | - why not? 132 | 133 | ### Can I run my RepRap with this? 134 | - yes, just install the library and download the [Marlin Fork](https://github.com/makertum/Marlin) 135 | 136 | ## Troubleshooting 137 | 138 | ### Why doesn't it work 139 | - If you're using the SilentStepsStick driver, did you `myStepper.set_I_scale_analog(1)`? 140 | - Did you specify `myStepper.set_tbl(1)` and `myStepper.set_toff(8)` (example values)? 141 | - Did you specify a motor current `myStepper.set_IHOLD_IRUN(31,31,5);`? 142 | 143 | ## Disclaimer / License 144 | This is a work in progress. Any suggestions are heavily welcome. All scripts in this repository are licensed under the GNU Affero General Public License, version 3. Created by Moritz Walter 2016. 145 | -------------------------------------------------------------------------------- /Trinamic_TMC2130/Trinamic_TMC2130.cpp: -------------------------------------------------------------------------------- 1 | /**************************************************************************/ 2 | /*! 3 | @file Trinamic_TMC2130.cpp 4 | @author Moritz Walter 5 | @license GPLv3 (see license.txt) 6 | 7 | SPI configuration tool for Trinamic TMC2130 Motor Drivers 8 | 9 | @section HISTORY 10 | 11 | v0.1 - it works 12 | */ 13 | /**************************************************************************/ 14 | #if ARDUINO >= 100 15 | #include "Arduino.h" 16 | #else 17 | #include "WProgram.h" 18 | #endif 19 | 20 | #include 21 | 22 | #include "Trinamic_TMC2130.h" 23 | #include "Trinamic_TMC2130_registers.h" 24 | 25 | Trinamic_TMC2130::Trinamic_TMC2130(uint8_t csPin) 26 | { 27 | _csPin=csPin; 28 | _status=0; 29 | _debug=""; 30 | } 31 | 32 | // initialize the driver with its CS/SS pin 33 | void Trinamic_TMC2130::init() { 34 | pinMode(_csPin, OUTPUT); 35 | digitalWrite(_csPin, HIGH); 36 | init_SPI(); 37 | read_STAT(); 38 | } 39 | 40 | // initialize SPI 41 | void Trinamic_TMC2130::init_SPI() { 42 | SPI.setDataMode(TMC_SPI_DATA_MODE); 43 | SPI.setBitOrder(TMC_SPI_BIT_ORDER); 44 | SPI.setClockDivider(TMC_SPI_CLOCK_DIVIDER); 45 | SPI.begin(); 46 | } 47 | 48 | // read status 49 | uint8_t Trinamic_TMC2130::read_STAT() 50 | { 51 | init_SPI(); 52 | digitalWrite(_csPin, LOW); 53 | 54 | // read address 55 | _status = SPI.transfer(0x00); 56 | 57 | // flush 4 bytes 58 | for(int i=0;i<4;i++){ 59 | SPI.transfer(0x00); 60 | } 61 | 62 | digitalWrite(_csPin, HIGH); 63 | 64 | return _status; 65 | } 66 | 67 | // read a register 68 | uint8_t Trinamic_TMC2130::read_REG(uint8_t address, uint32_t *data) 69 | { 70 | init_SPI(); 71 | digitalWrite(_csPin, LOW); 72 | 73 | // read address 74 | _status = SPI.transfer(address&~TMC_WRITE); 75 | 76 | // flush 4 bytes 77 | for(int i=0;i<4;i++){ 78 | SPI.transfer(0x00); 79 | } 80 | 81 | digitalWrite(_csPin, HIGH); 82 | // restart transmission 83 | digitalWrite(_csPin, LOW); 84 | 85 | // read address 86 | _status = SPI.transfer(address&~TMC_WRITE); 87 | 88 | // retrieve data 89 | *data = SPI.transfer(0x00)&0xFF; 90 | *data <<=8; 91 | *data |= SPI.transfer(0x00)&0xFF; 92 | *data <<=8; 93 | *data |= SPI.transfer(0x00)&0xFF; 94 | *data <<=8; 95 | *data |= SPI.transfer(0x00)&0xFF; 96 | 97 | digitalWrite(_csPin, HIGH); 98 | 99 | return _status; 100 | } 101 | 102 | // write to a register 103 | uint8_t Trinamic_TMC2130::write_REG(uint8_t address, uint32_t data) 104 | { 105 | digitalWrite(_csPin, LOW); 106 | 107 | // write address 108 | _status = SPI.transfer(address|TMC_WRITE); 109 | 110 | // write data 111 | SPI.transfer((data>>24UL)&0xFF); 112 | SPI.transfer((data>>16UL)&0xFF); 113 | SPI.transfer((data>> 8UL)&0xFF); 114 | SPI.transfer((data>> 0UL)&0xFF); 115 | 116 | digitalWrite(_csPin, HIGH); 117 | 118 | return _status; 119 | } 120 | 121 | // alter a register using a bitmask 122 | uint8_t Trinamic_TMC2130::alter_REG(uint8_t address, uint32_t data, uint32_t mask) 123 | { 124 | uint32_t oldData, newData; 125 | 126 | read_REG( address, &oldData ); 127 | 128 | newData = ( oldData&~mask ) | ( data&mask ); 129 | 130 | write_REG( address, newData ); 131 | 132 | return _status; 133 | } 134 | 135 | // set single bits in the GCONF register 136 | uint8_t Trinamic_TMC2130::set_GCONF(uint8_t position, uint8_t value) 137 | { 138 | alter_REG(TMC_REG_GCONF, uint32_t(value)<= 100 18 | #include "Arduino.h" 19 | #else 20 | #include "WProgram.h" 21 | #endif 22 | 23 | #include 24 | 25 | #include "Trinamic_TMC2130_registers.h" 26 | 27 | class Trinamic_TMC2130{ 28 | public: 29 | Trinamic_TMC2130(uint8_t csPin); 30 | void init(); 31 | void init_SPI(); 32 | 33 | uint8_t read_STAT(); 34 | uint8_t read_REG( uint8_t address , uint32_t *data ); 35 | uint8_t write_REG( uint8_t address, uint32_t data ); 36 | uint8_t alter_REG(uint8_t address, uint32_t data, uint32_t mask); 37 | 38 | uint8_t set_GCONF(uint8_t bit, uint8_t value); 39 | uint8_t set_I_scale_analog(uint8_t value); 40 | uint8_t set_internal_Rsense(uint8_t value); 41 | uint8_t set_en_pwm_mode(uint8_t value); 42 | uint8_t set_enc_commutation(uint8_t value); 43 | uint8_t set_shaft(uint8_t value); 44 | uint8_t set_diag0_error(uint8_t value); 45 | uint8_t set_diag0_otpw(uint8_t value); 46 | uint8_t set_diag0_stall(uint8_t value); 47 | uint8_t set_diag1_stall(uint8_t value); 48 | uint8_t set_diag1_index(uint8_t value); 49 | uint8_t set_diag1_onstate(uint8_t value); 50 | uint8_t set_diag1_steps_skipped(uint8_t value); 51 | uint8_t set_diag0_int_pushpull(uint8_t value); 52 | uint8_t set_diag1_int_pushpull(uint8_t value); 53 | uint8_t set_small_hysteresis(uint8_t value); 54 | uint8_t set_stop_enable(uint8_t value); 55 | uint8_t set_direct_mode(uint8_t value); 56 | //uint8_t test_mode(uint8_t value); 57 | 58 | uint8_t set_IHOLD_IRUN(uint8_t ihold, uint8_t irun, uint8_t iholddelay); 59 | uint8_t set_TPOWERDOWN(uint8_t value); 60 | uint32_t get_TSTEP(); 61 | uint8_t set_TPWMTHRS(uint32_t value); 62 | uint8_t set_TCOOLTHRS(uint32_t value); 63 | uint8_t set_THIGH(uint32_t value); 64 | uint8_t set_XDIRECT(uint32_t value); 65 | uint8_t set_XDIRECT(int16_t coil_a, int16_t coil_b); 66 | int32_t get_XDIRECT(); 67 | uint8_t set_VDCMIN(int32_t value); 68 | 69 | uint8_t set_MSLUT0(uint32_t value); 70 | uint8_t set_MSLUT1(uint32_t value); 71 | uint8_t set_MSLUT2(uint32_t value); 72 | uint8_t set_MSLUT3(uint32_t value); 73 | uint8_t set_MSLUT4(uint32_t value); 74 | uint8_t set_MSLUT5(uint32_t value); 75 | uint8_t set_MSLUT6(uint32_t value); 76 | uint8_t set_MSLUT7(uint32_t value); 77 | uint8_t set_MSLUTSEL(uint32_t value); 78 | uint8_t set_MSLUTSTART(uint8_t start_sin, uint8_t start_sin90); 79 | uint16_t get_MSCNT(); 80 | int32_t get_MSCURACT(); 81 | 82 | uint8_t set_CHOPCONF(uint8_t position, uint8_t value); 83 | uint8_t set_dedge(uint8_t value); 84 | uint8_t set_diss2g(uint8_t value); 85 | uint8_t set_intpol(uint8_t value); 86 | uint8_t set_mres(uint16_t value); 87 | uint8_t set_sync(uint8_t value); 88 | uint8_t set_vhighchm(uint8_t value); 89 | uint8_t set_vhighfs(uint8_t value); 90 | uint8_t set_vsense(uint8_t value); 91 | uint8_t set_tbl(uint8_t value); 92 | uint8_t set_chm(uint8_t value); 93 | uint8_t set_rndtf(uint8_t value); 94 | uint8_t set_disfdcc(uint8_t value); 95 | uint8_t set_fd(uint8_t value); 96 | uint8_t set_hend(uint8_t value); 97 | uint8_t set_hstrt(uint8_t value); 98 | uint8_t set_toff(uint8_t value); 99 | 100 | uint8_t alter_COOLCONF(uint32_t data, uint32_t mask); 101 | uint8_t set_COOLCONF(uint8_t position, uint8_t value); 102 | uint8_t set_sfilt(uint8_t value); 103 | uint8_t set_sgt(uint8_t value); 104 | uint8_t set_seimin(uint8_t value); 105 | uint8_t set_sedn(uint8_t value); 106 | uint8_t set_semax(uint8_t value); 107 | uint8_t set_seup(uint8_t value); 108 | uint8_t set_semin(uint8_t value); 109 | 110 | uint8_t set_DCCTRL(uint16_t dc_time, uint16_t dc_sg); 111 | 112 | uint8_t alter_PWMCONF(uint32_t data, uint32_t mask); 113 | uint8_t set_PWMCONF(uint8_t position, uint8_t value); 114 | uint8_t set_freewheel(uint8_t value); 115 | uint8_t set_pwm_symmetric(uint8_t value); 116 | uint8_t set_pwm_autoscale(uint8_t value); 117 | uint8_t set_pwm_freq(uint8_t value); 118 | uint8_t set_PWM_GRAD(uint8_t value); 119 | uint8_t set_PWM_AMPL(uint8_t value); 120 | 121 | uint8_t set_ENCM_CTRL(uint8_t value); 122 | 123 | boolean isReset(); 124 | boolean isError(); 125 | boolean isStallguard(); 126 | boolean isStandstill(); 127 | String debug(); 128 | 129 | private: 130 | uint32_t _coolconf; 131 | uint32_t _pwmconf; 132 | uint8_t _csPin; 133 | uint8_t _status; 134 | String _debug; 135 | }; 136 | 137 | #endif // TRINAMIC_TMC2130_H 138 | -------------------------------------------------------------------------------- /Trinamic_TMC2130/Trinamic_TMC2130_registers.h: -------------------------------------------------------------------------------- 1 | /**************************************************************************/ 2 | /*! 3 | @file Trinamic_TMC2130_registers.h 4 | @author Moritz Walter 5 | @license GPLv3 (see license.txt) 6 | 7 | SPI configuration tool for Trinamic TMC2130 Motor Drivers 8 | 9 | @section HISTORY 10 | 11 | v0.1 - it works 12 | */ 13 | /**************************************************************************/ 14 | #ifndef TRINAMIC_TMC2130_REGISTERS_H 15 | #define TRINAMIC_TMC2130_REGISTERS_H 16 | 17 | #if ARDUINO >= 100 18 | #include "Arduino.h" 19 | #else 20 | #include "WProgram.h" 21 | #endif 22 | 23 | #include 24 | 25 | // SPI 26 | #define TMC_SPI_CLOCK_DIVIDER SPI_CLOCK_DIV8 27 | #define TMC_SPI_DATA_MODE SPI_MODE3 28 | #define TMC_SPI_BIT_ORDER MSBFIRST 29 | 30 | // RW 31 | #define TMC_READ (0x00) 32 | #define TMC_WRITE (0x80) 33 | 34 | // SPISTATUS MASKS 35 | #define TMC_SPISTATUS_RESET_MASK (0x01) 36 | #define TMC_SPISTATUS_ERROR_MASK (0x02) 37 | #define TMC_SPISTATUS_STALLGUARD_MASK (0x04) 38 | #define TMC_SPISTATUS_STANDSTILL_MASK (0x08) 39 | 40 | // REGISTERS 41 | #define TMC_REG_GCONF (0x00) // RW // 17 // Global configuration flags 42 | #define TMC_REG_GSTAT (0x01) // RC // 3 // Global status flags 43 | #define TMC_REG_IOIN (0x04) // R // 8+8 // Reads the state of all input pins available 44 | #define TMC_REG_IHOLD_IRUN (0x10) // W // 5+5+4 // Driver current control 45 | #define TMC_REG_TPOWERDOWN (0x11) // W // 8 // sets delay time after stand still (stst) to motor current power down (0-4 seconds) 0_((2^8)-1) * 2^18 tclk 46 | #define TMC_REG_TSTEP (0x12) // R // 20 // Actual measured time between two 1/256 microsteps derived from the step input frequency in units of 1/fCLK. Measured value is (2^20)-1 in case of overflow or stand still 47 | #define TMC_REG_TPWMTHRS (0x13) // W // 20 // Upper velocity threshold for stealthChop voltage PWM mode 48 | #define TMC_REG_TCOOLTHRS (0x14) // W // 20 // Lower threshold velocity for switching on smart energy coolStep and stallGuard feature (unsigned) 49 | #define TMC_REG_THIGH (0x15) // W // 20 // Velocity dependend switching into different chopper mode and fullstepping to maximize torque (unsigned) 50 | #define TMC_REG_XDIRECT (0x2D) // RW // 32 // specifies motor coil currents and polarity directly programmed via SPI. Use signed, two's complement numbers. In this mode, the current is scaled by IHOLD. Velocity based current regulation of voltage PWM is not available in this mode. +- 255 for both coils 51 | #define TMC_REG_VDCMIN (0x33) // W // 23 // automatic commutation dcStep becomes enabled by the external signal DCEN. VDCMIN is used as the minimum step velocity when the motor is heavily loaded. Hint: Also set DCCTRL parameters in order to operate dcStep 52 | #define TMC_REG_MSLUT0 (0x60) // W // 32 // Each bit gives the difference between entry x and entry x+1 when combined with the corresponding MSLUTSEL W bits. Differential coding for the first quarter of a wave. Start values for CUR_A and CUR_B are stored for MSCNT position 0 in START_SIN and START_SIN90. 53 | #define TMC_REG_MSLUT1 (0x61) // W // 32 // 54 | #define TMC_REG_MSLUT2 (0x62) // W // 32 // 55 | #define TMC_REG_MSLUT3 (0x63) // W // 32 // 56 | #define TMC_REG_MSLUT4 (0x64) // W // 32 // 57 | #define TMC_REG_MSLUT5 (0x65) // W // 32 // 58 | #define TMC_REG_MSLUT6 (0x66) // W // 32 // 59 | #define TMC_REG_MSLUT7 (0x67) // W // 32 // 60 | #define TMC_REG_MSLUTSEL (0x68) // W // 32 // defines four segments within each quarter MSLUT wave. Four 2 bit entries determine the meaning of a 0 and a 1 bit in the corresponding segment of MSLUT 61 | #define TMC_REG_MSLUTSTART (0x69) // W // 8+8 // 62 | #define TMC_REG_MSCNT (0x6A) // R // 10 // 63 | #define TMC_REG_MSCURACT (0x6B) // R // 9+9 // 64 | #define TMC_REG_CHOPCONF (0x6C) // RW // 32 // 65 | #define TMC_REG_COOLCONF (0x6D) // W // 25 // 66 | #define TMC_REG_DCCTRL (0x6E) // W // 24 // 67 | #define TMC_REG_DRV_STATUS (0x6F) // R // 22 // 68 | #define TMC_REG_PWMCONF (0x70) // W // 8 // 69 | #define TMC_REG_PWM_SCALE (0x71) // R // 8 // 70 | #define TMC_REG_ENCM_CTRL (0x72) // W // 2 // 71 | #define TMC_REG_LOST_STEPS (0x73) // R // 20 // 72 | 73 | // GCONF OFFSETS 74 | // for shifting incoming values to the right register position 75 | #define TMC_GCONF_I_SCALE_ANALOG (0) // 0: Internal, 1: AIN 76 | #define TMC_GCONF_INTERNAL_RSENSE (1) // 0: Normal, 1: Internal 77 | #define TMC_GCONF_EN_PWM_MODE (2) // 0: Disable, 1: Enable 78 | #define TMC_GCONF_ENC_COMMUTATION (3) // 0: Disable, 1: Enable 79 | #define TMC_GCONF_SHAFT (4) // 0: Normal, 1: Invert 80 | #define TMC_GCONF_DIAG0_ERROR (5) // 0: Disable, 1: Enable 81 | #define TMC_GCONF_DIAG0_OTPW (6) // 0: Disable, 1: Enable 82 | #define TMC_GCONF_DIAG0_STALL (7) // 0: Disable, 1: Enable 83 | #define TMC_GCONF_DIAG1_STALL (8) // 0: Disable, 1: Enable 84 | #define TMC_GCONF_DIAG1_INDEX (9) // 0: Disable, 1: Enable 85 | #define TMC_GCONF_DIAG1_ONSTATE (10) // 0: Disable, 1: Enable 86 | #define TMC_GCONF_DIAG1_STEPS_SKIPPED (11) // 0: Disable, 1: Enable 87 | #define TMC_GCONF_DIAG0_INT_PUSHPULL (12) // 0: Open Collector, 1: Push Pull 88 | #define TMC_GCONF_DIAG1_INT_PUSHPULL (13) // 0: Open Collector, 1: Push Pull 89 | #define TMC_GCONF_SMALL_HYSTERESIS (14) // 0: 1/16, 1: 1/32 90 | #define TMC_GCONF_STOP_ENABLE (15) // 0: Normal, 1: Emergency Stop 91 | #define TMC_GCONF_DIRECT_MODE (16) // 0: Normal, 1: XDIRECT 92 | #define TMC_GCONF_TEST_MODE (17) // 0: Normal, 1: Enable, Don't use! 93 | 94 | // GCONF MASKS 95 | // not required, all 1 bit 96 | 97 | // IHOLD_IRUN OFFSETS 98 | // for shifting incoming values to the right register position 99 | #define TMC_IHOLD (0) 100 | #define TMC_IRUN (8) 101 | #define TMC_IHOLDDELAY (16) 102 | 103 | // IHOLD IRUN MASKS 104 | #define TMC_IHOLD_MASK (0b11111UL) 105 | #define TMC_IRUN_MASK (0b11111UL) 106 | #define TMC_IHOLDDELAY_MASK (0b1111UL) 107 | 108 | // TPOWERDOWN 109 | // no offsets required 110 | #define TMC_TPOWERDOWN_MASK (0b11111111UL) 111 | 112 | // TSTEP 113 | // no offsets required 114 | #define TMC_TSTEP_MASK (0b11111111111111111111UL) 115 | 116 | // TPWMTHRS 117 | // no offsets required 118 | #define TMC_TPWMTHRS_MASK (0b11111111111111111111UL) 119 | 120 | // TCOOLTHRS 121 | #define TMC_TCOOLTHRS_MASK (0b11111111111111111111UL) 122 | 123 | // THIGH 124 | // no offsets required 125 | #define TMC_THIGH_MASK (0b11111111111111111111UL) 126 | 127 | // XDIRECT OFFSETS 128 | // for shifting incoming values to the right register position 129 | #define TMC_XDIRECT_COIL_A (0) 130 | #define TMC_XDIRECT_COIL_B (16) 131 | 132 | // XDIRECT MASKS 133 | // mask the bits from the values we want to set 134 | #define TMC_XDIRECT_MASK (0xFFFFFFFFUL) 135 | #define TMC_XDIRECT_COIL_A_MASK (0xFFFFUL) 136 | #define TMC_XDIRECT_COIL_B_MASK (0xFFFFUL) 137 | // no offsets required 138 | // needs no mask 139 | 140 | // VDCMIN 141 | // no offsets required 142 | #define TMC_VDCMIN_MASK (0b11111111111111111111111UL) 143 | 144 | // MSLUT 145 | // no offsets required 146 | // needs no mask 147 | 148 | // MSLUTSEL 149 | // no offsets required 150 | // needs no mask 151 | 152 | // MSLUTSTART OFFSETS 153 | #define TMC_MSLUTSTART_START_SIN (0) 154 | #define TMC_MSLUTSTART_START_SIN90 (8) 155 | 156 | // MSLUTSTART MASKS 157 | #define TMC_MSLUTSTART_MASK (0xFFFFUL) 158 | #define TMC_MSLUTSTART_START_SIN_MASK (0xFF) 159 | #define TMC_MSLUTSTART_START_SIN90_MASK (0xFF) 160 | 161 | 162 | // MSCNT 163 | // no offsets required 164 | #define TMC_MSCNT_MASK (0b1111111111) 165 | 166 | // MSCURACT 167 | // no offsets required 168 | #define TMC_MSCURACT_MASK (0b111111111111111111UL) 169 | 170 | // CHOPCONF MASKS 171 | // mask the bits from the values we want to set 172 | 173 | const uint32_t TMC_CHOPCONF_MASKS[] = { 174 | 0b1111UL, // 0 TOFF 175 | 0b111UL, // 1 176 | 0b11UL, // 2 177 | 0b1UL, // 3 178 | 0b111UL, // 4 HYSTERESIS_START 179 | 0b11UL, // 5 180 | 0b1UL, // 6 181 | 0b0001UL, // 7 HYSTERESIS_LOW 182 | 0b001UL, // 8 183 | 0b01UL, // 9 184 | 0b1UL, // 10 185 | 0b1UL, // 11 FAST_DECAY_TIMING 186 | 0b1UL, // 12 FAST_DECAY_MODE 187 | 0b1UL, // 13 RANDOM_TOFF 188 | 0b1UL, // 14 CHOPPER_MODE 189 | 0b11UL, // 15 TBL 190 | 0b1UL, // 16 191 | 0b1UL, // 17 SENSE_CURRENT_SCALING 192 | 0b1UL, // 18 HIGH_VELOCITY_STEPS 193 | 0b1UL, // 19 HIGH_VELOCITY_CHOPPER 194 | 0b1111UL, // 20 SYNC_PWM 195 | 0b111UL, // 21 196 | 0b11UL, // 22 197 | 0b1UL, // 23 198 | 0b1111UL, // 24 MRES 199 | 0b111UL, // 25 200 | 0b11UL, // 26 201 | 0b1UL, // 27 202 | 0b1UL, // 28 INTERPOLATE 203 | 0b1UL, // 29 DOUBLE_EDGE_PULSES 204 | 0b1UL, // 30 SHORT_PROTECTION 205 | 0b1UL // 31 206 | }; 207 | 208 | // CHOPCONF OFFSETS 209 | // for shifting incoming values to the right register position 210 | #define TMC_CHOPCONF_DISS2G (30) 211 | #define TMC_CHOPCONF_DEDGE (29) 212 | #define TMC_CHOPCONF_INTPOL (28) 213 | #define TMC_CHOPCONF_MRES (24) 214 | #define TMC_CHOPCONF_SYNC (20) 215 | #define TMC_CHOPCONF_VHIGHCHM (19) 216 | #define TMC_CHOPCONF_VHIGHFS (18) 217 | #define TMC_CHOPCONF_VSENSE (17) 218 | #define TMC_CHOPCONF_TBL (15) 219 | #define TMC_CHOPCONF_CHM (14) 220 | #define TMC_CHOPCONF_RNDTF (13) 221 | #define TMC_CHOPCONF_DISFDCC (12) 222 | #define TMC_CHOPCONF_FD (11) 223 | #define TMC_CHOPCONF_HEND (7) 224 | #define TMC_CHOPCONF_HSTRT (4) 225 | #define TMC_CHOPCONF_TOFF (0) 226 | 227 | // COOLCONF BIT OFFSETS 228 | // for shifting incoming values to the right register position 229 | #define TMC_COOLCONF_SFILT (24) 230 | #define TMC_COOLCONF_SGT (16) 231 | #define TMC_COOLCONF_SEIMIN (15) 232 | #define TMC_COOLCONF_SEDN (13) 233 | #define TMC_COOLCONF_SEMAX (8) 234 | #define TMC_COOLCONF_SEUP (5) 235 | #define TMC_COOLCONF_SEMIN (0) 236 | 237 | // COOLCONF MASKS 238 | // mask the bits from the values we want to set 239 | const int TMC_COOLCONF_MASKS[] = { 240 | 0b1111UL, // 0 TMC_COOLCONF_SEMIN 241 | 0b111UL, // 1 242 | 0b11UL, // 2 243 | 0b1UL, // 3 244 | 0b0UL, // 4 245 | 0b11UL, // 5 TMC_COOLCONF_SEUP 246 | 0b1UL, // 6 247 | 0b0UL, // 7 248 | 0b1111UL, // 8 TMC_COOLCONF_SEMAX 249 | 0b111UL, // 9 250 | 0b11UL, // 10 251 | 0b1UL, // 11 252 | 0b0UL, // 12 253 | 0b11UL, // 13 TMC_COOLCONF_SEDN 254 | 0b1UL, // 14 255 | 0b1UL, // 15 TMC_COOLCONF_SEIMIN 256 | 0b1111111UL, // 16 TMC_COOLCONF_SGT 257 | 0b111111UL, // 17 258 | 0b11111UL, // 18 259 | 0b1111UL, // 19 260 | 0b111UL, // 20 261 | 0b11UL, // 21 262 | 0b1UL, // 22 263 | 0b0UL, // 23 264 | 0b1UL, // 24 TMC_COOLCONF_SFILT 265 | }; 266 | 267 | // DCCTRL OFFSETS 268 | // for shifting incoming values to the right register position 269 | #define TMC_DCCTRL_DC_TIME (0) 270 | #define TMC_DCCTRL_DC_SG (16) 271 | 272 | // DCCTRL MASKS 273 | // mask the bits from the values we want to set 274 | #define TMC_DCCTRL_MASK (0b1111111111UL) 275 | #define TMC_DCCTRL_DC_TIME_MASK (0b11111111UL) 276 | #define TMC_DCCTRL_DC_SG_MASK (0b111111110000001111111111UL) 277 | 278 | 279 | // PWMCONF OFFSETS 280 | // for shifting incoming values to the right register position 281 | #define TMC_PWMCONF_FREEWHEEL (20) 282 | #define TMC_PWMCONF_PWM_SYMMETRIC (19) 283 | #define TMC_PWMCONF_PWM_AUTOSCALE (18) 284 | #define TMC_PWMCONF_PWM_FREQ (16) 285 | #define TMC_PWMCONF_PWM_GRAD (8) 286 | #define TMC_PWMCONF_PWM_AMPL (0) 287 | 288 | // PWMCONF MASKS 289 | // mask the bits from the values we want to set 290 | const int TMC_PWMCONF_MASKS[] = { 291 | 0b11111111UL, // 0 TMC_PWMCONF_PWM_AMPL 292 | 0b1111111UL, // 1 293 | 0b111111UL, // 2 294 | 0b11111UL, // 3 295 | 0b1111UL, // 4 296 | 0b111UL, // 5 297 | 0b11UL, // 6 298 | 0b1UL, // 7 299 | 0b11111111UL, // 8 TMC_PWMCONF_PWM_GRAD 300 | 0b1111111UL, // 9 301 | 0b111111UL, // 10 302 | 0b11111UL, // 11 303 | 0b1111UL, // 12 304 | 0b111UL, // 13 305 | 0b11UL, // 14 306 | 0b1UL, // 15 307 | 0b11UL, // 16 TMC_PWMCONF_PWM_FREQ 308 | 0b1UL, // 17 309 | 0b1UL, // 18 TMC_PWMCONF_PWM_AUTOSCALE 310 | 0b1UL, // 19 TMC_PWMCONF_PWM_SYMMETRIC 311 | 0b11UL, // 20 TMC_PWMCONF_FREEWHEEL 312 | 0b1UL, // 21 313 | }; 314 | 315 | // ENCM_CTRL MASK 316 | // mask the bits from the values we want to set 317 | #define TMC_ENCM_CTRL_MASK (0b11); 318 | 319 | #endif // TRINAMIC_TMC2130_REGISTERS_H 320 | -------------------------------------------------------------------------------- /Trinamic_TMC2130/examples/configuration_tool/configuration_tool.ino: -------------------------------------------------------------------------------- 1 | /**************************************************************************/ 2 | /*! 3 | @file configuration_tool.ino 4 | @author Moritz Walter 5 | @license GPLv3 (see license.txt) 6 | 7 | Tool to send SPI configuration to Trinamic TMC2130 Motor Drivers 8 | 9 | @section HISTORY 10 | 11 | v0.1 - it works 12 | */ 13 | /**************************************************************************/ 14 | 15 | #include 16 | #include 17 | 18 | #define BAUDRATE 125000 19 | 20 | //////////////////// 21 | // 22 | // HOW TO USE 23 | // 24 | //////////////////// 25 | 26 | // This tool uses hardware SPI 27 | // Just wire the drivers to your SPI pins and define the CS pins below. 28 | // Then, uncomment configuration below to enable specific settings. 29 | // Once flashed, the sketch sends your configuration to the drivers in regular intervals. 30 | 31 | //////////////////// 32 | // 33 | // CONFIGURATION 34 | // 35 | //////////////////// 36 | 37 | ////////// 38 | // STEPPER PIN CONFIGURATION 39 | // enter your pin configuration here 40 | ////////// 41 | 42 | // enable one or two stepper drivers 43 | #define STEPPERX_ENABLE 44 | //#define STEPPERY_ENABLE 45 | 46 | // cable select pins for the steppers 47 | #define X_CS_PIN 53 48 | #define Y_CS_PIN 49 49 | 50 | ////////// 51 | // TMC2130 CONFIGURATION 52 | // uncomment below settings to send them to the drivers 53 | ////////// 54 | 55 | //#define GLOBAL_EN_PWM_MODE 0 56 | #define GLOBAL_I_SCALE_ANALOG 1 // [0,1] 0: Normal, 1: AIN 57 | //#define GLOBAL_INTERNAL_RSENSE 0 // [0,1]0: Normal, 1: Internal 58 | #define GLOBAL_EN_PWM_MODE 0 //[0,1] 0: Normal, 1: stealthChop with velocity threshold 59 | //#define GLOBAL_ENC_COMMUTATION 0 // 60 | #define GLOBAL_SHAFT 0 // 0: normal, 1: invert 61 | //#define GLOBAL_DIAG0_ERROR 0 // 62 | //#define GLOBAL_DIAG0_OTPW 0 // 63 | //#define GLOBAL_DIAG0_STALL 0 // 64 | //#define GLOBAL_DIAG1_STALL 0 // 65 | //#define GLOBAL_DIAG1_INDEX 0 // 66 | //#define GLOBAL_DIAG1_ONSTATE 0 // 67 | //#define GLOBAL_DIAG1_ONSTATE 0 // 68 | //#define GLOBAL_DIAG0_INT_PUSHPULL 0 // 69 | //#define GLOBAL_DIAG1_INT_PUSHPULL 0 // 70 | //#define GLOBAL_SMALL_HYSTERESIS 0 // 71 | //#define GLOBAL_STOP_ENABLE 0 // 72 | //#define GLOBAL_DIRECT_MODE 0 // 73 | 74 | /* VELOCITY DEPENDEND DRIVE FEATURES */ 75 | 76 | #define GLOBAL_IHOLD 22 // [0-31] 0: min, 31: max 77 | #define GLOBAL_IRUN 31 // [0-31] 0: min, 31: max 78 | #define GLOBAL_IHOLDDELAY 15 // [0-15] 0: min, 15: about 4 seconds // delay before IHOLD is applied 79 | //#define GLOBAL_TPOWERDOWN 0 // [0-255] 0: min, 255: about 4 seconds // delay to standstill current reduction 80 | //#define GLOBAL_TPWMTHRS 0 // [0-1048576] e.g. 20 corresponds with 2000 steps/s 81 | //#define GLOBAL_TCOOLTHRS 0 // [0-1048576] e.g. 20 corresponds with 2000 steps/s 82 | #define GLOBAL_THIGH 10 // [0-1048576] e.g. 20 corresponds with 2000 steps/s 83 | 84 | /* SPI MODE CONFIGURATION */ 85 | 86 | //#define GLOBAL_XDIRECT 0 // 87 | 88 | /* DCSTEP MINIMUM VELOCITY */ 89 | 90 | //#define GLOBAL_VDCMIN 0 // 91 | 92 | /* MOTOR DRIVER CONFIGURATION*/ 93 | 94 | //#define GLOBAL_DEDGE 0 // 95 | //#define GLOBAL_DISS2G 0 // 96 | #define GLOBAL_INTPOL 1 // 0: off 1: 256 microstep interpolation 97 | #define GLOBAL_MRES 16 // number of microsteps 98 | #define GLOBAL_SYNC 1 // {0-15} 99 | #define GLOBAL_VHIGHCHM 1 // [0,1] 0: normal, 1: high velocity stepper mode 100 | #define GLOBAL_VHIGHFS 0 // [0,1] 0: normal, 1: switch to full steps for high velocities 101 | // #define GLOBAL_VSENSE 0 // [0,1] 0: normal, 1: high sensitivity (not recommended) 102 | #define GLOBAL_TBL 1 // 0-3: set comparator blank time to 16, 24, 36 or 54 clocks, 1 or 2 is recommended 103 | #define GLOBAL_CHM 0 // [0,1] 0: spreadCycle, 1: Constant off time with fast decay time. 104 | //#define GLOBAL_RNDTF 0 // 105 | //#define GLOBAL_DISFDCC 0 // 106 | //#define GLOBAL_FD 0 // 107 | //#define GLOBAL_HEND 0 // 108 | //#define GLOBAL_HSTRT 0 // 109 | #define GLOBAL_TOFF 10 // 0: driver disable, 1: use only with TBL>=2, 2-15: off time setting during slow decay phase 110 | 111 | //#define GLOBAL_SFILT 0 // 112 | //#define GLOBAL_SGT 0 // 113 | //#define GLOBAL_SEIMIN 0 // 114 | //#define GLOBAL_SEDN 0 // 115 | //#define GLOBAL_SEMAX 0 // 116 | //#define GLOBAL_SEUP 0 // 117 | //#define GLOBAL_SEMIN 0 // 118 | 119 | //#define GLOBAL_DC_TIME 0 // 120 | //#define GLOBAL_DC_SG 0 // 121 | 122 | //#define GLOBAL_FREEWHEEL 0 // 123 | //#define GLOBAL_PWM_SYMMETRIC 0 // 124 | //#define GLOBAL_PWM_AUTOSCALE 0 // 125 | //#define GLOBAL_PWM_FREQ 0 // 126 | //#define GLOBAL_PWM_GRAD 0 // 127 | //#define GLOBAL_PWM_AMPL 0 // 128 | 129 | //#define GLOBAL_ENCM_CTRL 0 // 130 | 131 | 132 | 133 | 134 | //////////////////// 135 | // 136 | // NO CHANGES REQUIRED BELOW 137 | // 138 | //////////////////// 139 | 140 | #ifdef STEPPERX_ENABLE 141 | Trinamic_TMC2130 stepperX(X_CS_PIN); 142 | #endif 143 | #ifdef STEPPERY_ENABLE 144 | Trinamic_TMC2130 stepperY(Y_CS_PIN); 145 | #endif 146 | 147 | void setup(){ 148 | Serial.begin(BAUDRATE); 149 | } 150 | 151 | 152 | void loop(){ 153 | configure(); 154 | #ifdef STEPPERX_ENABLE 155 | uint32_t xbuf; 156 | stepperX.read_REG(TMC_REG_GCONF,&xbuf); 157 | Serial.print("X GCONF: "); 158 | Serial.println(xbuf,BIN); 159 | #endif 160 | #ifdef STEPPERY_ENABLE 161 | uint32_t ybuf; 162 | stepperY.read_REG(TMC_REG_GCONF,&ybuf); 163 | Serial.print("Y GCONF: "); 164 | Serial.println(ybuf,BIN); 165 | #endif 166 | delay(1000); 167 | } 168 | 169 | void configure(){ 170 | #ifdef STEPPERX_ENABLE 171 | stepperX.init(); 172 | #ifdef GLOBAL_I_SCALE_ANALOG 173 | stepperX.set_I_scale_analog(GLOBAL_I_SCALE_ANALOG); 174 | #endif 175 | #ifdef GLOBAL_INTERNAL_RSENSE 176 | stepperX.set_internal_Rsense(GLOBAL_INTERNAL_RSENSE); 177 | #endif 178 | #ifdef GLOBAL_EN_PWM_MODE 179 | stepperX.set_en_pwm_mode(GLOBAL_EN_PWM_MODE); 180 | #endif 181 | #ifdef GLOBAL_ENC_COMMUTATION 182 | stepperX.set_enc_commutation(GLOBAL_ENC_COMMUTATION); 183 | #endif 184 | #ifdef GLOBAL_SHAFT 185 | stepperX.set_shaft(GLOBAL_SHAFT); 186 | #endif 187 | #ifdef GLOBAL_DIAG0_ERROR 188 | stepperX.set_diag0_error(GLOBAL_DIAG0_ERROR); 189 | #endif 190 | #ifdef GLOBAL_DIAG0_OTPW 191 | stepperX.set_diag0_otpw(GLOBAL_DIAG0_OTPW); 192 | #endif 193 | #ifdef GLOBAL_DIAG0_STALL 194 | stepperX.set_diag0_stall(GLOBAL_DIAG0_STALL); 195 | #endif 196 | #ifdef GLOBAL_DIAG1_STALL 197 | stepperX.set_diag1_stall(GLOBAL_DIAG1_STALL); 198 | #endif 199 | #ifdef GLOBAL_DIAG1_INDEX 200 | stepperX.set_diag1_index(GLOBAL_DIAG1_INDEX); 201 | #endif 202 | #ifdef GLOBAL_DIAG1_ONSTATE 203 | stepperX.set_diag1_onstate(GLOBAL_DIAG1_ONSTATE); 204 | #endif 205 | #ifdef GLOBAL_DIAG1_ONSTATE 206 | stepperX.set_diag1_steps_skipped(GLOBAL_DIAG1_ONSTATE); 207 | #endif 208 | #ifdef GLOBAL_DIAG0_INT_PUSHPULL 209 | stepperX.set_diag0_int_pushpull(GLOBAL_DIAG0_INT_PUSHPULL); 210 | #endif 211 | #ifdef GLOBAL_DIAG1_INT_PUSHPULL 212 | stepperX.set_diag1_int_pushpull(GLOBAL_DIAG1_INT_PUSHPULL); 213 | #endif 214 | #ifdef GLOBAL_SMALL_HYSTERESIS 215 | stepperX.set_small_hysteresis(GLOBAL_SMALL_HYSTERESIS); 216 | #endif 217 | #ifdef GLOBAL_STOP_ENABLE 218 | stepperX.set_stop_enable(GLOBAL_STOP_ENABLE); 219 | #endif 220 | #ifdef GLOBAL_DIRECT_MODE 221 | stepperX.set_direct_mode(GLOBAL_DIRECT_MODE); 222 | #endif 223 | 224 | #ifdef GLOBAL_IHOLD 225 | stepperX.set_IHOLD_IRUN(GLOBAL_IHOLD,GLOBAL_IRUN,GLOBAL_IHOLDDELAY); 226 | #endif 227 | #ifdef GLOBAL_TPOWERDOWN 228 | stepperX.set_TPOWERDOWN(GLOBAL_TPOWERDOWN); 229 | #endif 230 | #ifdef GLOBAL_TPWMTHRS 231 | stepperX.set_TPWMTHRS(GLOBAL_TPWMTHRS); 232 | #endif 233 | #ifdef GLOBAL_TCOOLTHRS 234 | stepperX.set_TCOOLTHRS(GLOBAL_TCOOLTHRS); 235 | #endif 236 | #ifdef GLOBAL_THIGH 237 | stepperX.set_THIGH(GLOBAL_THIGH); 238 | #endif 239 | #ifdef GLOBAL_XDIRECT 240 | stepperX.set_XDIRECT(GLOBAL_XDIRECT); 241 | #endif 242 | #ifdef GLOBAL_VDCMIN 243 | stepperX.set_VDCMIN(GLOBAL_VDCMIN); 244 | #endif 245 | 246 | #ifdef GLOBAL_DEDGE 247 | stepperX.set_dedge(GLOBAL_DEDGE); 248 | #endif 249 | #ifdef GLOBAL_DISS2G 250 | stepperX.set_diss2g(GLOBAL_DISS2G); 251 | #endif 252 | #ifdef GLOBAL_INTPOL 253 | stepperX.set_intpol(GLOBAL_INTPOL); 254 | #endif 255 | #ifdef GLOBAL_MRES 256 | stepperX.set_mres(GLOBAL_MRES); 257 | #endif 258 | #ifdef GLOBAL_SYNC 259 | stepperX.set_sync(GLOBAL_SYNC); 260 | #endif 261 | #ifdef GLOBAL_VHIGHCHM 262 | stepperX.set_vhighchm(GLOBAL_VHIGHCHM); 263 | #endif 264 | #ifdef GLOBAL_VHIGHFS 265 | stepperX.set_vhighfs(GLOBAL_VHIGHFS); 266 | #endif 267 | #ifdef GLOBAL_VSENSE 268 | stepperX.set_vsense(GLOBAL_VSENSE); 269 | #endif 270 | #ifdef GLOBAL_TBL 271 | stepperX.set_tbl(GLOBAL_TBL); 272 | #endif 273 | #ifdef GLOBAL_CHM 274 | stepperX.set_chm(GLOBAL_CHM); 275 | #endif 276 | #ifdef GLOBAL_RNDTF 277 | stepperX.set_rndtf(GLOBAL_RNDTF); 278 | #endif 279 | #ifdef GLOBAL_DISFDCC 280 | stepperX.set_disfdcc(GLOBAL_DISFDCC); 281 | #endif 282 | #ifdef GLOBAL_FD 283 | stepperX.set_fd(GLOBAL_FD); 284 | #endif 285 | #ifdef GLOBAL_HEND 286 | stepperX.set_hend(GLOBAL_HEND); 287 | #endif 288 | #ifdef GLOBAL_HSTRT 289 | stepperX.set_hstrt(GLOBAL_HSTRT); 290 | #endif 291 | #ifdef GLOBAL_TOFF 292 | stepperX.set_toff(GLOBAL_TOFF); 293 | #endif 294 | 295 | #ifdef GLOBAL_SFILT 296 | stepperX.set_sfilt(GLOBAL_SFILT); 297 | #endif 298 | #ifdef GLOBAL_SGT 299 | stepperX.set_sgt(GLOBAL_SGT); 300 | #endif 301 | #ifdef GLOBAL_SEIMIN 302 | stepperX.set_seimin(GLOBAL_SEIMIN); 303 | #endif 304 | #ifdef GLOBAL_SEDN 305 | stepperX.set_sedn(GLOBAL_SEDN); 306 | #endif 307 | #ifdef GLOBAL_SEMAX 308 | stepperX.set_semax(GLOBAL_SEMAX); 309 | #endif 310 | #ifdef GLOBAL_SEUP 311 | stepperX.set_seup(GLOBAL_SEUP); 312 | #endif 313 | #ifdef GLOBAL_SEMIN 314 | stepperX.set_semin(GLOBAL_SEMIN); 315 | #endif 316 | 317 | #ifdef GLOBAL_DC_TIME 318 | stepperX.set_DCCTRL(GLOBAL_DC_TIME, GLOBAL_DC_SG); 319 | #endif 320 | 321 | #ifdef GLOBAL_FREEWHEEL 322 | stepperX.set_freewheel(GLOBAL_FREEWHEEL); 323 | #endif 324 | #ifdef GLOBAL_PWM_SYMMETRIC 325 | stepperX.set_pwm_symmetric(GLOBAL_PWM_SYMMETRIC); 326 | #endif 327 | #ifdef GLOBAL_PWM_AUTOSCALE 328 | stepperX.set_pwm_autoscale(GLOBAL_PWM_AUTOSCALE); 329 | #endif 330 | #ifdef GLOBAL_PWM_FREQ 331 | stepperX.set_pwm_freq(GLOBAL_PWM_FREQ); 332 | #endif 333 | #ifdef GLOBAL_PWM_GRAD 334 | stepperX.set_PWM_GRAD(GLOBAL_PWM_GRAD); 335 | #endif 336 | #ifdef GLOBAL_PWM_AMPL 337 | stepperX.set_PWM_AMPL(GLOBAL_PWM_AMPL); 338 | #endif 339 | 340 | #ifdef GLOBAL_ENCM_CTRL 341 | stepperX.set_ENCM_CTRL(GLOBAL_ENCM_CTRL); 342 | #endif 343 | #endif 344 | 345 | #ifdef STEPPERY_ENABLE 346 | stepperY.init(); 347 | #ifdef GLOBAL_I_SCALE_ANALOG 348 | stepperY.set_I_scale_analog(GLOBAL_I_SCALE_ANALOG); 349 | #endif 350 | #ifdef GLOBAL_INTERNAL_RSENSE 351 | stepperY.set_internal_Rsense(GLOBAL_INTERNAL_RSENSE); 352 | #endif 353 | #ifdef GLOBAL_EN_PWM_MODE 354 | stepperY.set_en_pwm_mode(GLOBAL_EN_PWM_MODE); 355 | #endif 356 | #ifdef GLOBAL_ENC_COMMUTATION 357 | stepperY.set_enc_commutation(GLOBAL_ENC_COMMUTATION); 358 | #endif 359 | #ifdef GLOBAL_SHAFT 360 | stepperY.set_shaft(GLOBAL_SHAFT); 361 | #endif 362 | #ifdef GLOBAL_DIAG0_ERROR 363 | stepperY.set_diag0_error(GLOBAL_DIAG0_ERROR); 364 | #endif 365 | #ifdef GLOBAL_DIAG0_OTPW 366 | stepperY.set_diag0_otpw(GLOBAL_DIAG0_OTPW); 367 | #endif 368 | #ifdef GLOBAL_DIAG0_STALL 369 | stepperY.set_diag0_stall(GLOBAL_DIAG0_STALL); 370 | #endif 371 | #ifdef GLOBAL_DIAG1_STALL 372 | stepperY.set_diag1_stall(GLOBAL_DIAG1_STALL); 373 | #endif 374 | #ifdef GLOBAL_DIAG1_INDEX 375 | stepperY.set_diag1_index(GLOBAL_DIAG1_INDEX); 376 | #endif 377 | #ifdef GLOBAL_DIAG1_ONSTATE 378 | stepperY.set_diag1_onstate(GLOBAL_DIAG1_ONSTATE); 379 | #endif 380 | #ifdef GLOBAL_DIAG1_ONSTATE 381 | stepperY.set_diag1_steps_skipped(GLOBAL_DIAG1_ONSTATE); 382 | #endif 383 | #ifdef GLOBAL_DIAG0_INT_PUSHPULL 384 | stepperY.set_diag0_int_pushpull(GLOBAL_DIAG0_INT_PUSHPULL); 385 | #endif 386 | #ifdef GLOBAL_DIAG1_INT_PUSHPULL 387 | stepperY.set_diag1_int_pushpull(GLOBAL_DIAG1_INT_PUSHPULL); 388 | #endif 389 | #ifdef GLOBAL_SMALL_HYSTERESIS 390 | stepperY.set_small_hysteresis(GLOBAL_SMALL_HYSTERESIS); 391 | #endif 392 | #ifdef GLOBAL_STOP_ENABLE 393 | stepperY.set_stop_enable(GLOBAL_STOP_ENABLE); 394 | #endif 395 | #ifdef GLOBAL_DIRECT_MODE 396 | stepperY.set_direct_mode(GLOBAL_DIRECT_MODE); 397 | #endif 398 | 399 | #ifdef GLOBAL_IHOLD 400 | stepperY.set_IHOLD_IRUN(GLOBAL_IHOLD,GLOBAL_IRUN,GLOBAL_IHOLDDELAY); 401 | #endif 402 | #ifdef GLOBAL_TPOWERDOWN 403 | stepperY.set_TPOWERDOWN(GLOBAL_TPOWERDOWN); 404 | #endif 405 | #ifdef GLOBAL_TPWMTHRS 406 | stepperY.set_TPWMTHRS(GLOBAL_TPWMTHRS); 407 | #endif 408 | #ifdef GLOBAL_TCOOLTHRS 409 | stepperY.set_TCOOLTHRS(GLOBAL_TCOOLTHRS); 410 | #endif 411 | #ifdef GLOBAL_THIGH 412 | stepperY.set_THIGH(GLOBAL_THIGH); 413 | #endif 414 | #ifdef GLOBAL_XDIRECT 415 | stepperY.set_XDIRECT(GLOBAL_XDIRECT); 416 | #endif 417 | #ifdef GLOBAL_VDCMIN 418 | stepperY.set_VDCMIN(GLOBAL_VDCMIN); 419 | #endif 420 | 421 | #ifdef GLOBAL_DEDGE 422 | stepperY.set_dedge(GLOBAL_DEDGE); 423 | #endif 424 | #ifdef GLOBAL_DISS2G 425 | stepperY.set_diss2g(GLOBAL_DISS2G); 426 | #endif 427 | #ifdef GLOBAL_INTPOL 428 | stepperY.set_intpol(GLOBAL_INTPOL); 429 | #endif 430 | #ifdef GLOBAL_MRES 431 | stepperY.set_mres(GLOBAL_MRES); 432 | #endif 433 | #ifdef GLOBAL_SYNC 434 | stepperY.set_sync(GLOBAL_SYNC); 435 | #endif 436 | #ifdef GLOBAL_VHIGHCHM 437 | stepperY.set_vhighchm(GLOBAL_VHIGHCHM); 438 | #endif 439 | #ifdef GLOBAL_VHIGHFS 440 | stepperY.set_vhighfs(GLOBAL_VHIGHFS); 441 | #endif 442 | #ifdef GLOBAL_VSENSE 443 | stepperY.set_vsense(GLOBAL_VSENSE); 444 | #endif 445 | #ifdef GLOBAL_TBL 446 | stepperY.set_tbl(GLOBAL_TBL); 447 | #endif 448 | #ifdef GLOBAL_CHM 449 | stepperY.set_chm(GLOBAL_CHM); 450 | #endif 451 | #ifdef GLOBAL_RNDTF 452 | stepperY.set_rndtf(GLOBAL_RNDTF); 453 | #endif 454 | #ifdef GLOBAL_DISFDCC 455 | stepperY.set_disfdcc(GLOBAL_DISFDCC); 456 | #endif 457 | #ifdef GLOBAL_FD 458 | stepperY.set_fd(GLOBAL_FD); 459 | #endif 460 | #ifdef GLOBAL_HEND 461 | stepperY.set_hend(GLOBAL_HEND); 462 | #endif 463 | #ifdef GLOBAL_HSTRT 464 | stepperY.set_hstrt(GLOBAL_HSTRT); 465 | #endif 466 | #ifdef GLOBAL_TOFF 467 | stepperY.set_toff(GLOBAL_TOFF); 468 | #endif 469 | 470 | #ifdef GLOBAL_SFILT 471 | stepperY.set_sfilt(GLOBAL_SFILT); 472 | #endif 473 | #ifdef GLOBAL_SGT 474 | stepperY.set_sgt(GLOBAL_SGT); 475 | #endif 476 | #ifdef GLOBAL_SEIMIN 477 | stepperY.set_seimin(GLOBAL_SEIMIN); 478 | #endif 479 | #ifdef GLOBAL_SEDN 480 | stepperY.set_sedn(GLOBAL_SEDN); 481 | #endif 482 | #ifdef GLOBAL_SEMAX 483 | stepperY.set_semax(GLOBAL_SEMAX); 484 | #endif 485 | #ifdef GLOBAL_SEUP 486 | stepperY.set_seup(GLOBAL_SEUP); 487 | #endif 488 | #ifdef GLOBAL_SEMIN 489 | stepperY.set_semin(GLOBAL_SEMIN); 490 | #endif 491 | 492 | #ifdef GLOBAL_DC_TIME 493 | stepperY.set_DCCTRL(GLOBAL_DC_TIME, GLOBAL_DC_SG); 494 | #endif 495 | 496 | #ifdef GLOBAL_FREEWHEEL 497 | stepperY.set_freewheel(GLOBAL_FREEWHEEL); 498 | #endif 499 | #ifdef GLOBAL_PWM_SYMMETRIC 500 | stepperY.set_pwm_symmetric(GLOBAL_PWM_SYMMETRIC); 501 | #endif 502 | #ifdef GLOBAL_PWM_AUTOSCALE 503 | stepperY.set_pwm_autoscale(GLOBAL_PWM_AUTOSCALE); 504 | #endif 505 | #ifdef GLOBAL_PWM_FREQ 506 | stepperY.set_pwm_freq(GLOBAL_PWM_FREQ); 507 | #endif 508 | #ifdef GLOBAL_PWM_GRAD 509 | stepperY.set_PWM_GRAD(GLOBAL_PWM_GRAD); 510 | #endif 511 | #ifdef GLOBAL_PWM_AMPL 512 | stepperY.set_PWM_AMPL(GLOBAL_PWM_AMPL); 513 | #endif 514 | 515 | #ifdef GLOBAL_ENCM_CTRL 516 | stepperY.set_ENCM_CTRL(GLOBAL_ENCM_CTRL); 517 | #endif 518 | #endif 519 | } 520 | -------------------------------------------------------------------------------- /Trinamic_TMC2130/examples/getting_started/getting_started.ino: -------------------------------------------------------------------------------- 1 | /**************************************************************************/ 2 | /*! 3 | @file getting_started.ino 4 | @author Moritz Walter 5 | @license GPLv3 (see license.txt) 6 | 7 | Demo of SPI configuration tool for Trinamic TMC2130 Motor Drivers 8 | 9 | @section HISTORY 10 | 11 | v0.1 - it works 12 | */ 13 | /**************************************************************************/ 14 | 15 | //////////////////// 16 | // 17 | // HOW TO USE 18 | // 19 | //////////////////// 20 | 21 | // This tool uses hardware SPI 22 | // Just wire the drivers to your SPI pins and define the CS pin below. 23 | // Once flashed, the sketch sends a basic configuration to the driver and makes the motor spin. 24 | 25 | #include 26 | #include 27 | 28 | // pin configuration (this is the X-axis on a standard RAMPS 1.4) 29 | #define CS_PIN 53 30 | #define EN_PIN 38 //enable (CFG6) 31 | #define DIR_PIN 55 //direction 32 | #define STEP_PIN 54 //step 33 | 34 | Trinamic_TMC2130 myStepper(CS_PIN); 35 | 36 | void setup(){ 37 | // pins 38 | pinMode(EN_PIN, OUTPUT); 39 | pinMode(DIR_PIN, OUTPUT); 40 | pinMode(STEP_PIN, OUTPUT); 41 | digitalWrite(EN_PIN, HIGH); // disable driver 42 | digitalWrite(DIR_PIN, LOW); // chose direction 43 | digitalWrite(STEP_PIN, LOW); // no step yet 44 | 45 | // stepper 46 | myStepper.init(); 47 | myStepper.set_mres(64); // ({1,2,4,8,16,32,64,128,256}) number of microsteps 48 | myStepper.set_IHOLD_IRUN(31,31,5); // ([0-31],[0-31],[0-5]) sets all currents to maximum 49 | myStepper.set_I_scale_analog(1); // ({0,1}) 0: I_REF internal, 1: sets I_REF to AIN 50 | myStepper.set_tbl(1); // ([0-3]) set comparator blank time to 16, 24, 36 or 54 clocks, 1 or 2 is recommended 51 | myStepper.set_toff(8); // ([0-15]) 0: driver disable, 1: use only with TBL>2, 2-15: off time setting during slow decay phase 52 | 53 | // get ready 54 | digitalWrite(EN_PIN, LOW); // enable driver 55 | } 56 | 57 | void loop(){ 58 | // make a step 59 | digitalWrite(STEP_PIN, HIGH); 60 | delayMicroseconds(100); 61 | digitalWrite(STEP_PIN, LOW); 62 | delayMicroseconds(100); 63 | } 64 | -------------------------------------------------------------------------------- /Trinamic_TMC2130/library.properties: -------------------------------------------------------------------------------- 1 | name=Trinamic TMC2130 2 | version=0.0.1 3 | author=Moritz Walter 4 | maintainer=Moritz Walter, makertum@gmail.com 5 | sentence=A library to configure the Trinamic TMC2130 stepper motor driver. 6 | paragraph=Also gets you up and running with Watterott's ludicrous TMC2130 version of their SilentStepStick motor driver. 7 | category=Uncategorized 8 | url=http://makertum.com 9 | architectures=* 10 | includes=SPI.h,Trinamic_TMC2130.h 11 | -------------------------------------------------------------------------------- /Trinamic_TMC2130/license.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | GNU GENERAL PUBLIC LICENSE 4 | Version 3, 29 June 2007 5 | 6 | Copyright (C) 2007 Free Software Foundation, Inc. 7 | Everyone is permitted to copy and distribute verbatim copies 8 | of this license document, but changing it is not allowed. 9 | 10 | Preamble 11 | 12 | The GNU General Public License is a free, copyleft license for 13 | software and other kinds of works. 14 | 15 | The licenses for most software and other practical works are designed 16 | to take away your freedom to share and change the works. By contrast, 17 | the GNU General Public License is intended to guarantee your freedom to 18 | share and change all versions of a program--to make sure it remains free 19 | software for all its users. We, the Free Software Foundation, use the 20 | GNU General Public License for most of our software; it applies also to 21 | any other work released this way by its authors. You can apply it to 22 | your programs, too. 23 | 24 | When we speak of free software, we are referring to freedom, not 25 | price. Our General Public Licenses are designed to make sure that you 26 | have the freedom to distribute copies of free software (and charge for 27 | them if you wish), that you receive source code or can get it if you 28 | want it, that you can change the software or use pieces of it in new 29 | free programs, and that you know you can do these things. 30 | 31 | To protect your rights, we need to prevent others from denying you 32 | these rights or asking you to surrender the rights. Therefore, you have 33 | certain responsibilities if you distribute copies of the software, or if 34 | you modify it: responsibilities to respect the freedom of others. 35 | 36 | For example, if you distribute copies of such a program, whether 37 | gratis or for a fee, you must pass on to the recipients the same 38 | freedoms that you received. You must make sure that they, too, receive 39 | or can get the source code. And you must show them these terms so they 40 | know their rights. 41 | 42 | Developers that use the GNU GPL protect your rights with two steps: 43 | (1) assert copyright on the software, and (2) offer you this License 44 | giving you legal permission to copy, distribute and/or modify it. 45 | 46 | For the developers' and authors' protection, the GPL clearly explains 47 | that there is no warranty for this free software. For both users' and 48 | authors' sake, the GPL requires that modified versions be marked as 49 | changed, so that their problems will not be attributed erroneously to 50 | authors of previous versions. 51 | 52 | Some devices are designed to deny users access to install or run 53 | modified versions of the software inside them, although the manufacturer 54 | can do so. This is fundamentally incompatible with the aim of 55 | protecting users' freedom to change the software. The systematic 56 | pattern of such abuse occurs in the area of products for individuals to 57 | use, which is precisely where it is most unacceptable. Therefore, we 58 | have designed this version of the GPL to prohibit the practice for those 59 | products. If such problems arise substantially in other domains, we 60 | stand ready to extend this provision to those domains in future versions 61 | of the GPL, as needed to protect the freedom of users. 62 | 63 | Finally, every program is threatened constantly by software patents. 64 | States should not allow patents to restrict development and use of 65 | software on general-purpose computers, but in those that do, we wish to 66 | avoid the special danger that patents applied to a free program could 67 | make it effectively proprietary. To prevent this, the GPL assures that 68 | patents cannot be used to render the program non-free. 69 | 70 | The precise terms and conditions for copying, distribution and 71 | modification follow. 72 | 73 | TERMS AND CONDITIONS 74 | 75 | 0. Definitions. 76 | 77 | "This License" refers to version 3 of the GNU General Public License. 78 | 79 | "Copyright" also means copyright-like laws that apply to other kinds of 80 | works, such as semiconductor masks. 81 | 82 | "The Program" refers to any copyrightable work licensed under this 83 | License. Each licensee is addressed as "you". "Licensees" and 84 | "recipients" may be individuals or organizations. 85 | 86 | To "modify" a work means to copy from or adapt all or part of the work 87 | in a fashion requiring copyright permission, other than the making of an 88 | exact copy. The resulting work is called a "modified version" of the 89 | earlier work or a work "based on" the earlier work. 90 | 91 | A "covered work" means either the unmodified Program or a work based 92 | on the Program. 93 | 94 | To "propagate" a work means to do anything with it that, without 95 | permission, would make you directly or secondarily liable for 96 | infringement under applicable copyright law, except executing it on a 97 | computer or modifying a private copy. Propagation includes copying, 98 | distribution (with or without modification), making available to the 99 | public, and in some countries other activities as well. 100 | 101 | To "convey" a work means any kind of propagation that enables other 102 | parties to make or receive copies. Mere interaction with a user through 103 | a computer network, with no transfer of a copy, is not conveying. 104 | 105 | An interactive user interface displays "Appropriate Legal Notices" 106 | to the extent that it includes a convenient and prominently visible 107 | feature that (1) displays an appropriate copyright notice, and (2) 108 | tells the user that there is no warranty for the work (except to the 109 | extent that warranties are provided), that licensees may convey the 110 | work under this License, and how to view a copy of this License. If 111 | the interface presents a list of user commands or options, such as a 112 | menu, a prominent item in the list meets this criterion. 113 | 114 | 1. Source Code. 115 | 116 | The "source code" for a work means the preferred form of the work 117 | for making modifications to it. "Object code" means any non-source 118 | form of a work. 119 | 120 | A "Standard Interface" means an interface that either is an official 121 | standard defined by a recognized standards body, or, in the case of 122 | interfaces specified for a particular programming language, one that 123 | is widely used among developers working in that language. 124 | 125 | The "System Libraries" of an executable work include anything, other 126 | than the work as a whole, that (a) is included in the normal form of 127 | packaging a Major Component, but which is not part of that Major 128 | Component, and (b) serves only to enable use of the work with that 129 | Major Component, or to implement a Standard Interface for which an 130 | implementation is available to the public in source code form. A 131 | "Major Component", in this context, means a major essential component 132 | (kernel, window system, and so on) of the specific operating system 133 | (if any) on which the executable work runs, or a compiler used to 134 | produce the work, or an object code interpreter used to run it. 135 | 136 | The "Corresponding Source" for a work in object code form means all 137 | the source code needed to generate, install, and (for an executable 138 | work) run the object code and to modify the work, including scripts to 139 | control those activities. However, it does not include the work's 140 | System Libraries, or general-purpose tools or generally available free 141 | programs which are used unmodified in performing those activities but 142 | which are not part of the work. For example, Corresponding Source 143 | includes interface definition files associated with source files for 144 | the work, and the source code for shared libraries and dynamically 145 | linked subprograms that the work is specifically designed to require, 146 | such as by intimate data communication or control flow between those 147 | subprograms and other parts of the work. 148 | 149 | The Corresponding Source need not include anything that users 150 | can regenerate automatically from other parts of the Corresponding 151 | Source. 152 | 153 | The Corresponding Source for a work in source code form is that 154 | same work. 155 | 156 | 2. Basic Permissions. 157 | 158 | All rights granted under this License are granted for the term of 159 | copyright on the Program, and are irrevocable provided the stated 160 | conditions are met. This License explicitly affirms your unlimited 161 | permission to run the unmodified Program. The output from running a 162 | covered work is covered by this License only if the output, given its 163 | content, constitutes a covered work. This License acknowledges your 164 | rights of fair use or other equivalent, as provided by copyright law. 165 | 166 | You may make, run and propagate covered works that you do not 167 | convey, without conditions so long as your license otherwise remains 168 | in force. You may convey covered works to others for the sole purpose 169 | of having them make modifications exclusively for you, or provide you 170 | with facilities for running those works, provided that you comply with 171 | the terms of this License in conveying all material for which you do 172 | not control copyright. Those thus making or running the covered works 173 | for you must do so exclusively on your behalf, under your direction 174 | and control, on terms that prohibit them from making any copies of 175 | your copyrighted material outside their relationship with you. 176 | 177 | Conveying under any other circumstances is permitted solely under 178 | the conditions stated below. Sublicensing is not allowed; section 10 179 | makes it unnecessary. 180 | 181 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 182 | 183 | No covered work shall be deemed part of an effective technological 184 | measure under any applicable law fulfilling obligations under article 185 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 186 | similar laws prohibiting or restricting circumvention of such 187 | measures. 188 | 189 | When you convey a covered work, you waive any legal power to forbid 190 | circumvention of technological measures to the extent such circumvention 191 | is effected by exercising rights under this License with respect to 192 | the covered work, and you disclaim any intention to limit operation or 193 | modification of the work as a means of enforcing, against the work's 194 | users, your or third parties' legal rights to forbid circumvention of 195 | technological measures. 196 | 197 | 4. Conveying Verbatim Copies. 198 | 199 | You may convey verbatim copies of the Program's source code as you 200 | receive it, in any medium, provided that you conspicuously and 201 | appropriately publish on each copy an appropriate copyright notice; 202 | keep intact all notices stating that this License and any 203 | non-permissive terms added in accord with section 7 apply to the code; 204 | keep intact all notices of the absence of any warranty; and give all 205 | recipients a copy of this License along with the Program. 206 | 207 | You may charge any price or no price for each copy that you convey, 208 | and you may offer support or warranty protection for a fee. 209 | 210 | 5. Conveying Modified Source Versions. 211 | 212 | You may convey a work based on the Program, or the modifications to 213 | produce it from the Program, in the form of source code under the 214 | terms of section 4, provided that you also meet all of these conditions: 215 | 216 | a) The work must carry prominent notices stating that you modified 217 | it, and giving a relevant date. 218 | 219 | b) The work must carry prominent notices stating that it is 220 | released under this License and any conditions added under section 221 | 7. This requirement modifies the requirement in section 4 to 222 | "keep intact all notices". 223 | 224 | c) You must license the entire work, as a whole, under this 225 | License to anyone who comes into possession of a copy. This 226 | License will therefore apply, along with any applicable section 7 227 | additional terms, to the whole of the work, and all its parts, 228 | regardless of how they are packaged. This License gives no 229 | permission to license the work in any other way, but it does not 230 | invalidate such permission if you have separately received it. 231 | 232 | d) If the work has interactive user interfaces, each must display 233 | Appropriate Legal Notices; however, if the Program has interactive 234 | interfaces that do not display Appropriate Legal Notices, your 235 | work need not make them do so. 236 | 237 | A compilation of a covered work with other separate and independent 238 | works, which are not by their nature extensions of the covered work, 239 | and which are not combined with it such as to form a larger program, 240 | in or on a volume of a storage or distribution medium, is called an 241 | "aggregate" if the compilation and its resulting copyright are not 242 | used to limit the access or legal rights of the compilation's users 243 | beyond what the individual works permit. Inclusion of a covered work 244 | in an aggregate does not cause this License to apply to the other 245 | parts of the aggregate. 246 | 247 | 6. Conveying Non-Source Forms. 248 | 249 | You may convey a covered work in object code form under the terms 250 | of sections 4 and 5, provided that you also convey the 251 | machine-readable Corresponding Source under the terms of this License, 252 | in one of these ways: 253 | 254 | a) Convey the object code in, or embodied in, a physical product 255 | (including a physical distribution medium), accompanied by the 256 | Corresponding Source fixed on a durable physical medium 257 | customarily used for software interchange. 258 | 259 | b) Convey the object code in, or embodied in, a physical product 260 | (including a physical distribution medium), accompanied by a 261 | written offer, valid for at least three years and valid for as 262 | long as you offer spare parts or customer support for that product 263 | model, to give anyone who possesses the object code either (1) a 264 | copy of the Corresponding Source for all the software in the 265 | product that is covered by this License, on a durable physical 266 | medium customarily used for software interchange, for a price no 267 | more than your reasonable cost of physically performing this 268 | conveying of source, or (2) access to copy the 269 | Corresponding Source from a network server at no charge. 270 | 271 | c) Convey individual copies of the object code with a copy of the 272 | written offer to provide the Corresponding Source. This 273 | alternative is allowed only occasionally and noncommercially, and 274 | only if you received the object code with such an offer, in accord 275 | with subsection 6b. 276 | 277 | d) Convey the object code by offering access from a designated 278 | place (gratis or for a charge), and offer equivalent access to the 279 | Corresponding Source in the same way through the same place at no 280 | further charge. You need not require recipients to copy the 281 | Corresponding Source along with the object code. If the place to 282 | copy the object code is a network server, the Corresponding Source 283 | may be on a different server (operated by you or a third party) 284 | that supports equivalent copying facilities, provided you maintain 285 | clear directions next to the object code saying where to find the 286 | Corresponding Source. Regardless of what server hosts the 287 | Corresponding Source, you remain obligated to ensure that it is 288 | available for as long as needed to satisfy these requirements. 289 | 290 | e) Convey the object code using peer-to-peer transmission, provided 291 | you inform other peers where the object code and Corresponding 292 | Source of the work are being offered to the general public at no 293 | charge under subsection 6d. 294 | 295 | A separable portion of the object code, whose source code is excluded 296 | from the Corresponding Source as a System Library, need not be 297 | included in conveying the object code work. 298 | 299 | A "User Product" is either (1) a "consumer product", which means any 300 | tangible personal property which is normally used for personal, family, 301 | or household purposes, or (2) anything designed or sold for incorporation 302 | into a dwelling. In determining whether a product is a consumer product, 303 | doubtful cases shall be resolved in favor of coverage. For a particular 304 | product received by a particular user, "normally used" refers to a 305 | typical or common use of that class of product, regardless of the status 306 | of the particular user or of the way in which the particular user 307 | actually uses, or expects or is expected to use, the product. A product 308 | is a consumer product regardless of whether the product has substantial 309 | commercial, industrial or non-consumer uses, unless such uses represent 310 | the only significant mode of use of the product. 311 | 312 | "Installation Information" for a User Product means any methods, 313 | procedures, authorization keys, or other information required to install 314 | and execute modified versions of a covered work in that User Product from 315 | a modified version of its Corresponding Source. The information must 316 | suffice to ensure that the continued functioning of the modified object 317 | code is in no case prevented or interfered with solely because 318 | modification has been made. 319 | 320 | If you convey an object code work under this section in, or with, or 321 | specifically for use in, a User Product, and the conveying occurs as 322 | part of a transaction in which the right of possession and use of the 323 | User Product is transferred to the recipient in perpetuity or for a 324 | fixed term (regardless of how the transaction is characterized), the 325 | Corresponding Source conveyed under this section must be accompanied 326 | by the Installation Information. But this requirement does not apply 327 | if neither you nor any third party retains the ability to install 328 | modified object code on the User Product (for example, the work has 329 | been installed in ROM). 330 | 331 | The requirement to provide Installation Information does not include a 332 | requirement to continue to provide support service, warranty, or updates 333 | for a work that has been modified or installed by the recipient, or for 334 | the User Product in which it has been modified or installed. Access to a 335 | network may be denied when the modification itself materially and 336 | adversely affects the operation of the network or violates the rules and 337 | protocols for communication across the network. 338 | 339 | Corresponding Source conveyed, and Installation Information provided, 340 | in accord with this section must be in a format that is publicly 341 | documented (and with an implementation available to the public in 342 | source code form), and must require no special password or key for 343 | unpacking, reading or copying. 344 | 345 | 7. Additional Terms. 346 | 347 | "Additional permissions" are terms that supplement the terms of this 348 | License by making exceptions from one or more of its conditions. 349 | Additional permissions that are applicable to the entire Program shall 350 | be treated as though they were included in this License, to the extent 351 | that they are valid under applicable law. If additional permissions 352 | apply only to part of the Program, that part may be used separately 353 | under those permissions, but the entire Program remains governed by 354 | this License without regard to the additional permissions. 355 | 356 | When you convey a copy of a covered work, you may at your option 357 | remove any additional permissions from that copy, or from any part of 358 | it. (Additional permissions may be written to require their own 359 | removal in certain cases when you modify the work.) You may place 360 | additional permissions on material, added by you to a covered work, 361 | for which you have or can give appropriate copyright permission. 362 | 363 | Notwithstanding any other provision of this License, for material you 364 | add to a covered work, you may (if authorized by the copyright holders of 365 | that material) supplement the terms of this License with terms: 366 | 367 | a) Disclaiming warranty or limiting liability differently from the 368 | terms of sections 15 and 16 of this License; or 369 | 370 | b) Requiring preservation of specified reasonable legal notices or 371 | author attributions in that material or in the Appropriate Legal 372 | Notices displayed by works containing it; or 373 | 374 | c) Prohibiting misrepresentation of the origin of that material, or 375 | requiring that modified versions of such material be marked in 376 | reasonable ways as different from the original version; or 377 | 378 | d) Limiting the use for publicity purposes of names of licensors or 379 | authors of the material; or 380 | 381 | e) Declining to grant rights under trademark law for use of some 382 | trade names, trademarks, or service marks; or 383 | 384 | f) Requiring indemnification of licensors and authors of that 385 | material by anyone who conveys the material (or modified versions of 386 | it) with contractual assumptions of liability to the recipient, for 387 | any liability that these contractual assumptions directly impose on 388 | those licensors and authors. 389 | 390 | All other non-permissive additional terms are considered "further 391 | restrictions" within the meaning of section 10. If the Program as you 392 | received it, or any part of it, contains a notice stating that it is 393 | governed by this License along with a term that is a further 394 | restriction, you may remove that term. If a license document contains 395 | a further restriction but permits relicensing or conveying under this 396 | License, you may add to a covered work material governed by the terms 397 | of that license document, provided that the further restriction does 398 | not survive such relicensing or conveying. 399 | 400 | If you add terms to a covered work in accord with this section, you 401 | must place, in the relevant source files, a statement of the 402 | additional terms that apply to those files, or a notice indicating 403 | where to find the applicable terms. 404 | 405 | Additional terms, permissive or non-permissive, may be stated in the 406 | form of a separately written license, or stated as exceptions; 407 | the above requirements apply either way. 408 | 409 | 8. Termination. 410 | 411 | You may not propagate or modify a covered work except as expressly 412 | provided under this License. Any attempt otherwise to propagate or 413 | modify it is void, and will automatically terminate your rights under 414 | this License (including any patent licenses granted under the third 415 | paragraph of section 11). 416 | 417 | However, if you cease all violation of this License, then your 418 | license from a particular copyright holder is reinstated (a) 419 | provisionally, unless and until the copyright holder explicitly and 420 | finally terminates your license, and (b) permanently, if the copyright 421 | holder fails to notify you of the violation by some reasonable means 422 | prior to 60 days after the cessation. 423 | 424 | Moreover, your license from a particular copyright holder is 425 | reinstated permanently if the copyright holder notifies you of the 426 | violation by some reasonable means, this is the first time you have 427 | received notice of violation of this License (for any work) from that 428 | copyright holder, and you cure the violation prior to 30 days after 429 | your receipt of the notice. 430 | 431 | Termination of your rights under this section does not terminate the 432 | licenses of parties who have received copies or rights from you under 433 | this License. If your rights have been terminated and not permanently 434 | reinstated, you do not qualify to receive new licenses for the same 435 | material under section 10. 436 | 437 | 9. Acceptance Not Required for Having Copies. 438 | 439 | You are not required to accept this License in order to receive or 440 | run a copy of the Program. Ancillary propagation of a covered work 441 | occurring solely as a consequence of using peer-to-peer transmission 442 | to receive a copy likewise does not require acceptance. However, 443 | nothing other than this License grants you permission to propagate or 444 | modify any covered work. These actions infringe copyright if you do 445 | not accept this License. Therefore, by modifying or propagating a 446 | covered work, you indicate your acceptance of this License to do so. 447 | 448 | 10. Automatic Licensing of Downstream Recipients. 449 | 450 | Each time you convey a covered work, the recipient automatically 451 | receives a license from the original licensors, to run, modify and 452 | propagate that work, subject to this License. You are not responsible 453 | for enforcing compliance by third parties with this License. 454 | 455 | An "entity transaction" is a transaction transferring control of an 456 | organization, or substantially all assets of one, or subdividing an 457 | organization, or merging organizations. If propagation of a covered 458 | work results from an entity transaction, each party to that 459 | transaction who receives a copy of the work also receives whatever 460 | licenses to the work the party's predecessor in interest had or could 461 | give under the previous paragraph, plus a right to possession of the 462 | Corresponding Source of the work from the predecessor in interest, if 463 | the predecessor has it or can get it with reasonable efforts. 464 | 465 | You may not impose any further restrictions on the exercise of the 466 | rights granted or affirmed under this License. For example, you may 467 | not impose a license fee, royalty, or other charge for exercise of 468 | rights granted under this License, and you may not initiate litigation 469 | (including a cross-claim or counterclaim in a lawsuit) alleging that 470 | any patent claim is infringed by making, using, selling, offering for 471 | sale, or importing the Program or any portion of it. 472 | 473 | 11. Patents. 474 | 475 | A "contributor" is a copyright holder who authorizes use under this 476 | License of the Program or a work on which the Program is based. The 477 | work thus licensed is called the contributor's "contributor version". 478 | 479 | A contributor's "essential patent claims" are all patent claims 480 | owned or controlled by the contributor, whether already acquired or 481 | hereafter acquired, that would be infringed by some manner, permitted 482 | by this License, of making, using, or selling its contributor version, 483 | but do not include claims that would be infringed only as a 484 | consequence of further modification of the contributor version. For 485 | purposes of this definition, "control" includes the right to grant 486 | patent sublicenses in a manner consistent with the requirements of 487 | this License. 488 | 489 | Each contributor grants you a non-exclusive, worldwide, royalty-free 490 | patent license under the contributor's essential patent claims, to 491 | make, use, sell, offer for sale, import and otherwise run, modify and 492 | propagate the contents of its contributor version. 493 | 494 | In the following three paragraphs, a "patent license" is any express 495 | agreement or commitment, however denominated, not to enforce a patent 496 | (such as an express permission to practice a patent or covenant not to 497 | sue for patent infringement). To "grant" such a patent license to a 498 | party means to make such an agreement or commitment not to enforce a 499 | patent against the party. 500 | 501 | If you convey a covered work, knowingly relying on a patent license, 502 | and the Corresponding Source of the work is not available for anyone 503 | to copy, free of charge and under the terms of this License, through a 504 | publicly available network server or other readily accessible means, 505 | then you must either (1) cause the Corresponding Source to be so 506 | available, or (2) arrange to deprive yourself of the benefit of the 507 | patent license for this particular work, or (3) arrange, in a manner 508 | consistent with the requirements of this License, to extend the patent 509 | license to downstream recipients. "Knowingly relying" means you have 510 | actual knowledge that, but for the patent license, your conveying the 511 | covered work in a country, or your recipient's use of the covered work 512 | in a country, would infringe one or more identifiable patents in that 513 | country that you have reason to believe are valid. 514 | 515 | If, pursuant to or in connection with a single transaction or 516 | arrangement, you convey, or propagate by procuring conveyance of, a 517 | covered work, and grant a patent license to some of the parties 518 | receiving the covered work authorizing them to use, propagate, modify 519 | or convey a specific copy of the covered work, then the patent license 520 | you grant is automatically extended to all recipients of the covered 521 | work and works based on it. 522 | 523 | A patent license is "discriminatory" if it does not include within 524 | the scope of its coverage, prohibits the exercise of, or is 525 | conditioned on the non-exercise of one or more of the rights that are 526 | specifically granted under this License. You may not convey a covered 527 | work if you are a party to an arrangement with a third party that is 528 | in the business of distributing software, under which you make payment 529 | to the third party based on the extent of your activity of conveying 530 | the work, and under which the third party grants, to any of the 531 | parties who would receive the covered work from you, a discriminatory 532 | patent license (a) in connection with copies of the covered work 533 | conveyed by you (or copies made from those copies), or (b) primarily 534 | for and in connection with specific products or compilations that 535 | contain the covered work, unless you entered into that arrangement, 536 | or that patent license was granted, prior to 28 March 2007. 537 | 538 | Nothing in this License shall be construed as excluding or limiting 539 | any implied license or other defenses to infringement that may 540 | otherwise be available to you under applicable patent law. 541 | 542 | 12. No Surrender of Others' Freedom. 543 | 544 | If conditions are imposed on you (whether by court order, agreement or 545 | otherwise) that contradict the conditions of this License, they do not 546 | excuse you from the conditions of this License. If you cannot convey a 547 | covered work so as to satisfy simultaneously your obligations under this 548 | License and any other pertinent obligations, then as a consequence you may 549 | not convey it at all. For example, if you agree to terms that obligate you 550 | to collect a royalty for further conveying from those to whom you convey 551 | the Program, the only way you could satisfy both those terms and this 552 | License would be to refrain entirely from conveying the Program. 553 | 554 | 13. Use with the GNU Affero General Public License. 555 | 556 | Notwithstanding any other provision of this License, you have 557 | permission to link or combine any covered work with a work licensed 558 | under version 3 of the GNU Affero General Public License into a single 559 | combined work, and to convey the resulting work. The terms of this 560 | License will continue to apply to the part which is the covered work, 561 | but the special requirements of the GNU Affero General Public License, 562 | section 13, concerning interaction through a network will apply to the 563 | combination as such. 564 | 565 | 14. Revised Versions of this License. 566 | 567 | The Free Software Foundation may publish revised and/or new versions of 568 | the GNU General Public License from time to time. Such new versions will 569 | be similar in spirit to the present version, but may differ in detail to 570 | address new problems or concerns. 571 | 572 | Each version is given a distinguishing version number. If the 573 | Program specifies that a certain numbered version of the GNU General 574 | Public License "or any later version" applies to it, you have the 575 | option of following the terms and conditions either of that numbered 576 | version or of any later version published by the Free Software 577 | Foundation. If the Program does not specify a version number of the 578 | GNU General Public License, you may choose any version ever published 579 | by the Free Software Foundation. 580 | 581 | If the Program specifies that a proxy can decide which future 582 | versions of the GNU General Public License can be used, that proxy's 583 | public statement of acceptance of a version permanently authorizes you 584 | to choose that version for the Program. 585 | 586 | Later license versions may give you additional or different 587 | permissions. However, no additional obligations are imposed on any 588 | author or copyright holder as a result of your choosing to follow a 589 | later version. 590 | 591 | 15. Disclaimer of Warranty. 592 | 593 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 594 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 595 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 596 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 597 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 598 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 599 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 600 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 601 | 602 | 16. Limitation of Liability. 603 | 604 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 605 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 606 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 607 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 608 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 609 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 610 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 611 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 612 | SUCH DAMAGES. 613 | 614 | 17. Interpretation of Sections 15 and 16. 615 | 616 | If the disclaimer of warranty and limitation of liability provided 617 | above cannot be given local legal effect according to their terms, 618 | reviewing courts shall apply local law that most closely approximates 619 | an absolute waiver of all civil liability in connection with the 620 | Program, unless a warranty or assumption of liability accompanies a 621 | copy of the Program in return for a fee. 622 | 623 | END OF TERMS AND CONDITIONS 624 | 625 | How to Apply These Terms to Your New Programs 626 | 627 | If you develop a new program, and you want it to be of the greatest 628 | possible use to the public, the best way to achieve this is to make it 629 | free software which everyone can redistribute and change under these terms. 630 | 631 | To do so, attach the following notices to the program. It is safest 632 | to attach them to the start of each source file to most effectively 633 | state the exclusion of warranty; and each file should have at least 634 | the "copyright" line and a pointer to where the full notice is found. 635 | 636 | {one line to give the program's name and a brief idea of what it does.} 637 | Copyright (C) {year} {name of author} 638 | 639 | This program is free software: you can redistribute it and/or modify 640 | it under the terms of the GNU General Public License as published by 641 | the Free Software Foundation, either version 3 of the License, or 642 | (at your option) any later version. 643 | 644 | This program is distributed in the hope that it will be useful, 645 | but WITHOUT ANY WARRANTY; without even the implied warranty of 646 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 647 | GNU General Public License for more details. 648 | 649 | You should have received a copy of the GNU General Public License 650 | along with this program. If not, see . 651 | 652 | Also add information on how to contact you by electronic and paper mail. 653 | 654 | If the program does terminal interaction, make it output a short 655 | notice like this when it starts in an interactive mode: 656 | 657 | {project} Copyright (C) {year} {fullname} 658 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 659 | This is free software, and you are welcome to redistribute it 660 | under certain conditions; type `show c' for details. 661 | 662 | The hypothetical commands `show w' and `show c' should show the appropriate 663 | parts of the General Public License. Of course, your program's commands 664 | might be different; for a GUI interface, you would use an "about box". 665 | 666 | You should also get your employer (if you work as a programmer) or school, 667 | if any, to sign a "copyright disclaimer" for the program, if necessary. 668 | For more information on this, and how to apply and follow the GNU GPL, see 669 | . 670 | 671 | The GNU General Public License does not permit incorporating your program 672 | into proprietary programs. If your program is a subroutine library, you 673 | may consider it more useful to permit linking proprietary applications with 674 | the library. If this is what you want to do, use the GNU Lesser General 675 | Public License instead of this License. But first, please read 676 | . 677 | --------------------------------------------------------------------------------