Articles

hur man styr en stegmotor med A4988 förare och Arduino

den här artikeln innehåller allt du behöver veta om att styra en stegmotor med A4988 stegmotor förare och Arduino. Jag har inkluderat ett kopplingsschema, en handledning om hur man ställer in den aktuella gränsen och många exempelkoder.

även om du kan använda den här drivrutinen utan ett Arduino-bibliotek, rekommenderar jag starkt att du också tittar på exempelkoden för AccelStepper-biblioteket i slutet av denna handledning. Detta bibliotek är ganska lätt att använda och kan avsevärt förbättra prestanda för din hårdvara.

Efter varje exempel bryter jag ner och förklarar hur koden fungerar, så du borde inte ha några problem att ändra den för att passa dina behov.

Om du vill lära dig mer om andra stegmotordrivare kan artiklarna nedan vara användbara:

  • How to control a stepper motor with DRV8825 driver and Arduino
  • 28BYJ-48 Stepper Motor with ULN2003 Driver and Arduino Tutorial
  • How to control a Stepper Motor with Arduino Motor Shield Rev3
  • TB6600 Stepper Motor Driver with Arduino Tutorial

Supplies

Hardware components

A4988 stepper motor driver × 1 Amazon
AliExpress
NEMA 17 stepper motor × 1 Amazon
Arduino Uno Rev3 × 1 Amazon
Power supply (8-35 V) × 1 Amazon
AliExpress
Breadboard × 1 Amazon
Capacitor (100 µF) × 1 Amazon
Jumper wires ~ 10 Amazon
AliExpress
USB cable type A/B × 1 Amazon

Jag gillar att använda den här drivrutinen i kombination med en CNC-sköld eller expansionskort. En sådan sköld innehåller redan kondensatorer och erbjuder ett enkelt sätt att välja mikrosteppningsupplösningen. Det gör ledningarna mycket enklare och är ett bra alternativ om du behöver en mer permanent lösning än en brödbräda.

Tools

Small screwdriver Amazon
Multimeter Amazon
Alligator test leads (optional) Amazon

Software

Arduino IDE

Makerguides.com är en deltagare i Amazon Services LLC Associates-programmet, ett affiliate – annonseringsprogram som är utformat för att ge ett sätt för webbplatser att tjäna reklamavgifter genom att annonsera och länka till produkter på Amazon.com.

om föraren

i hjärtat av A4988-drivrutinen hittar du ett chip tillverkat av Allegro MicroSystems: A4988 DMOS Microstepping Driver med översättare och överströmsskydd. Denna integrerade motor driver gör gränssnitt med en mikrokontroller super lätt eftersom du bara behöver två stift för att styra både hastigheten och riktningen på stegmotorn.

föraren har en maximal uteffekt på 35 V och 2 A, vilket är bra för att köra små till medelstora stegmotorer som en NEMA 17 bipolär stegmotor.

Om du behöver styra större stegmotorer som NEMA 23, ta en titt på tb6600 stegmotordrivrutinen. Denna drivrutin kan användas med samma kod som A4988 och har ett nuvarande betyg på 3,5 A.

  • TB6600 stegmotorförare med Arduino handledning

A4988-drivrutinschipet har flera säkerhetsfunktioner inbyggda som överström, kortslutning, underspänningslåsning och övertemperaturskydd. Du hittar fler SPECIFIKATIONER i tabellen nedan.

A4988 Specifications

Minimum operating voltage 8 V
Maximum operating voltage 35 V
Continuous current per phase 1 A
Maximum current per phase 2 A
Minimum logic voltage 3 V
Maximum logic voltage 5.5 V
Microstep resolution full, 1/2, 1/4, 1/8 and 1/16
Reverse voltage protection? Nej
mått 15,5 20,5 mm (0,6″ 0,8″)
kostnad kontrollera pris

För mer information kan du kolla in databladet här.

skillnader mellan A4988 och DRV8825

