Innehållsförteckning:

Kör en stegmotor med en AVR -mikroprocessor: 8 steg
Kör en stegmotor med en AVR -mikroprocessor: 8 steg

Video: Kör en stegmotor med en AVR -mikroprocessor: 8 steg

Video: Kör en stegmotor med en AVR -mikroprocessor: 8 steg
Video: Control Position and Speed of Stepper motor with L298N module using Arduino 2024, Juli
Anonim
Kör en stegmotor med en AVR -mikroprocessor
Kör en stegmotor med en AVR -mikroprocessor

Har du några borttagna stegmotorer från skrivare/hårddiskar/etc som ligger?

Några undersökningar med en ohmeter, följt av en enkel drivrutinkod på din mikroprocessor och du kommer att kliva med stil.

Steg 1: Lär känna Steppers

Lär känna Steppers
Lär känna Steppers
Lär känna Steppers
Lär känna Steppers

I grund och botten måste du ta reda på var alla de små trådarna går.

Första steget är att ta reda på om det är en unipolär eller bipolär motor. Ta en titt på Jones on Steppers för en djupare bakgrund, sedan på Ian Harries webbplats för en enkel metod för att räkna ut en okänd motor. Läs upp lite, följ sedan med på en genomgång av den här motorn jag fick för billigt. (De säljs för 0,99 dollar just nu. De är små, relativt lätta, men har inte mycket vridmoment. Vet inte vad det kommer att vara bra för ännu.)

Steg 2: Hitta gemensam grund

Hitta gemensam grund
Hitta gemensam grund
Hitta gemensam grund
Hitta gemensam grund

Så du har fem (eller fyra eller sex) ledningar. Din motor kommer att ha två halvor, och du kan förmodligen till och med berätta bara genom att titta på vilken sida varje tråd tillhör.

Om du bara tittar på fyra ledningar har du tur - det är en bipolär motor. Allt du behöver göra är att räkna ut vilka två par trådar som går ihop. Om du har en unipolär motor eller mer än 4 ledningar, måste du bryta ut din ohmeter. Det du letar efter är den gemensamma (jordade) tråden för varje halva. Du kan se vilken som slipas i en bipolär motor eftersom den har hälften av motståndet mot någon av polerna än polerna gör över sig själva. På bilden är mina anteckningar från att ansluta kablar till ledningar och notera motståndet (eller om de är anslutna alls). Du kan se att vit är marken för botten trion b/c den har hälften av motståndet mot rött eller blått som de har mot varandra. (Den här motorn är konstig och har ingen mittkran på den övre magnetspolen. Det är som om den är halvbipolär, halvunipolär. Kanske kan du använda den här för att känna av rotation i den röd-vit-blå spolen när den svart-gula spolen körs.)

Steg 3: Ta reda på stegordningen

Ta reda på stegordningen
Ta reda på stegordningen

Jag tänkte köra den här motorn som en bipolär, så jag ignorerar den vita jordledningen. Jag har bara fyra ledningar att oroa mig för.

Du kanske vill köra din unipolära motor som bipolär ändå, eftersom den använder hela spolen i båda faserna istället för att växla mellan de två halvorna av varje spole. Mer spole = mer vridmoment. Kör ström genom ett par (notera polariteten du valde) och kör sedan ström genom det andra paret samtidigt. När du kopplar ihop det andra paret, se på vilket håll motorn vrider. Skriv ner det här. Vänd nu polariteten på det första paret du valde. Anslut sedan det andra paret igen med polariteten också omvänd. Notera riktningen. Från detta bör du kunna räkna ut sekvensen för att rotera motorn i båda riktningarna. I mitt exempel slutade båda med att vrida moturs, så att gå igenom sekvensen på samma sätt som jag valde kommer att stiga motorn CCW.

Steg 4: Ta motorn för en provkörning

Tar motorn för en provkörning
Tar motorn för en provkörning

Om du inte redan har verktyg för programmering av mikroprocessorer kan du göra det värre än Ghetto Development Kit eller någon av de olika PIC -programmerarna. Anslut kablarna direkt till din mikroprocess och bränn upp den med följande kod:

/* Lekar med att få de små stegmotorerna drivna. */

/ * Inkludera fördröjningsfunktion */ #define F_CPU 1000000UL #include/ * Pin defs för ATTiny2313 *// * Medurs ordning */ #define BLUE _BV (PB0) #define BLACK _BV (PB1) #define RED _BV (PB2) #define GUL _BV (PB3) #define DELAY 200 / * millisekunder mellan steg * / int main (void) {DDRB = 0xff; / * Aktivera utmatning på alla B -stiften */ PORTB = 0x00; / * Ställ in dem alla till 0v */ while (1) {/ * huvudslinga här */ PORTB = BLÅ; _delay_ms (DELAY); PORTB = SVART; _delay_ms (DELAY); PORTB = RÖD; _delay_ms (DELAY); PORTB = GUL; _delay_ms (DELAY); }} Hur enkel är den koden? Riktigt enkelt. Allt det gör är att göra några fina definitioner så att jag kan hänvisa till trådarna efter färg snarare än deras pin-namn, och sedan växlar det dem i sekvens med en justerbar fördröjning emellan. Till att börja med valde jag en halv sekund fördröjning mellan stegen. Se den korta videon för resultaten. Om du verkligen är i ditt spel, räkna antalet steg per cykel för att räkna ut motorns enkelstegiga vinkelupplösning. (Oh yeah. PS. Körs utan laddning på 3,6v enkelt. Se batteri i video.)

