Stepper Motor & Device Controller

Parts List
|
Description |
Source |
Quantity |
Part
Number |
|
24V DC Power Supply |
Sola
(Allied) |
1 |
921-9350 |
|
Controller |
AMP |
1 |
3540i |
|
Chassis |
(Allied) |
1 |
806-1200 |
|
Telephone Jack |
(Allied) |
1 |
512-5836 |
|
7-Pin Female Connector |
WPI
(Allied) |
1 |
719-4520 |
|
DTDP Switches |
K&E
(Allied) |
3 |
676-9241 |
|
Relay |
SCR (Allied) |
3 |
681-0015 |
|
4-Conductor Tel Wire |
|
1 ft |
|
|
Modular Tel Plugs |
|
2 |
|
|
1K Resistor |
|
1 |
|
|
Terminal Block |
Radio
Shack |
1 |
910-321B |
|
Power Switch |
Radio
Shack |
1 |
275-602A |
|
Fuse Holder |
Radio
Shack |
1 |
270-367A |
|
1 1/2A Fuse |
Radio
Shack |
1 |
27-1006 |
|
LED |
Radio
Shack |
1 |
276-084A |
|
Grommet |
Radio
Shack |
1 |
64-3025 |
|
Circuit Board |
Radio
Shack |
1 |
276-150A |
Device Driver (for Microsoft Windows)
#include
"../include/stdsdk.h"
#define
AMP_MAXTRIAL 25
static
BOOL bInit=FALSE;
static
HANDLE hAMP=NULL;
static
WORD wSwitch=0;
static
FLOAT fSpeed=1.0;
static
CRITICAL_SECTION cs;
BOOL
AMPSet(INT nCommand,WORD wPort,LONG lParam);
BOOL
AMPGet(PLONG plParam);
static
BOOL AMPInit(VOID);
static
BOOL AMPOn(WORD wPort);
static
BOOL AMPOff(WORD wPort);
static
BOOL AMPOnOff(WORD wPort, LONG lTime);
static
BOOL AMPMotor(LONG lStep);
static
BOOL AMPMotorSpeed(LONG lSpeed);
static
BOOL AMPMotorHold(BOOL bHold);
static
BOOL AMPCommand(LPSTR lpsCode);
static
BOOL AMPQuery(LPSTR lpsCode,LPSTR lpsAnswer);
BOOL
AMPSet(INT
nCommand,WORD wPort,LONG lParam)
{
// use this command for serielized access to AMP services
BOOL bStatus;
if(bInit==FALSE)
{
if(AMPInit()==FALSE)return FALSE;
if(nCommand==CONTROLLER_INITIALIZE)return
TRUE;
}
if(nCommand==CONTROLLER_OPEN)return TRUE;
EnterCriticalSection(&cs);
switch(nCommand)
{
case CONTROLLER_INITIALIZE:
bStatus=AMPInit();
break;
case CONTROLLER_DEINITIALIZE:
DeleteCriticalSection
(&cs);
CloseHandle (hAMP);
hAMP = NULL;
return TRUE;
case CONTROLLER_ON:
if((BOOL)lParam==TRUE)bStatus=AMPOn(wPort);
else bStatus=AMPOff(wPort);
break;
case CONTROLLER_ONOFF:
if(lParam==0)bStatus=TRUE;
else
bStatus=AMPOnOff(wPort,lParam);
break;
case CONTROLLER_MOTOR:
bStatus=AMPMotor(lParam);
break;
case CONTROLLER_MOTORHOLD:
bStatus=AMPMotorHold((BOOL)lParam);
break;
case CONTROLLER_MOTORSPEED:
bStatus=AMPMotorSpeed(lParam);
break;
default:
bStatus=FALSE;
break;
}
LeaveCriticalSection(&cs);
return bStatus;
}
BOOL
AMPGet(PLONG
plParam)
{
*plParam=(LONG)wSwitch;
return(TRUE);
}
BOOL
AMPInit(VOID)
{
CHAR szBuffer[32];
WORD w;
FLOAT fData;
DCB dcb;
COMMTIMEOUTS timeouts;
if(hAMP!=NULL)
{
CloseHandle(hAMP);
hAMP=NULL;
}
w=1; //use COM1
sprintf(szBuffer,"COM%d",w);
hAMP=CreateFile (szBuffer,GENERIC_READ |
GENERIC_WRITE,
0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH,NULL);
if(GetCommState(hAMP,&dcb)==FALSE)return
FALSE;
dcb.BaudRate=CBR_9600;
dcb.fParity=FALSE;
dcb.Parity=NOPARITY;
dcb.ByteSize=8;
dcb.StopBits=ONESTOPBIT;
if (SetCommState(hAMP,&dcb)==FALSE)return
FALSE;
if(GetCommTimeouts(hAMP,&timeouts)==FALSE)return
FALSE;
timeouts.ReadIntervalTimeout=1000;
timeouts.ReadTotalTimeoutMultiplier=10;
timeouts.ReadTotalTimeoutConstant=10;
timeouts.WriteTotalTimeoutMultiplier=10;
timeouts.WriteTotalTimeoutConstant=10;
if(SetCommTimeouts(hAMP,&timeouts)==FALSE)return
FALSE;
if(AMPCommand("ST\r")==FALSE)return
FALSE;
if(AMPQuery("RS\r",szBuffer)==FALSE)return
FALSE;
if(szBuffer[0]!='R')return FALSE;
fData=(FLOAT)0.66; //0.66A motor
sprintf(szBuffer,"CC%4.2f\r",fData);
AMPCommand(szBuffer);
sprintf(szBuffer,"CI%4.2f\r",fData/2);
AMPCommand(szBuffer); //current
AMPCommand("MR3\r"); //microstepping 1/10
AMPCommand("SP0\r"); //set current position to 0
AMPCommand("SO1H\r");
AMPCommand("SO2H\r");
AMPCommand("SO3H\r");
wSwitch=0;
if(!bInit)InitializeCriticalSection
(&cs);
bInit=TRUE;
return TRUE;
}
BOOL
AMPOn(WORD
wPort)
{
if(wPort &
0x0001)AMPCommand("SO1L\r");
if(wPort &
0x0002)AMPCommand("SO2L\r");
if(wPort & 0x0004)AMPCommand("SO3L\r");
wSwitch = (WORD)(wSwitch|wPort);
return TRUE;
}
BOOL
AMPOff(WORD
wPort)
{
if(wPort &
0x0001)AMPCommand("SO1H\r");
if(wPort &
0x0002)AMPCommand("SO2H\r");
if(wPort &
0x0004)AMPCommand("SO3H\r");
wSwitch = (WORD)(wSwitch&(~wPort));
return TRUE;
}
BOOL
AMPOnOff(WORD
wPort,LONG lTime)
{
// lTime in unit of 10 ms, must be <= 65535 or 655.35 sec
CHAR szBuffer[32];
if(lTime>655350)return FALSE;
if(AMPOn(wPort)==FALSE)return FALSE;
sprintf(szBuffer,"WT%.2f\r",(FLOAT)lTime/100.0);
if(AMPCommand(szBuffer)==FALSE)return
FALSE;
if(AMPOff(wPort)==FALSE)return FALSE;
return TRUE;
}
BOOL
AMPMotor(LONG
lStep)
{
CHAR szBuffer[32];
if(lStep!=0)
{
sprintf(szBuffer,"DI%d\r",lStep);
if(AMPCommand(szBuffer)==FALSE ||
AMPCommand("FL\r")==FALSE)return FALSE;
if(lStep>0)Sleep((INT)(lStep/(fSpeed*2))+5);
else
Sleep((INT)(-lStep/(fSpeed*2))+5);
}
return TRUE;
}
BOOL
AMPMotorSpeed(LONG
lSpeed)
{
CHAR szBuffer[32];
fSpeed=(FLOAT)(lSpeed/1000.0);
sprintf(szBuffer,"VE%4.2f\r",fSpeed);
return(AMPCommand(szBuffer));
}
BOOL
AMPMotorHold(BOOL
bHold)
{
if(bHold)return(AMPCommand("ME\r"));
else return(AMPCommand("MD\r"));
}
BOOL
AMPCommand(LPSTR
lpsCode)
{
DWORD dwData;
INT i;
for(i=0;i<AMP_MAXTRIAL;++i)
{
if(WriteFile(hAMP,lpsCode,lstrlen(lpsCode),&dwData,NULL)==FALSE
||
dwData!=(DWORD)lstrlen(lpsCode))continue;
else break;
}
if(i==AMP_MAXTRIAL)return FALSE;
else return TRUE;
}
BOOL
AMPQuery(LPSTR
lpsCode,LPSTR lpsAnswer)
{
BOOL bErr=TRUE;
CHAR *lpc;
DWORD dwData;
INT i;
for(i=0;i<AMP_MAXTRIAL;++i)
{
if(WriteFile(hAMP,lpsCode,lstrlen(lpsCode),&dwData,NULL)==FALSE
||
dwData!=(DWORD)lstrlen(lpsCode))continue;
bErr=TRUE;
lpc=lpsAnswer;
do
{
if
(ReadFile(hAMP,lpc,1,&dwData,NULL)==FALSE || dwData!=1)
bErr=FALSE;
else ++lpc;
}while(*lpc!='\r' &&
bErr==TRUE);
if(bErr==TRUE)break;
}
if(i==AMP_MAXTRIAL)return FALSE;
else return TRUE;
}
Designed
by Yu-li Wang