DRV8825 är ganska lik A4988 men det finns några viktiga skillnader:

  • DRV8825 erbjuder 1/32 mikrosteppning, medan A4988 bara går ner till 1/16-steg. Högre mikrostepping resulterar i mjukare, tystare drift men behövs inte alltid.
  • strömbegränsningspotentiometern är på en annan plats
  • förhållandet mellan referensspänningen och strömgränsen är annorlunda.
  • DRV8825 kräver en minsta STEGPULSVARAKTIGHET på 1,9 UBS; A4988 kräver minst 1 UBS.
  • DRV8825 kan användas med en högre spänningsmotor strömförsörjning (45 V vs 35 V). Det betyder att det är mindre mottagligt för skador från LC-spänningsspikar.
  • DRV8825 kan leverera något mer ström än A4988 utan ytterligare kylning.

Observera att pinouten på DRV8825 är exakt densamma som För A4988, så den kan användas som en drop-in-ersättning!

A4899 (vänster) vs DRV8825 (höger)

mikrostepinställningar

stegmotorer har vanligtvis en stegstorlek på 1,8 eller 200 steg per varv, detta hänvisar till hela steg. En microstepping drivrutin som A4988 tillåter högre upplösningar genom att tillåta mellanliggande steg platser. Detta uppnås genom att aktivera spolarna med mellanströmnivåer.

till exempel kommer körning av en motor i kvartsstegsläge att ge 200-steg-per-varvsmotorn 800 mikrosteg per varv genom att använda fyra olika nuvarande nivåer.

A4988 pinout

väljarstiften för upplösning (stegstorlek) (MS1, MS2 och MS3) låter dig välj en av de fem stegsupplösningarna enligt tabellen nedan.

MS1 MS2 MS3 Microstep resolution
Low Low Low Full step
High Low Low 1/2 step
Low High Low 1/4 step
High High Low 1/8 step
High High High 1/16 step

alla tre ingångarna har interna 100 k-dragmotstånd i 100 K, så att de tre mikrostegsvalsstiften kopplas bort resulterar i fullstegsläge.

Jag använder ofta en CNC-sköld eller expansionskort i kombination med dessa drivrutiner. Expansionskortet har 3 dip-omkopplare för att ställa in MS1-MS3 högt eller lågt och på CNC-skärmen kan du installera hoppare. Om du använder föraren med en brödbräda kan du bara använda bygelkablar för att ansluta väljarstiften till 5 V (dvs. göra dem höga).

ledningar – anslutning A4988 till Arduino och stegmotor

kopplingsschema / schematiskt för A4988 stegmotorförare med Arduino och stegmotor.

kopplingsschemat ovan visar hur du ansluter a4899-drivrutinen till en stegmotor och Arduino.

anslutningarna anges också i följande tabell:

A4988 Connections

A4988 Connection
VMOT 8-35V
GND Motor ground
SLP RESET
RST SLP
VDD 5V
GND Logic ground
STP Pin 3
DIR Pin 2
1A, 1B, 2A, 2B Stepper motor
  • motorns strömförsörjning är ansluten till GND och VMOT (uppe till höger).
  • stegmotorns två spolar är anslutna till 1a, 1b och 2a, 2b (se nedan).
  • GND-stiftet (längst ner till höger) är anslutet till mikrokontrollerns jordstift och VDD är anslutet till 5V.
  • STP (step) och DIR (direction) – stiftet är anslutna till digital stift 3 respektive 2. Du kan välja en annan digital pin-kod om du vill, men det är de jag använde för denna handledning och exempelkoden.
  • SLP-stiftet är en aktiv låg ingång. Betydelse, att dra den här stiftet lågt sätter föraren i viloläge, vilket minimerar strömförbrukningen. RST är också en aktiv låg ingång. När du drar lågt ignoreras alla STEGINGÅNGAR tills du drar det högt. Om du inte använder stiftet kan du ansluta den till den intilliggande SLP/SLEEP-stiftet för att få den hög och aktivera föraren.
  • en (enable) – stiftet kan lämnas frånkopplat, det dras lågt som standard. När den här stiftet är högt är föraren inaktiverad.

