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 :D

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

Kod: Markera allt

      enginePhase = (enginePhase+4)&3;
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 :D