Stepper med Accelleration

Fra HTX Arduino
Spring til navigation Spring til søgning

Andre biblioteker til Step-motorer

Som standard kan man anvende Stepper[1] biblioteket, som er standard installeret sammen med Arduino softwaren.

Standard biblioteket til stepmotoren har det problem, at softwaren blokerer programafvikling, mens man stepper - dette kan være ret uheldigt i forbindelse med betjening og kommunikation, eller generelt det at få flere ting til at ske "samtidigt"[2] i softwaren.

Der er udviklet et bibliotek på github[3] - Unistep2. Dette bibliotek løser problematikken med at stepper-rutinen "låser" indtil der er kørt det ønskede antal step. Biblioteket har ikke acceleration indbygget.

Et andet bibliotek på airspayce.com[4] løser problemet med acceleration, men kan ikke køre to motorer samtidigt.

Biblioteket med acceleration til Step-motorer

Dette bibliotek kan hentes i denne zip-fil. Biblioteket indeholder to forskellige eksempler, som illustrerer hvordan metoderne til biblioteket kan anvendes, og de er lavet man kan optimere parametrene for sin motor og det mekanik der drives af motoren.

Biblioteket er skrevet til at kunne fungere sammen med polling, så man kan afvikle andre aktiviteter samtidigt med at softwaren fungerer, og så man kan accelerere og decelerere motoren, så man kan optimere hastigheden på motoren.

Opsætning af motor

En stepmotor består normalt af to spolesæt, som det er gennemgået på stepmotor siden.

Et spolesæt kan styres med en eller to udgange. Hvis man har lavet den elektriske styring, så en udgang kan styre magnetfeltet enten i den ene eller den anden retning, men ikke slukke for det, så kan man styre motoren med kun to udgange, men man kan også kun styre motoren i full-step mode. Her skal man anvende motor type 2 som vist her:

PollStepper motora = PollStepper(12, 13, 2);

Her er de to udgange til motoren angivet som pin 12 og 13, og 2 angiver måden at styre motoren på.

Hvis styringen er lavet så man kan styre magnetfeltet individuelt i hver retning, altså at spolesættet styres af to udgange, så giver det mulighed for at man også kan have slukket magnetfeltet. Det vil gøre at man kan styre motoren som full-step ved at angive motor type 0, men man kan også styre motoren som half-step ved at angive motor type 1. Dette skal angives når man definerer sin motor. Herunder vises de to muligheder:

PollStepper motora = PollStepper(8, 9, 10, 11, 0); // Motor drevet som full-step
PollStepper motorb = PollStepper(4, 5, 6, 7, 1); // Motor drevet som half-step

På motora er pin 8 og 9 det ene spolesæt og pin 10 og 11 er det andet spolesæt. 0 angiver at det er 4 pins full-step.
På motorb er pin 4 og 5 det ene spolesæt og pin 6 og 7 er det andet spolesæt. 1 angiver at det er half-step.

Simpel anvendelse af biblioteket

For at få motoren til at fungere, så skal man kalde update metoden i sit polling-loop (typisk bare hver gang man kommer igennem sit loop), og for at køre et antal step, så anvender man go metoden.

Helt simpelt kan dette realisere som følgende:

void loop() {
  motora.update();
  if (digitalRead(3)) {
    motora.go(200);  // Start motoren med 200 step i positiv retning
  }
  // Den resterende polling kode
}

Hastigheden styres ved hjælp af tiden der hedder slowTime, som er tiden mellem hvert step ved lav hastighed for motoren. Den kan kun indstilles sammen med accelerations-parametrene som vist her:

  motora.setAccelParameters(2000, 1000, 100);  // Her indstilles step-tiden til 2000 us, altså 500 step pr. sekund

Acceleration af Step-motor

Når man skal rotere en stepmotor, så er det spolernes magnetfelt der skal trække motor-ankeret rundt, og i princippet skal magnetfeltet bremse motor-ankeret igen i den position magnetfeltet bestemmer (se yderligere beskrivelse under stepmotor), men hvis man på rette tid kan få flyttet magnetfeltet, så vil man kunne accelerere motor-ankeret videre op i hastighed. Dette vil man kunne fortsætte med op til en vis hastighed - det er spolernes evne til at danne magnetfelt der begrænser hvor hurtigt man kan rotere motoren.