i resten av denna handledning har jag lämnat MS1, MS2 och MS3 frånkopplad, så föraren arbetar i fullstegsläge. Detta gör det lättare att förklara koden. Normalt skulle jag använda 1/8 eller 1/16 microstepping och ansluta lämpliga stift till 5V (se tabellen i inledningen).

Varning

A4988 carrier board använder keramiska kondensatorer med låg ESR, vilket gör den mottaglig för destruktiva LC-spänningsspikar, speciellt vid användning av strömledningar längre än några tum.

för att skydda drivrutinen kan du ansluta en elektrolytkondensator mellan VMOT och GND. Pololu föreslår en kondensator på 47 ubicf eller mer (jag använde en 100 ubicf kondensator). Jag gillar dessa sortimentlådor från Amazon, så har jag alltid några kondensatorer av rätt storlek till hands.

hur man bestämmer rätt stegmotor ledningar?

Om du inte hittar databladet för din stegmotor kan det vara svårt att räkna ut hur du kopplar din motor korrekt. Jag använder följande trick för att bestämma hur man ansluter 4 tråd bipolära stegmotorer:

det enda du behöver identifiera är de två par ledningar som är anslutna till motorens två spolar. Ledningarna från en spole ansluts till 1a och 1b och den andra till 2a och 2b, polariteten spelar ingen roll.

för att hitta de två ledningarna från en spole, gör följande med motorn frånkopplad:

  1. försök att snurra stegmotorns axel för hand och märka hur svårt det är att vrida.
  2. Välj nu ett slumpmässigt par ledningar från motorn och rör de nakna ändarna tillsammans.
  3. försök sedan snurra stegmotorns axel igen.

om du känner mycket motstånd har du hittat ett par ledningar från samma spole. Om du kan snurra axeln fritt, prova ett annat par ledningar. Anslut nu de två spolarna till stiften som visas i kopplingsschemat ovan.

(om det fortfarande är oklart, vänligen lämna en kommentar nedan, Mer info finns också på RepRap.org wiki)

Hur ställer du in den aktuella gränsen?

innan du börjar programmera din Arduino och börja använda drivrutinen finns det en mycket viktig sak du behöver göra som många glömmer: Ställ in den aktuella gränsen!

detta steg är inte särskilt komplicerat men absolut nödvändigt för att skydda din stegmotor och föraren. Om du inte ställer in en lämplig strömgräns kan din motor dra mer ström än den eller din förare kan hantera, detta kommer sannolikt att skada en eller båda av dem.

för att ställa in strömgränsen måste du mäta en referensspänning och justera ombordpotentiometern i enlighet därmed. Du behöver en liten skruvmejsel, en multimeter för att mäta referensspänningen och alligatortestledningar (valfritt men mycket praktiskt).

strömbegränsningsschema för A4988-drivrutin.

för att mäta referensspänningen måste föraren drivas. A4988 behöver bara ström via VDD (5V) och du måste ansluta första och SLP tillsammans, annars slås inte drivrutinen på. Det är bäst att koppla bort stegmotorn medan du gör det.

Om du redan har anslutit drivrutinen kan du lämna allt utom stegmotorn ansluten. Du kan använda ström via USB-porten på Arduino.

A4988 Connection
VDD 5V
RST SLP
SLP RESET
GND Ground
Required connections to set the current limit

Current limit formula

The next step is to calculate the current limit with the following formel:

Current Limit = Vref (8 RCS)

Rcs är det nuvarande avkänningsmotståndet. Om du köpte en A4988-drivrutin från Pololu före januari 2017 kommer Rcs att vara 0,050 kg. Förare som säljs efter det har 0.068 Ozu strömavkänningsmotstånd.

så det betyder att för en strömgräns på 1a för ett bräde med 0,068 megapixels strömavkänningsmotstånd bör Vref vara 540 mV.

nuvarande avkänningsmotstånd platser. Bild: www.pololu.com

för att välja rätt strömgräns, ta en titt på databladet för din stegmotor. Om du inte hittar din motors nuvarande betyg rekommenderar jag att du börjar med en strömgräns på 1A. du kan alltid öka den senare om din motor/förare saknar steg.

