Trinamic TMC26X Stepper Driver for Arduino
|
00001 /* 00002 TMC26XStepper.cpp - - TMC26X Stepper library for Wiring/Arduino - Version 0.1 00003 00004 based on the stepper library by Tom Igoe, et. al. 00005 00006 Copyright (c) 2011, Interactive Matter, Marcus Nowotny 00007 00008 Permission is hereby granted, free of charge, to any person obtaining a copy 00009 of this software and associated documentation files (the "Software"), to deal 00010 in the Software without restriction, including without limitation the rights 00011 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 00012 copies of the Software, and to permit persons to whom the Software is 00013 furnished to do so, subject to the following conditions: 00014 00015 The above copyright notice and this permission notice shall be included in 00016 all copies or substantial portions of the Software. 00017 00018 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 00019 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00020 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 00021 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00022 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 00023 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 00024 THE SOFTWARE. 00025 00026 */ 00027 00028 00029 // ensure this library description is only included once 00030 #ifndef TMC26XStepper_h 00031 #define TMC26XStepper_h 00032 00034 00039 #define TMC26X_OVERTEMPERATURE_PREWARING 1 00040 00041 00047 #define TMC26X_OVERTEMPERATURE_SHUTDOWN 2 00048 00049 //which values can be read out 00054 #define TMC26X_READOUT_POSITION 0 00055 00059 #define TMC26X_READOUT_STALLGUARD 1 00060 00064 #define TMC26X_READOUT_CURRENT 3 00065 00070 #define COOL_STEP_HALF_CS_LIMIT 0 00071 00075 #define COOL_STEP_QUARTDER_CS_LIMIT 1 00076 00101 class TMC26XStepper { 00102 public: 00124 TMC26XStepper(int number_of_steps, int cs_pin, int dir_pin, int step_pin, unsigned int current, unsigned int resistor=150); 00125 00133 void start(); 00134 00145 void un_start(); 00146 00147 00152 void setSpeed(unsigned int whatSpeed); 00153 00158 unsigned int getSpeed(void); 00159 00168 void setMicrosteps(int number_of_steps); 00169 00178 int getMicrosteps(void); 00179 00195 char step(int number_of_steps); 00196 00215 char move(void); 00216 00224 char isMoving(void); 00225 00230 unsigned int getStepsLeft(void); 00231 00238 char stop(void); 00239 00264 void setConstantOffTimeChopper(char constant_off_time, char blank_time, char fast_decay_time_setting, char sine_wave_offset, unsigned char use_current_comparator); 00265 00286 void setSpreadCycleChopper(char constant_off_time, char blank_time, char hysteresis_start, char hysteresis_end, char hysteresis_decrement); 00287 00303 void setRandomOffTime(char value); 00304 00312 void setCurrent(unsigned int current); 00313 00320 unsigned int getCurrent(void); 00321 00337 void setStallGuardThreshold(char stall_guard_threshold, char stall_guard_filter_enabled); 00338 00343 char getStallGuardThreshold(void); 00344 00349 char getStallGuardFilter(void); 00350 00368 void setCoolStepConfiguration(unsigned int lower_SG_threshold, unsigned int SG_hysteresis, unsigned char current_decrement_step_size, 00369 unsigned char current_increment_step_size, unsigned char lower_current_limit); 00370 00376 void setCoolStepEnabled(boolean enabled); 00377 00378 00383 boolean isCoolStepEnabled(); 00384 00389 unsigned int getCoolStepLowerSgThreshold(); 00390 00395 unsigned int getCoolStepUpperSgThreshold(); 00396 00401 unsigned char getCoolStepNumberOfSGReadings(); 00402 00407 unsigned char getCoolStepCurrentIncrementSize(); 00408 00414 unsigned char getCoolStepLowerCurrentLimit(); 00415 00422 int getMotorPosition(void); 00423 00430 int getCurrentStallGuardReading(void); 00431 00437 unsigned char getCurrentCSReading(void); 00438 00439 00444 boolean isCurrentScalingHalfed(); 00445 00453 unsigned int getCurrentCurrent(void); 00454 00463 boolean isStallGuardOverThreshold(void); 00464 00471 char getOverTemperature(void); 00472 00480 boolean isShortToGroundA(void); 00481 00488 boolean isShortToGroundB(void); 00495 boolean isOpenLoadA(void); 00496 00503 boolean isOpenLoadB(void); 00504 00511 boolean isStandStill(void); 00512 00524 boolean isStallGuardReached(void); 00525 00530 void setEnabled(boolean enabled); 00531 00537 boolean isEnabled(); 00538 00548 void readStatus(char read_value); 00549 00554 int getResistor(); 00555 00560 void debugLastStatus(void); 00565 int version(void); 00566 00567 private: 00568 unsigned int steps_left; //the steps the motor has to do to complete the movement 00569 int direction; // Direction of rotation 00570 unsigned long step_delay; // delay between steps, in ms, based on speed 00571 int number_of_steps; // total number of steps this motor can take 00572 unsigned int speed; // we need to store the current speed in order to change the speed after changing microstepping 00573 unsigned int resistor; //current sense resitor value in milliohm 00574 00575 unsigned long last_step_time; // time stamp in ms of when the last step was taken 00576 unsigned long next_step_time; // time stamp in ms of when the last step was taken 00577 00578 //driver control register copies to easily set & modify the registers 00579 unsigned long driver_control_register_value; 00580 unsigned long chopper_config_register; 00581 unsigned long cool_step_register_value; 00582 unsigned long stall_guard2_current_register_value; 00583 unsigned long driver_configuration_register_value; 00584 //the driver status result 00585 unsigned long driver_status_result; 00586 00587 //helper routione to get the top 10 bit of the readout 00588 inline int getReadoutValue(); 00589 00590 //the pins for the stepper driver 00591 unsigned char cs_pin; 00592 unsigned char step_pin; 00593 unsigned char dir_pin; 00594 00595 //status values 00596 boolean started; //if the stepper has been started yet 00597 int microsteps; //the current number of micro steps 00598 char constant_off_time; //we need to remember this value in order to enable and disable the motor 00599 unsigned char cool_step_lower_threshold; // we need to remember the threshold to enable and disable the CoolStep feature 00600 boolean cool_step_enabled; //we need to remember this to configure the coolstep if it si enabled 00601 00602 //SPI sender 00603 inline void send262(unsigned long datagram); 00604 }; 00605 00606 #endif 00607