Når man har fået motoren op i hastighed, så kan man ikke bare stoppe rotationen, uden at den springer et antal step over - her er man nødt til at sænke hastigheden gradvist igen (decelererer motoren).

Hvor hurtigt man kan køre med motoren afhænger af massen i motor-ankeret (som om regnes til et inertimoment), og den yderligere masse der skal roteres eller bliver konverteret til anden form for bevægelse gennem gear og trisser. Ud over det omregnede intertimoment vil der også være en friktion, som resulterer i et belastningsmoment, der også er med til at begrænse hvor hurtigt man kan køre med stepmotoren.

For illustrere hvordan softwaren accelererer og decelererer motoren, er der herunder lavet beregninger på et eksempel med steptider, hvor slowTime er sat til 4000 us og fastTime er sat til 333 us med accelerationen fordelt over 100 step. Motoren er sat til at køre 500 step. Dette resulterer i en motorhastighed som viste her, beregnet på en motor med 800 step pr. omgang:
Illustration af en stepmotors rotationshastighed ved acceleration
Illustration af en stepmotors rotationshastighed ved acceleration

Man kan regne det samlede intertimoment og belastningsmoment, og ud fra dette beregne hvor hurtigt man kan steppe motoren, men det kræver nøje kendskab til motoren data og den elektriske styring af motoren. En anden mulighed er at eksperimentere sig frem til fornuftige værdier, og så arbejde med en god sikkerhedsmargin (fx halvering af hastigheden).

For at sætte motoren i accelerations-mode kaldes metoden accelMode som vist her:

  motora.accelMode(true);

Ud over slowTime, som er beskrevet ved simpel kørsel med stepmotoren, skal der også angives en fastTime, der fastlægger step-tiden ved den maksimale hastighed, og endelig skal der fastlægges hvor mange step der skal bruges hen over accelerationen (og tilsvarende decelerationen). Disse 3 parametre indstilles med metoden setAccelParameters() som vist her:

  motora.setAccelParameters(4000, 333, 120); // Sætter parametrene for acceleration og decceleration

De 4000 er slowTime i mikrosekunder, der angiver at der skal startes med en hastighed som svarer til 250 step pr. sekund.
De 333 er fastTime i mikrosekunder, der angiver at den højeste hastighed opnås ved ca. 3000 step pr. sekund.
De 120 angiver at accelerationen sker hen over 120 step, og tilsvarende 120 step til deccelerationen.

Hvis man i sin software vil undersøge om motoren stadig kører, så kan man anvende metoden isRunning(), som er illustreret i nedenstående kode:

boolean opad = true;  // Start med at køre opad
void loop() {
  motora.update();
  if (! motora.isRunning()) {
    if (opad) {
      opad = false;  // Sæt til nedad næste gang
      motora.go(300);  // Start 300 step opad
    } else {
      opad = true;  // Sæt til opad næste gang
      motora.go(-300);  // Start 300 step nedad
    }
  }
}

Hvis man ønsker at stoppe motoren midt i kørslen, så kan man anvende metoden emergencyStop(), der kaldes som følger:

  motora.emergencyStop();

Hvis motoren er accelereret godt op, så vil den sikkert skippe en del step, inden den standser, specielt hvis der er et større inertimoment i belastningen. For at lave et mere kontrolleret stop, så kan man bruge metode decelStop(), som stopper motoren hen over det angivne antal step. Det gøres som følger:

  motora.decelStop();

Stedmæssig styring af steppermotoren

De angive metoder til at køre stepmotoren er baseret på relative bevægelser af stepmotoren.

Uanset om man anvender acceleration eller ej, så kan man anvende andre metoder, hvor man baserer sin styring på at man arbejder i absolutte positioner, så man angiver hvilken position motoren skal gå til. Man kan læse hvor motoren "står" henne, og man kan nulstille motorens position.

For at gå til en bestemt position kan man anvende metoden goTo(), som vist her:

  motora.goTo(324);

For at kunne definere hvor motoren er henne, fx. hvis man har kørt til et endestop, så kan det være praktisk at kunne definere et nulpunkt, så man kan styre ud fra dette nulpunkt. Det kan gøres med metoden resetPosition(), som vist her:

  motora.resetPosition();

Hvis man ønsker at aflæse hvor motoren er henne i positionen, så kan metoden getPosition() anvendes:

  currentPosition = motora.getPosition();