bonusinfo: när du använder drivrutinen i fullstegsläge är strömmen genom varje spole begränsad till cirka 70% av den inställda strömgränsen. Det betyder att du måste ställa in den aktuella gränsen 40% högre eller 1.4 a i helstegsläge. När du använder microstepping gäller formeln ovan.

Observera att du måste kalibrera strömgränsen om du ändrar motorns strömförsörjningsspänning. Om din motor gör mycket ljud, försök att sänka strömgränsen. Det är bäst att ställa in nuvarande gräns precis tillräckligt högt så att motorn inte missar steg.

mätning Vref

Nu måste du mäta referensspänningen (Vref) mellan de två punkterna markerade på bilden nedan (GND och potentiometern) och justera den till det värde du beräknat.

Vref-sondpunkter (GND och potentiometer).

Jag rekommenderar att du använder alligatortestkablar fastklämda till skruvmejseln för att ställa in strömgränsen. Detta gör att du kan justera potentiometern och mäta referensspänningen samtidigt.

Obs: Det finns ett annat sätt att mäta strömgränsen och det är att direkt mäta stegmotorns strömdragning. Personligen tycker jag att ovanstående metod är mycket enklare.

Pololu nämner följande på deras hemsida:

Obs: spolströmmen kan skilja sig mycket från strömförsörjningsströmmen, så du bör inte använda strömmen uppmätt vid strömförsörjningen för att ställa in strömgränsen. Lämplig plats att sätta din nuvarande mätare är i serie med en av dina stegmotorspolar.

Pololu

nuvarande gräns FAQ

behöver jag ha stegmotorn ansluten eller inte?
Nej, du behöver inte ansluta stegmotorn till föraren när du ställer in strömgränsen. För att vara på den säkra sidan, koppla bort din motor, det stör ibland att mäta Vref-spänningen.

behöver jag vrida motorn genom att köra Arduino motor skiss?
Nej, Se frågan ovan.

behöver jag vrida potentiometerklockan-eller moturs för att höja Vref?
Detta beror på tillverkaren av föraren. Om du har en äkta Polulu breakout board av DRV8825 eller A4988 vrider du potentiometern medurs för att höja Vref och moturs för att sänka den.

kyla föraren

A4988-drivrutinen IC har en maximal strömvärde på 2 A per spole, men utan kylfläns kan den bara leverera cirka 1 A per spole innan den börjar överhettas.

föraren kommer vanligtvis med en liten självhäftande kylfläns, som jag rekommenderar att du installerar direkt. Du kan också köpa en massa små kylflänsar från Amazon för riktigt billigt.

grundläggande Arduino exempelkod för att styra en stegmotor

Nu när du har anslutit drivrutinen och ställt in den aktuella gränsen är det dags att ansluta Arduino till datorn och ladda upp lite kod. Du kan ladda upp följande exempelkod till din Arduino med Arduino IDE. För det här specifika exemplet behöver du inte installera några bibliotek.

denna skiss styr både hastigheten, antalet varv och stegmotorns spinnriktning.

Du kan kopiera koden genom att klicka på knappen längst upp till höger i kodfältet.

hur koden fungerar:

skissen börjar med att definiera steg-och riktningsstiften. Jag kopplade dem till Arduino pin 3 och 2.

uttalandet #define används för att ge ett namn till ett konstant värde. Kompilatorn ersätter alla referenser till denna konstant med det definierade värdet när programmet sammanställs. Så överallt du nämner dirPin, kommer kompilatorn att ersätta den med värdet 2 när programmet sammanställs.

jag definierade också enstepsPerRevolution konstant. Eftersom jag ställer in drivrutinen till fullstegsläge ställer jag in den till 200 steg per varv. Ändra detta värde om din inställning är annorlunda.

// Define stepper motor connections and steps per revolution:#define dirPin 2#define stepPin 3#define stepsPerRevolution 200

i avsnittetsetup() deklareras alla motorstyrstift som digital utgång med funktionenpinMode().

