Author:
Wichit
Sirichote M1 is a
stepper
taken
from an
old disk
drive.
There
are five
pins,
i.e.,
common,
coil 1,
2, 3 and
4.
Resistance
measured
between
common
pin and
each
coil is
about 75
Ohms.
Driving
current
for each
coil is
then
needed
about
60mA at
+5V
supply.
A
Darlington
transistor
array,
ULN2003
is used
to
increase
driving
capacity
of the
2051
chip.
Each
output
provides
500mA
max at
50V.
P1.4 to
P1.7,
four
output
pins are
connected
to the
input of
the
ULN2003
as shown
in the
circuit.
Four
4.7k
resistors
help the
2051 to
provide
more
sourcing
current
from the
+5V
supply.
The
serial
port is
optional
for your
exercises.
Many
have
provided
useful
technical,
and
application
of using
stepper,
see the
links
below.
stepper.c
stepper.c stepper.hex
I have
changed
a 10ms
time
base
with a
simple
TF0
polling
instead
of using
interrupt.
The
program
is just
to send
the
stepper's
energizing
pattern
to the
P1 every
10ms.
Flag1 is
used for
intertask
communication.
/* *
STEPPER.C *
sweeping
stepper's
rotor cw
and cww
400
steps *
Copyright
(c) 1999
by
W.Sirichote */
#include
c:\mc51\8051io.h
/*
include
i/o
header
file */ #include
c:\mc51\8051reg.h
register
unsigned
char
j,flag1,temp; register
unsigned
int
cw_n,ccw_n;
unsigned
char
step[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90} #define
n 400
/* flag1
mask
byte 0x01
run cw() 0x02
run ccw() */
main()
{
flag1=0;
serinit(9600);
disable();
/* no
need
timer
interrupt
*/ cw_n =
n; /*
initial
step
number
for cw
*/ flag1
|=0x01;
/*
initial
enable
cw() */
while(1){ {
tick_wait();
/* wait
for 10ms
elapsed
*/
energize();
/*
round-robin
execution
the
following
tasks
every
10ms */ cw(); ccw(); }
}
}
cw(){
if((flag1&0x01)!=0) { cw_n--;
/*
decrement
cw step
number
*/ if (cw_n
!=0) j++;
/* if
not zero
increment
index j
*/ else {flag1&=~0x01;
/*
disable cw()
execution
*/ ccw_n =
n; /*
reload
step
number
to ccw
counter
*/ flag1
|=0x02;
/*
enable cww()
execution
*/ } }
}
ccw(){
if((flag1&0x02)!=0) { ccw_n--;
/*
decremnent
ccw step
number
*/ if (ccw_n
!=0) j--;
/* if
not zero
decrement
index j
*/ else {flag1&=~0x02;
/*
disable ccw()
execution
*/ cw_n =
n;
/*
reload
step
number
to cw
counter
*/ flag1
|=0x01;
/*
enable cw()
execution
*/ } }
}
tick_wait(){
/*
cputick
was
replaced
by
simpler
ASM code
10ms
wait */
asm"
JNB
TCON.5,*";
/* wait
for TF0
set */ asm"
CLR
TCON.5";
/* clear
TF0 for
further
set */ asm"
ORL
TH0,#$DC";
/*
reload
TH0 with
$DC, TL0
= 0 */ }
energize(){
P1 =
step[(j&0x07)];
/* only
step 0-7
needed
*/ } Exercises
- change the speed showing the rotation becomes faster or slower than 10ms
time delay
- with
an
additional
serial
port,
write
an
initializing
function
that
receives
ascii
command
from
terminal
to
set
the
number
of
step
for
cw
and
ccw,
say.
- while
energizing
the
stepper
coils,
write
a
function
that
read
ascii
character
from
terminal
on
the
fly
to
decrease
or
increase
rotating
speed,
say.
Stepper
Links
- Jones
on
Stepping
Motors
Jones
provides
a
tutorial
covering
the
basic
of
stepping
motors
and
control
systems,
including
physics
of
the
motor,
circuits
and
software
for
motor
control.
- Basic
Stepper
Motor
Concepts
Understanding
electromagnetic
principle
underlying
the
stepper.
- Motorize Your Telescope Mel Bartels describes how to motorize telescope,
many links for amateur astronomy.
|