Sida 1 av 1
Hjälp med styrning av stegmotor.
Postat: 1 februari 2010, 18:24:34
av Roze
Tjo, jag har byggt ett kort baserat kring en PIC och en UDN2916-krets.
Nu är problemet att kortet redan är gjort och byggt delvis efter en lärares tips, varpå alla current-control-inputs är ihopkopplade för att ge en Enable, och motorn är tänkt att köras med Fullstep, men jag får inte igång nån vettig hastighet på den.
det jag har är phaseA(1/0), phaseB(1/0) och enable(1/0). nån som kan hjälpa med hur jag ska styra den för att den ska gå fint och tyst? min bara hackar. en lärare sa att det hade att göra med att jag skulle accelerera den, men jag har inte förstått hur man gör, och inte har jag hittat nån c-kod att reverse-engineera heller.
nån som kan hjälpa?
Re: Hjälp med styrning av stegmotor.
Postat: 1 februari 2010, 18:56:46
av danei
Hur ser styrsekvensen ut nu?
Re: Hjälp med styrning av stegmotor.
Postat: 1 februari 2010, 22:43:41
av Roze
just nu kör jag [A=0,B=0], [A=0,B=1], [A=1,B=0], [A=1,B=1].
om det nu va det du menade.
det har funkat för denna krets tidigare, men motorn tenderar att hacka och låta mkt :/
och eftersom jag nu ändå måste bygga till en pic som endast ska styra motorn, så skulle det va trevligt med någe som inte betedde sig illa.
http://www.datasheetcatalog.org/datashe ... s/2916.pdf
datablad för H-bryggekretsen
Re: Hjälp med styrning av stegmotor.
Postat: 2 februari 2010, 10:26:18
av anders_bzn
En stegmotor startar man inte genom att börja stega den i den hastigheten man ska köra. Man börjar med att köra den sakta och sedan öka hastigheten. Det är för att den mekaniska rotorn ska följa med det elektriska fältet. Annars så kommer motorn bara stå still och brumma.
Saken är den att om man försöker ta ett nytt steg innan rotorn hunnit ikapp den elektriska fältet så kommer motorn aldrig att börja snurra.
Man startar och stoppar med en sk accelerationstabell, där har man långa tider i början och sen minskar tiderna tills man nått sin målhastighet. Hur tabellen ska se ut beror på hur det mekaniska systemet som är kopplat till motorn ser ut.
Din fråga har således inget enkelt svar, men se ovanstående som hjälp att gå i rätt riktning.
Goggla på "stepper motor acceleration table"
Re: Hjälp med styrning av stegmotor.
Postat: 2 februari 2010, 20:14:05
av danei
Hur har du kopplat? Är 0 ström i en riktning och 1 åt andra hållet?
Sekvensen ser fel ut.
Ska du köra fort så måste du rampa upp som sagt. Men jag gissar att du kör sakta för att testa nu va?
Re: Hjälp med styrning av stegmotor.
Postat: 2 februari 2010, 22:08:46
av Roze
Mjo, relativt sakta iaf
Kopplingen ser ut som följande:
http://roze.ridorana.se/old/bilder/schema-d.png
Sekvensen funkar i alla fall,
Konden som jag kör på just nu är iaf:
går engineAcc över 180 så stannar motorn
Kod: Markera allt
if(INTCONbits.TMR0IF && INTCONbits.TMR0IE){
switch(enginePhase)
case 0 :
ENGINE_PHASE_OUT_A = off;
ENGINE_PHASE_OUT_B = off;
break;
case 1 :
ENGINE_PHASE_OUT_A = off;
ENGINE_PHASE_OUT_B = on;
break;
case 2 :
ENGINE_PHASE_OUT_A = on;
ENGINE_PHASE_OUT_B = on;
break;
case 3 :
ENGINE_PHASE_OUT_A = on;
ENGINE_PHASE_OUT_B = off;
break;
}
if(engineDirection == enumDirection_left)
enginePhase++;
else
enginePhase--;
enginePhase = (enginePhase+4)&3;
TMR0L = engineAcc;
if(engineAcc < 180) engineAcc ++;
INTCONbits.TMR0IF = 0;
}
Re: Hjälp med styrning av stegmotor.
Postat: 3 februari 2010, 11:03:37
av danei
Lite kommentarer i koden skulle ju göra det mer lättläst.
Sekvensen i koden är inte samma som du postade förut. Den i koden ser rätt ut. Det du behöver tillföra är nog en upprampning av hastigheten för att kunna få den att gå fortare. Men räkna med att den tappar moment.
Re: Hjälp med styrning av stegmotor.
Postat: 3 februari 2010, 22:44:43
av Roze
Kod: Markera allt
if(INTCONbits.TMR0IF && INTCONbits.TMR0IE){
//Styr motorn enligt inställd phase
switch(enginePhase)
case 0 :
ENGINE_PHASE_OUT_A = off;
ENGINE_PHASE_OUT_B = off;
break;
case 1 :
ENGINE_PHASE_OUT_A = off;
ENGINE_PHASE_OUT_B = on;
break;
case 2 :
ENGINE_PHASE_OUT_A = on;
ENGINE_PHASE_OUT_B = on;
break;
case 3 :
ENGINE_PHASE_OUT_A = on;
ENGINE_PHASE_OUT_B = off;
break;
}
//Ökar/minskar phase beroende på håll
if(engineDirection == enumDirection_left)
enginePhase++;
else
enginePhase--;
enginePhase = (enginePhase+4)&3; //Ser till att phase aldrig går över 3 lr under 0
TMR0L = engineAcc; //Laddar timern med värdet i engineAcc (sätts till 100 när motorn startar), Timern ger interrupt när TMR0L får overflow, dvs när den når 255
if(engineAcc < 180) engineAcc ++; //Ökar värdet på acc så det ska ta kortare tid mellan pulserna
INTCONbits.TMR0IF = 0; //Slår på timern igen efter att interrupt har flaggats.
}
Och ja, sekvensen ser annorlunda ut då nån gammal lärare sa att det troligen skulle va så.
Re: Hjälp med styrning av stegmotor.
Postat: 4 februari 2010, 19:14:48
av danei
Försök läsa på lite. Du bör nog fatta varför sekvensen är som den är tex. Vad som begränsar max hastighet mm.
Re: Hjälp med styrning av stegmotor.
Postat: 4 februari 2010, 20:45:06
av limpan4all
Re: Hjälp med styrning av stegmotor.
Postat: 4 februari 2010, 22:58:49
av blueint
Borde väl räcka med: enginePhase &= 3;
Re: Hjälp med styrning av stegmotor.
Postat: 5 februari 2010, 14:16:22
av Roze
oki, hur får jag den att starta åt ett specifikt håll?
Mina tycker det e roligt att starta åt godtyckligt håll, vilket är otroligt störande
Kod: Markera allt
void runMotor(char dir){
engineDirection = dir; //Spara riktning
engineRunning = 1; //Sätt status till på
engineAcc = ENGINE_ACC_START; //Ladda starthastigheten
TMR0L = engineAcc; //Ladda timern
ENGINE_ENABLE = ENGINE_ON; //Slå på h-bryggan
T0CONbits.TMR0ON = 1; //Starta timern
}
Re: Hjälp med styrning av stegmotor.
Postat: 7 februari 2010, 05:26:59
av Roze
Problemet löst, det var h-bryggan som va paj. ena lindningen gick inte