void setup() { // Declare pins as output: pinMode(stepPin, OUTPUT); pinMode(dirPin, OUTPUT);}

i avsnittetloop() I koden låter vi motorn snurra en revolution långsamt i CW-riktningen och en revolution snabbt i CCW-riktningen. Därefter låter vi motorn snurra 5 varv i varje riktning med hög hastighet. Så hur kontrollerar du hastigheten, spinnriktningen och antalet varv?

kontrollspinnningsriktning:

för att styra stegmotorns spinnriktning ställer vi in dir-stiftet (riktning) antingen högt eller lågt. För detta använder vi funktionen digitalWrite(). Beroende på hur du anslöt stegmotorn kommer inställningen av DIR-stiftet att låta motorn vrida CW eller CCW.

kontroll antal steg eller varv:

i denna exempelskiss kontrollerar for loops antalet steg stegmotorn tar. Koden inom för loop resulterar i 1 steg av stegmotorn. Eftersom koden i slingan exekveras 200 gånger (stegperrevolution) resulterar detta i 1 revolution. I de två sista slingorna exekveras koden inom for-slingan 1000 gånger, vilket resulterar i 1000 steg eller 5 varv.

Observera att du kan ändra den andra termen i för-slingan till vilket antal steg du vill. for(int i = 0; i < 100; i++) skulle resultera i 100 steg, eller en halv revolution.

kontrollhastighet:

stegmotorns hastighet bestäms av frekvensen av pulserna vi skickar till STEGSTIFTET. Ju högre frekvens desto snabbare går motorn. Du kan styra pulsernas frekvens genom att ändra delayMicroseconds() I koden. Ju kortare fördröjningen desto högre frekvens desto snabbare går motorn.

AccelStepper library tutorial

AccelStepper library skrivet av Mike McCauley är ett fantastiskt bibliotek att använda för ditt projekt. En av fördelarna är att den stöder acceleration och retardation, men den har också många andra fina funktioner.

Du kan ladda ner den senaste versionen av detta bibliotek här eller klicka på knappen nedan.

Du kan installera biblioteket genom att gå till skiss > inkludera Bibliotek > Lägg till .ZIP-biblioteket … i Arduino IDE.

ett annat alternativ är att navigera till Verktyg > Hantera bibliotek… eller skriv Ctrl + Skift + I på Windows. Bibliotekshanteraren öppnar och uppdaterar listan över installerade bibliotek.

Du kan söka efter ’accelstepper’ och leta efter biblioteket av Mike McCauley. Välj den senaste versionen och klicka sedan på Installera.

kontinuerlig rotation exempelkod

följande skiss kan användas för att köra en eller flera stegmotorer kontinuerligt med konstant hastighet. (Ingen acceleration eller retardation används).

hur koden fungerar:

det första steget är att inkludera biblioteket med #include <AccelStepper.h>.

// Include the AccelStepper library:#include <AccelStepper.h>

nästa steg är att definiera A4988 till Arduino-anslutningarna och motorgränssnittstypen. Motorns gränssnittstyp måste ställas in på 1 när du använder en steg-och riktningsdrivrutin. Du hittar de andra gränssnittstyperna här.

uttalandet #define används för att ge ett namn till ett konstant värde. Kompilatorn ersätter alla referenser till denna konstant med det definierade värdet när programmet sammanställs. Så överallt du nämner dirPin, kommer kompilatorn att ersätta den med värdet 2 när programmet sammanställs.

// Define stepper motor connections and motor interface type. Motor interface type must be set to 1 when using a driver:#define dirPin 2#define stepPin 3#define motorInterfaceType 1

Därefter måste du skapa en ny instans av AccelStepper-klassen med lämplig motorgränssnittstyp och anslutningar.

i det här fallet kallade jag stegmotorn ’stepper’ men du kan också använda andra namn, som ’z_motor’ eller ’liftmotor’ etc. AccelStepper liftmotor = AccelStepper(motorInterfaceType, stepPin, dirPin);. Namnet som du ger till stegmotorn kommer att användas senare för att ställa in hastighet, position och acceleration för just den motorn. Du kan skapa flera instanser av AccelStepper-klassen med olika namn och stift. Detta gör att du enkelt kan styra 2 eller fler stegmotorer samtidigt.

// Create a new instance of the AccelStepper class:AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);

i avsnittetsetup() I koden definierar vi maxhastigheten i steg / sekund. Hastigheter på mer än 1000 steg per sekund kan vara opålitliga, så jag ställer in detta som maximalt. Observera att jag anger namnet på stegmotorn (’stepper’), för vilken jag vill definiera maxhastigheten. Om du har flera stegmotorer anslutna kan du ange en annan hastighet för varje motor:

void setup() { // Set the maximum speed in steps per second: stepper.setMaxSpeed(1000); stepper2.setMaxSpeed(500);}

i loop() vi ställer först in den hastighet som vi vill att motorn ska köra på. För detta använder vi funktionen setSpeed(). (du kan också placera detta i inställningsdelen av koden).

stepper.runSpeed() omröstningar motorn och när ett steg förfaller, utför 1 steg. Detta beror på den inställda hastigheten och tiden sedan det sista steget. Om du vill ändra motorns riktning kan du ställa in en negativ hastighet: stepper.setSpeed(-400); vrider motorn åt andra hållet.

exempelkod för att styra antal steg eller varv

för att låta motorn rotera ett visst antal steg föredrar jag att använda en While loop i kombination medstepper.currentPosition(). Du kan använda följande exempelkod för att låta motorn gå fram och tillbaka.

kodförklaring:

den första delen av koden upp till loop () – sektionen är exakt densamma som i föregående exempel.

i slingan använder jag en While loop i kombination med funktionen currentPosition(). Först ställer jag in stegmotorns nuvarande position till noll med stepper.setCurrentPosition(0).

 // Set the current position to 0: stepper.setCurrentPosition(0);

Nästa använder vi while-slingan. Ett tag slinga kommer slinga kontinuerligt, och oändligt, tills uttrycket inuti parentesen, () blir falskt. Så i det här fallet kontrollerar jag om stegmotorns nuvarande läge inte är lika med 400 steg (!= betyder: är inte lika med). Även om detta inte är fallet kör vi stegmotorn med en konstant hastighet som ställts in av setSpeed().

i resten av slingan gör vi exakt samma sak, bara med en annan hastighet och målposition.

accelerations-och retardationsexempelkod

med följande skiss kan du lägga till acceleration och retardation till stegmotorns rörelser utan någon komplicerad kodning. I följande exempel går motorn fram och tillbaka med en hastighet på 200 steg per sekund och en acceleration på 30 steg per sekund per sekund.

kodförklaring:

i inställningen (), förutom maxhastigheten, måste vi definiera acceleration/retardation. För detta använder vi funktionen setAcceleration().

void setup() { // Set the maximum speed and acceleration: stepper.setMaxSpeed(200); stepper.setAcceleration(30);}

i slingavsnittet i koden använde jag ett annat sätt att låta motorn rotera ett fördefinierat antal steg. Funktionen stepper.moveTo() används för att ställa in målpositionen. Funktionen stepper.runToPostion() flyttar motorn (med acceleration/retardation) till målpositionen och blockerar tills den är i målpositionen. Eftersom den här funktionen blockerar bör du inte använda den här när du behöver styra andra saker samtidigt.

slutsats

i den här artikeln har jag visat dig hur du styr en stegmotor med A4988 stegmotor och Arduino. Jag hoppas att du tyckte att det var användbart och informativt. Om du gjorde det, Vänligen dela den med en vän som också gillar elektronik och göra saker!

Jag har personligen använt den här drivrutinen mycket för en massa 3D-skrivare och andra CNC-relaterade projekt men jag skulle gärna veta vilka projekt du planerar att bygga (eller redan har byggt) med den här drivrutinen. Om du har några frågor, förslag eller om du tror att saker saknas i denna handledning, vänligen lämna en kommentar nedan.