Steg 5: Swing It Back and Forth

Så du har det igång medurs. Något mer intressant? Lite kodrensning, så kan vi köra den fram och tillbaka. Jag lägger sekvensen medurs i en array så att du kan gå igenom faserna med en enkel loop. Nu kan du köra slingan upp eller ner för att gå medurs eller moturs.

int main (void) {const uint8_t delay = 50; const uint8_t medurs = {BLÅ, SVART, RÖD, GUL}; uint8_t i; DDRB = 0xff; / * Aktivera utmatning på alla B -stiften */ PORTB = 0x00; / * Ställ in dem alla till 0v */ while (1) {/ * huvudslinga här */ för (i = 0; i <= 3; i ++) {/ * gå igenom färgerna medurs */ PORTB = medsols ; _delay_ms (fördröjning); } för (i = 3; i> = 0; i-) { / * gå igenom färgerna ccw * / PORTB = medurs ; _delay_ms (fördröjning); }}} Se racy-videon för back-and-forthing.

Steg 6: Jag tar aldrig halvsteg, eftersom jag inte är en halvstegare …

Sök lyrik åt sidan, halvtrappa din motor är där den är. Du får mer toppström, mer momentant vridmoment och dubbelt så stor vinkelupplösning. Halvtrappande i ett nötskal: I stället för blå, svart, röd, gul kör du motorn med blå, blå+svart, svart, svart+röd, röd, röd+gul, gul, gul+blå. Resultatet är att för halva tiden använder du båda magneterna samtidigt. Och under de tider som båda uppsättningarna är inkopplade pekar motorn halvvägs mellan de två, krymper vinkeln mellan "steg" och får motorn att gå mer smidigt. Kan du se från videon? Jag är inte säker … Nu ser delen av koden som gör halvsteget ut så här:

void halfStepping (uint16_t fördröjning, uint8_t riktning ) {uint8_t i; för (i = 0; i <= 3; i ++) {PORTB = riktning ; / * single-coil part */ _delay_ms (delay); PORTB | = riktning [i+1]; / * lägg till i halvsteg */ _delay_ms (fördröjning); }} Det första PORTB -kommandot sätter en enda pol till positiv och resten till negativ. Sedan väntar det. Sedan sätter det andra PORTB -kommandot en andra pol (på den andra lindningen) till positiv, och kopplar in båda lindningarna för 1,4x vridmomentet (och 2x strömmen). En fullständig programlista bifogas nedan. Två matriser är nu definierade (medurs, moturs) och båda har 5 element vardera för att möjliggöra i+1 -posten i halfStepping -funktionen.

Steg 7: Lägg till en motordrivrutin

Lägg till en motorförare
Lägg till en motorförare
Lägg till en motorförare
Lägg till en motorförare
Lägg till en motorförare
Lägg till en motorförare

Än så länge är allt bra.

Enda problemet är att motorn inte verkar ha så mycket vridmoment, vilket kan bero på att mikroprocessorn bara släpper ut ~ 50mA per stift. Det uppenbara nästa steget skulle vara att ansluta den till en motorförare för att förse den med mer juice. Men då tänker jag lite: jag kör den bara med 5v, och spollindningsmotståndet är ~ 125 ohm. Vilket innebär att motorn bara drar 40mA per stift, och den ska drivas alldeles utmärkt av (biffiga) AVR -chipet. Så för att få mer spänning som driver motorn anslöt jag den till ett SN754410 H-bridge-chip. Kretsen är ganska enkel. Varje stift från AVR går till en ingång, och motsvarande utgångsstift går till motorn. Chippet behöver 5v för logikavsnittet och kan ta mycket mer spänning i motorsektionen. Att köra den på 11.25v (tre 3.6v batterier) hjälpte lite. Märkbart mer vridmoment för mitt finger, men det är fortfarande inte ett kraftverk. Inte dåligt för en motor som är mindre än ett nickel, dock. Och nu har kretsen blivit en bipolär stegmotordrivrutin för allmänna ändamål. Tillagd 29 nov: Körde motorn igår kväll vid 12v ett tag och det började bli varmt. Jag är inte säker på om det var ett resonansfrekvensproblem eller om det helt enkelt var för mycket ström för lindningarna. Var i alla fall lite försiktig om du kör denna lilla motor med större spänningar.

Steg 8: Slutet

Så vad lärde jag mig? Att köra en stegmotor med en AVR (och ett H-bridge-chip) är ganska enkelt, även i det "fina" halvstegläget.

Vet dock inte riktigt vad jag ska göra med de små stegmotorerna. Några förslag?

Rekommenderad: