Go Down

Topic: Snelheid stappen motor met accelstapper.h (Read 576 times) previous topic - next topic

Kumalix

Hi,

Ik ben actief op het engelse gedeelte van de forum. Maar nu dacht ik doe het even in het Nederland.
Misschien makkelijker uitleggen.

Ik ben bezig met het bouwen van een CNC machine (geen 3D printer).
Nu heb ik de onderstaande code die opzich werkt. Echter als ik de startknop indruk dan gaat de stepperL in hele kleine stapjes. En luistert deze niet naar de commandos SetMaxSpeed en Set Acceleration.

Hoe zou dit komen? Ik heb veel online gezocht maar kon het niet vinden.

alvast bedankt

Code: [Select]
//DRV8825 VREF voltage NEMA 17= 0,65V can be 0.8V
//DRV8825 VREF voltage NEMA 23= 0,6AV can be 0.6V


#include <AccelStepper.h>
#include <Stepper.h>

//NEMA 17 (Actuator)
const int stepsPerRevolutionA = 200;
AccelStepper stepperA(AccelStepper::DRIVER, 3,4);      // (DRIVER, Step, Directon)
Stepper myStepperA(stepsPerRevolutionA, 4, 3);          // (Direction, Step)
byte directionPinA = 4;                                // Direction
byte stepPinA = 3;                                     // Step
int enable = 2;

//NEMA 23 (Linear motion)
const int stepsPerRevolutionL = 200;
AccelStepper stepperL(AccelStepper::DRIVER, 7,8);      // (DRIVER, Step, Directon)
Stepper myStepperL(stepsPerRevolutionL, 8, 7);          // (Direction, Step)
byte directionPinL = 8;                                // Direction
byte stepPinL = 7;                                     // Step

#define STEP_PIN 7
#define DIR_PIN 8
bool dirHigh;


//int stepCount = 0;  // number of steps the motor has taken
// MILLIS in case needed
//unsigned long startMillis;  //some global variables available anywhere in the program
//unsigned long currentMillis;
//const unsigned long period = 0;  //the value is a number of milliseconds


//ACTUATOR
//Actuator startloop switch
const int crashPin1 = 6;
int crashPin1State;
//Actuator Home position and check position for future Stapper 2
int homePin2State = analogRead(A0);

//STARTBUTTON
const int startButton = 9;
int startButtonState = 1; //1 = open->not pressed
//STRATBUTTON TOGGLE
//int state = HIGH;      // the current state of the output pin
int startButtonReading;           // the current reading from the input pin
int previouStartButtonReading = 0;    // the previous reading from the input pin
unsigned long time = 0;           // the last time the output pin was toggled
unsigned long debounce = 100UL;   // the debounce time, increase if the output flickers

void setup()




    //stepperA.setMaxSpeed(4000.0); // speeds possible up to 5000
   //stepperL.setMaxSpeed(400.0);
   // stepper.setAcceleration(100000.0);

    pinMode(directionPinA, OUTPUT);
    pinMode(stepPinA, OUTPUT);

    pinMode(crashPin1, INPUT);
    pinMode(startButton, INPUT_PULLUP);
   
    pinMode(enable, OUTPUT);
    digitalWrite(enable,LOW);

    Serial.begin(9600);
   
      int homePin2State = analogRead(A0);
   
      while(homePin2State < 50  )
      {
      homePin2State = analogRead(A0);
      myStepperA.setSpeed(1000);
      myStepperA.step(stepsPerRevolutionA);
     
      Serial.print("Home switch state = ");
      Serial.print(homePin2State);
      Serial.println(" - in the WHILE loop");
     
     
      if( homePin2State == 500)
          {
          stepperA.setCurrentPosition(0);
          break;
          }
     
      }


  stepperL.setMaxSpeed(4000);
  stepperL.setAcceleration(4000);
  //stepperL.moveTo(500);
     
}

