void StepperModel::resetStepper()
{
  enableStepper(false);
  currentStepcount=0;
  targetStepcount=0;
  delta=0;  
}
Beispiel #2
0
/***********************************************************
* Digital I/O f?r Motorensteuerung werden als Output
* definiert.
* @param Pointer auf Motor
* @return void
***********************************************************/
void initStepper(stepper_t *aStepper)
{
  pinMode(aStepper->statusPin, OUTPUT);
  pinMode(aStepper->modePin, OUTPUT);
  pinMode(aStepper->directionPin, OUTPUT);
  pinMode(aStepper->clockPin, OUTPUT);
  digitalWrite(aStepper->clockPin, HIGH);

  switch (aStepper->stepperStatus){
   case DISABLED:
	   disableStepper(aStepper);
	   break;
   case ENABLED:
	   enableStepper(aStepper);
	   break;
   case RUN:
	   enableStepper(aStepper);
	   break;
  }

  switch (aStepper->stepperMode){
  case FULL:
	  fullStep(aStepper);
	  break;
  case HALF:
	  halfStep(aStepper);
	  break;
  }

  switch (aStepper->direction){
  case FORWARD:
	  forward(aStepper);
	  break;
  case BACKWARD:
	  backward(aStepper);
	  break;
  }

}
void StepperModel::resetSteppersForObjectDiameter(double diameter)
{
  // Calculate the motor steps required to move per mm.
  steps_per_mm = (int)((kStepsPerRevolution/(diameter*M_PI))*kMicroStepping+0.5);
  if(endStopPin>=0)
  {
#ifdef AUTO_HOMING
    autoHoming();
#endif
    enableStepper(false);
  }
  else
    resetStepper();    
}
void StepperModel::autoHoming()
{
  enableStepper(true);
  digitalWrite(dirPin, LOW);
 
  while(digitalRead(endStopPin))
  {
        digitalWrite(stepPin, HIGH);
        digitalWrite(stepPin, LOW);
        delay(1);
  }

  currentStepcount= minStepCount-16;
}
void StepperModel::setTargetPosition(double pos)
{
   targetPosition = pos;
   targetStepcount = getStepsForMM(targetPosition);
   //Serial.println(targetStepcount);
   delta = targetStepcount-currentStepcount;
   direction = true;
   if (delta != 0) {
     enableStepper(true);
   }
   if (delta < 0) {
	delta = -delta;
	direction = false;
   }
}
/*
 * inEnablePin < 0 => No Endstop
 */
StepperModel::StepperModel(
        int inDirPin, int inStepPin, int inEnablePin, int inEndStopPin, 
        int inMs1Pin, int inMs2Pin, int inMs3Pin, 
        int inSleepPin, int inResetPin,
        bool vms1, bool vms2, bool vms3, 
        long minSC, long maxSC,
        double in_kStepsPerRevolution, int in_kMicroStepping)
{
  kStepsPerRevolution=in_kStepsPerRevolution;
  kMicroStepping=in_kMicroStepping;

  dirPin = inDirPin;
  stepPin = inStepPin;
  enablePin = inEnablePin;
  endStopPin = inEndStopPin;
  sleepPin = inSleepPin;
  resetPin = inResetPin;
  ms1Pin = inMs1Pin;
  ms2Pin = inMs2Pin;
  ms3Pin = inMs3Pin;
    
  minStepCount=minSC;
  maxStepCount=maxSC;
  
  pinMode(dirPin, OUTPUT);  
  pinMode(stepPin, OUTPUT);  
  pinMode(enablePin, OUTPUT);  
  if((sleepPin >=0))
  {
    pinMode(sleepPin, OUTPUT);
    digitalWrite(sleepPin, HIGH);
  }
  if((resetPin >=0))
  {
    pinMode(resetPin, OUTPUT);   
    digitalWrite(resetPin, HIGH); 
  }
  if(endStopPin>=0)
    pinMode(endStopPin, INPUT); 
  if((ms1Pin >=0))
  {
	  pinMode(ms1Pin, OUTPUT);  	
	  digitalWrite(ms1Pin, vms1);    
  }
  if((ms2Pin >=0))
  {
	  pinMode(ms2Pin, OUTPUT);  	
	  digitalWrite(ms2Pin, vms1);    
  }
  if((ms3Pin >=0))
  {
	  pinMode(ms3Pin, OUTPUT);  	
	  digitalWrite(ms3Pin, vms1);    
  }

  digitalWrite(dirPin, LOW);
  digitalWrite(stepPin, LOW);
 
  currentStepcount=0;
  targetStepcount=0;

  steps_per_mm = (int)((kStepsPerRevolution/(45.*M_PI))*kMicroStepping+0.5); // default value for a "normal" egg (45 mm diameter)
  enableStepper(false);
}