Program Stepper_1 illustrates how to control a unipolar stepping motor.
The lower nibble of PORTC (pins 12, 11, 10 and 9) are used to interface with four sections of a ULN2803 Octal Darlington driver which drives a unipolar stepper. Note that a logic one on a BX24 output turns on the Darlington transistor which causes current to flow in the corresponding stepping motor winding.
The stepper is controlled in the half-step mode by energizing one of four windings and then two adjacent, and then the second winding alone, etc. Array Patts() has been defined in this manner. Advancing the motor in one direction is then a matter of sequentially outputting each pattern moving down through the array and the other direction by sequentially outputting moving up through the array.
The amount of travel is determined by the number of steps which are output. For a 7.5 degree motor, a full revolution is 48 full steps or 96 half steps.
The speed of the motor is determined by the amount of time between outputting each pattern.
In program Stepper_1.Bas, PortC is configured for inputs on the high nibble and for outputs on the lower nibble using the DDRC register. (Note that the inputs are not used in this routine.
Note that in outputting the pattern on the low nibble without changing what is on the high nibble of PORTC is performed by reading PORTC, making the lower four bits to 0000 (using the AND operator) and then ORing the Patt into the lower nibble.
Register.PORTC = (Register.PORTC AND bx11110000) OR Patts(Index)In turning the motor in one direction, Index is incremented, but if it extends beyond the array (8), it is set to 1. In turning the motor in the other direction, Index is decremented, but if it is less than 1, it is set to 8.
' Stepper_1.Bas ' ' Turns stepper one revolution one way and then other way one-half ' revolution. ' ' copyright, Peter H. Anderson, Baltimore, MD, Nov, '99 Const CW as Byte = 0 Const CCW as Byte = 1 Sub Main() Dim Patts(1 to 8) as Byte Patts(1) = bx00000001 ' define stepping motor patts Patts(2) = bx00000011 Patts(3) = bx00000010 Patts(4) = bx00000110 Patts(5) = bx00000100 Patts(6) = bx00001100 Patts(7) = bx00001000 Patts(8) = bx00001001 Register.DDRC = bx00001111 ' high nib are input, low nib outputs Call TurnMotor(Patts, CW, 96, 0.01) ' 96 half steps Call TurnMotor(Patts, CCW, 48, 0.1) ' 48 half steps End Sub Sub TurnMotor(ByRef Patts() as Byte, ByVal Dir as Byte, _ ByVal Steps as Integer, ByVal TimeStep as Single) Dim Index as Integer, N as Integer Index = 1 For N = 1 To Steps Register.PORTC = (Register.PORTC AND bx11110000) OR Patts(Index) Call Delay(TimeStep) If (Dir = 0) Then Index = Index + 1 If (Index > 8) Then Index = 1 End If Else Index = Index - 1 If (Index < 1) Then Index = 8 End If End If Next End Sub