| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 | 
							- /*
 
-  TMC26XMotorTest.ino - - TMC26X Stepper library tester for Wiring/Arduino
 
-  
 
-  Copyright (c) 2011, Interactive Matter, Marcus Nowotny
 
-  
 
-  Permission is hereby granted, free of charge, to any person obtaining a copy
 
-  of this software and associated documentation files (the "Software"), to deal
 
-  in the Software without restriction, including without limitation the rights
 
-  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 
-  copies of the Software, and to permit persons to whom the Software is
 
-  furnished to do so, subject to the following conditions:
 
-  
 
-  The above copyright notice and this permission notice shall be included in
 
-  all copies or substantial portions of the Software.
 
-  
 
-  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 
-  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
-  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 
-  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 
-  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 
-  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 
-  THE SOFTWARE.
 
-  
 
-  */
 
-  unsigned int motor_counter = 0;
 
- unsigned char motor_moved = 0;
 
- int sgThreshold = 4;
 
- int sgFilter = 0;
 
- int direction = 1;
 
- unsigned int lower_SG_threshold = 0;
 
- unsigned int upper_SG_threshold = 0;
 
- unsigned char number_of_SG_readings=0;
 
- unsigned char current_increment_step_size=0;
 
- unsigned char lower_current_limit=0;
 
- char chopperMode = 0; //0 for spread, 1 for constant off
 
- char t_off = 2;
 
- char t_blank = 24;
 
- char h_start = 8;
 
- char h_end = 6;
 
- char h_decrement = 0;
 
- void startMotor() {
 
-   Serial.println(F("Configuring stepper driver"));
 
-   //char constant_off_time, char blank_time, char hysteresis_start, char hysteresis_end, char hysteresis_decrement
 
-   tmc26XStepper.setSpreadCycleChopper(t_off,t_blank,h_start,h_end,h_decrement);
 
-   tmc26XStepper.setRandomOffTime(0);
 
-   tmc26XStepper.setMicrosteps(32);
 
-   tmc26XStepper.setStallGuardThreshold(sgThreshold,sgFilter);
 
-   //  Serial.println("config finished, starting");
 
-   digitalWrite(ENABLE_PIN,LOW);
 
-   tmc26XStepper.start();
 
-   tmc26XStepper.setSpeed(10);
 
-   TCNT2=setupTimer2(10000);
 
-   sei();
 
- }
 
- void runMotor() {
 
-   if (running && !tmc26XStepper.isMoving()) {
 
-     tmc26XStepper.step(direction*10000);
 
-     Serial.println("run");
 
-   }
 
-   if (!running & tmc26XStepper.isMoving()) {
 
-     tmc26XStepper.stop();
 
-     Serial.println("stop");
 
-   }
 
- }
 
- void setSpeed(unsigned int targetSpeed) {
 
-   if (targetSpeed>0 && targetSpeed<MAX_SPEED) {
 
-     Serial.print(F("Setting speed: ")); 
 
-     Serial.println(targetSpeed);
 
-     tmc26XStepper.setSpeed(targetSpeed);
 
-   } 
 
-   else {
 
-     Serial.print(F("improper speed "));
 
-     Serial.println(targetSpeed);
 
-   }
 
- }
 
- void setMicrostepping(int microstepping) {
 
-   if (microstepping<1 || microstepping>256) {
 
-     Serial.print(F("Improperd microstepping setting [1...256]: "));
 
-     Serial.print(microstepping);
 
-   } 
 
-   else {
 
-     tmc26XStepper.setMicrosteps(microstepping);
 
-   }
 
- }
 
- void setStallGuardThreshold(int threshold) {
 
-   if (threshold<-64 || threshold > 63) {
 
-     Serial.print(F("Improper Stall Guard Threshold [-64...63]: "));
 
-     Serial.println(threshold);
 
-   } 
 
-   else {
 
-     sgThreshold = threshold;
 
-     tmc26XStepper.setStallGuardThreshold(threshold,sgFilter);
 
-   }
 
- }
 
- void setStallGuardFilter(int filter) {
 
-   if (filter) {
 
-     sgFilter=1;
 
-   } 
 
-   else {
 
-     sgFilter=0;
 
-   }
 
-   tmc26XStepper.setStallGuardThreshold(sgThreshold,sgFilter);
 
- }
 
- void setCurrent(int current) {
 
-   if (current>0 && current <1700) {
 
-     tmc26XStepper.setCurrent(current);
 
-   } 
 
-   else {
 
-     Serial.print(F("Improper current {0 ... 1200}: "));
 
-     Serial.print(current);
 
-   }
 
- }
 
- void updateChopper() {
 
-   //we can do only spread now
 
-   if (chopperMode==0) {
 
-     tmc26XStepper.setSpreadCycleChopper(t_off,t_blank,h_start,h_end,h_decrement);
 
-   }    
 
- }
 
- void updateCoolStep() {
 
-   tmc26XStepper.setCoolStepConfiguration(
 
-     lower_SG_threshold, upper_SG_threshold, number_of_SG_readings,
 
-     current_increment_step_size, lower_current_limit);
 
- }
 
- //from http://www.uchobby.com/index.php/2007/11/24/arduino-interrupts/
 
- //Setup Timer2.s
 
- //Configures the ATMega168 8-Bit Timer2 to generate an interrupt
 
- //at the specified frequency.
 
- //Returns the timer load value which must be loaded into TCNT2
 
- //inside your ISR routine.
 
- //See the example usage below.
 
- unsigned char setupTimer2(float timeoutFrequency){
 
-   unsigned char result; //The timer load value.
 
-   //Calculate the timer load value
 
-   result=(int)((257.0-(TIMER_CLOCK_FREQ/timeoutFrequency))+0.5);
 
-   //The 257 really should be 256 but I get better results with 257.
 
-   //Timer2 Settings: Timer Prescaler /8, mode 0
 
-   //Timer clock = 16MHz/8 = 2Mhz or 0.5us
 
-   //The /8 prescale gives us a good range to work with
 
-   //so we just hard code this for now.
 
-   TCCR2A = 0;
 
-   TCCR2B = 0<<CS22 | 1<<CS21 | 0<<CS20;
 
-   //Timer2 Overflow Interrupt Enable
 
-   TIMSK2 = 1<<TOIE2;
 
-   //load the timer for its first cycle
 
-   TCNT2=result;
 
-   return(result);
 
- }
 
- ISR(TIMER2_OVF_vect) {
 
-   motor_moved = tmc26XStepper.move();
 
-   motor_counter++;
 
- }
 
 
  |