Som modulet er opbygget, så vil motoren blive ved med at køre indtil den er kommet til den position man har bedt den om. I nogle tilfælde kan man blive nødt til at stoppe kørslen, fx. ved et nødstop. Det kan gøres med metoden emergencyStop(), som vist her:

  motora.emergencyStop();

Disse mulighed kan afprøves med stepTest2 og stepSerial, der ligger under eksempler i biblioteket.

Tilpasning af en stepmotor

For at illustrere hvor meget det spiller ind, at en stepmotor belastes med et større inertimoment er der demonstreret hvordan en motor kører med forskellige belastninger.

Programmet der anvendes er stepTest, der ligger som eksempelkode ved biblioteket. Dette program udnytter Arduino Analog Keyboard der er en del af Programmerings-Shieldet, og så bruges en simpel driver til en bipolar stepmotor.


Testresultaterne kan se på følgende video (3:08):


Direkte Link

Motoren er en type der er mærket med 0,9 grad pr. step, hvilket giver 400 step pr. omgang. Det er ved full-stepping, hvis man bruger half-step, som det er gjort i eksemplet her, så er der 800 step pr. omgang.

Markeringen med et krokodillenæb nedsætter hastigheden en anelse, men er der for at det bliver tydeligt om man skipper step.

De værdier der er eksperimenteret frem til, for at vise kørslen er angivet i følgende tabel:

Visnings-eksempel slowTime fastTime accelSteps
Ubelastet simpel 843 327 125
Middel belastning - langsomt 6272 3032 153
Middel belastning - hurtigst 3200 800 122
Tung belastning - motor fri 6260 1928 122
Tung belastning - motor fastholdst 15285 2412 122

Det man bemærker ved den tunge belastning er, at i første forsøg kommer den op på en pæn rotationshastighed, men accelerationen snyder faktisk, fordi det er motoren der også roteres, og det nedsætter det aktuelle inertimoment, så den kan gennemføre rotationen. Man kan i den sidste test ses at der skal køres væsentligt langsommere, for at kunne accelerere massen korrekt, når motoren holdes fast. Det er specielt starthastigheden det går ud over. Det er ikke testet, men en acceleration hen over flere step kunne sikkert optimere den høje hastighed.

Referencer

Arduino-Modul-Oversigt
Arduino Generelt: Biblioteker - Board - Driver - Shield - Arduino Analog - Arduino Seriel

Arduino-typer: Arduino UNO - Arduino Nano - Arduino Pro Mini - Arduino MEGA 2560 - LiliyPad Mikrocontroller - Arduino DUE - WeMOS

Input-moduler Trådløse: Bluetooth - Transceiver modul - WiFi Modul - SMS Modul - I2C-RF-modtager - RF Link - GPRS/GSM - GSM_Modul

Sensorer: GPS - Strøm-sensor - I2C Humidity - Lys og Nærhed - Magnetisk Kompas - I2C barometer - Farvegenkendelsesmodul - Alkoholsensor - Accelerometer - I2C Accelerometer - I2C Gyroskop - Vejecelleforstærker - IR Distance - AC Strømsensor - Afstand - XY Joystick - Humidity - Tryksensor - Vindhastighedsmåler
Photo og IR: IR Fjernbetjening - Photo Interrupter - IR Modtager - Bevægelsescensor - Photo Refleks Sensor - VGA Kamera
Power: Power Adapter - Lithium Batteri
Lager: SD Kort
Konvertere: I2C AD-konverter
Funktionsmoduler: RFID-modul - Matrix tastatur - DS1307 RTC - ENC28J60 Ethernet - IO Expander
Touch Display: Touch Display

Output-moduler Trådløse: Bluetooth - RF Link - GPRS/GSM - Transceiver modul - WiFi Modul - SMS Modul

Display: Display Shield - Touch Display - Arduino Display - Nokia 5110 Display - Dot-Matrix - Lys-avis - I2C Display
Funktionsmoduler: Lydgiver - Lydmodul - Relæ modul - Audio Power Forstærker - ENC28J60 Ethernet - Peltier Element - IO Expander
Hukommelse: SD Kort
Motorer: Stepper Motor Driver - Stepper med Accelleration - Servo

I2C-Moduler Funktionsmoduler: DS1307 RTC - I2C-RF-modtager - I2C tastatur

Sensorer: I2C Humidity - Magnetisk Kompas - I2C barometer - I2C Accelerometer - I2C Gyroskop
Konvertere: I2C AD-konverter
Display: I2C Display