void loop()
        {
        startButtonReading = digitalRead(startButton);
        if (startButtonReading == 1 && previouStartButtonReading == 0 && millis() - time > debounce)
               {
                 if (startButtonState == 1)
                 startButtonState = 0;
                 else
                 startButtonState = 1;

                 time = millis();
               }
        Serial.println(startButtonState);

crashPin1State = digitalRead(crashPin1);homePin2State = analogRead(A0);

     if(startButtonState == 0 && homePin2State > 500 && crashPin1State == 1)
      {
       
          if (stepperL.distanceToGo() == 0)
          stepperL.setMaxSpeed(40000);
          stepperL.setAcceleration(4000);
          stepperL.moveTo(1000);
          //stepperL.setSpeed(30000);
           Serial.print(stepperL.distanceToGo());
           Serial.print("MOTOR L Moving");
           Serial.print(stepperL.maxSpeed());
          stepperL.run();

         
      }

     
else{

     
      //stepperA.setCurrentPosition(0);
       
      Serial.print(" Start button state = ");
      Serial.print(startButtonState);
      Serial.print(" | Home switch state = ");
      Serial.print(homePin2State);
      Serial.println(" - VOID loop");
 
       if (crashPin1State == 0)
          {
          digitalWrite(enable,LOW);
          stepperA.setAcceleration(20000.0);
          stepperA.runToNewPosition(3000);
          delay(3000);
          stepperA.setAcceleration(100000.0);
          stepperA.moveTo(1000);
          stepperA.runToPosition();
          stepperA.runToNewPosition(0);
          }
       else
      {   
       (digitalWrite(enable,HIGH));

      }
}
previouStartButtonReading = startButtonReading;

}


Kumalix

Heb het al gevonden.
Het blijkt zo te zijn (na uitvoerig testen) dat als je serial.print gebruikt de loop() erg vertraagt wordt.
en daardoor ook de stappen van de stappen motor.

Zijn mijn bevinden correct?

dank

Jantje

Serial output wordt via een buffer naar de pc overgeschreven.
Zolang die buffer niet vol is komt serial print direct terug.
Eens die buffer vol is wacht serial.print tot er plaats genoeg is om alles te "printen".
Je kan dit probleem dus met 2 technieken aanpakken.
1 de buffer minder snel vullen
2 de buffer sneller legen.
De buffer minder snel vullen kan door minder of kortere boodschappen door te sturen.
De buffer sneller legen kan door een hogere baud rate tussen bord en pc.
Do not PM me a question unless you are prepared to pay for consultancy.
Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -

MAS3

Ik weet niet of jouw bevindingen kloppen.
Maar ik kan me heel goed voorstellen dat seriƫle communicatie relatief veel tijd in beslag neemt.

Wat ik wel zie is dat je nogal veel verstuurt.
En inconsequent.
De ene keer verzend je alleen iets als er ergens iets veranderd is, de andere keer zend je altijd informatie, dus ook informatie die daarmee herhaald word.
Je kunt zelf controleren of je bevindingen kloppen door de prints uit te commenteren (zet  //  voor die regel) en dan dat te testen.
Gezien je bericht heb je zoiets al gedaan om te testen.

Verder moet je je afvragen of je wel een hele volzin moet gaan versturen.
Waarom zou "S " (startButtonState) niet volstaan.
Dat is een heel stuk minder werk dan " Start button state = " (startButtonState).

En hoe vaak moet je vertellen dat je niet meer in Setup zit (en dus in je normale code) ?

Bovendien kun je dat laatste ook met LEDjes doen, geen idee of je daarmee tijd zult winnen.

Als je je terminal programma overeenstemmend instelt, en wat stuursignalen over serieel zendt, dan kun je de informatie over je start knop en de home switch op dezelfde regel updaten zonder dat je heel snel voorbij scrollende data ziet.
Zal vast een beetje tweaken zijn, maar moet kunnen (want ik heb dat gezien).
Bovendien hoef je als je het zo doet, helemaal geen "S " of een volzin te zenden bij elke update.
Maar goed, dat was je vraag niet.

Ik zie wel een dikke delay() (he bah) staan in je code.
Is die echt nodig ?

En heb je de informatie over accelstepper, met name setAcceleration (klik !) ook gelezen ?
Daar staat een voor mij vrij duidelijke mededeling over diens prijs.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Go Up