Control of a UniPolar Stepping Motor - Part II

copyright, Peter H. Anderson, Baltimore, MD, Nov, '99


This is an extension of Stepper_1.Bas

In Stepper_2.Bas, the notor turns on depression of a pushbutton on Pin 8. The processor reads Pins 5 and 6 (corresponding to bits 7 and 6 of PORTC) to determine the timing between outputting half steps. The processor then reads SW_DIR on Pin 7 to determine the direction. The motor in then advanced one half step in the specified direction with a specified time delay.

Note that unlike Stepper_1.Bas the Index of the current position in the pattern array is declared as being global.

The following code snippet is used to make the high nibble of PORTC inputs and the low nibble outputs. Note that the second statement inserts pullup resistors on the inputs.

      Register.DDRC = bx00001111 ' high nib are input, low nib outputs
      Register.PORTC = Register.PORTC OR bx11110000	
Note that the two switches on RC.7 and RC.6 are read by reading PORTC, and then shifting right by six bits such that the state of the two switches are in the two least significant bits of SWTime.
      SWTime = (Register.PINC \ 64) AND bx00000011
Thus, the SWTime is either, 0, 1, 2 or 3. Note that use of the Select Case construct to map these four states into a delay time.

There is a limitation on the speed of the motor as there is a considerable time overhead in reading the switches, making the appropriate decisions and the call to the turn motor routine on half step.


' Stepper_2.Bas
'
' If PB8 on Pin 8 is open, motor does not turn.  When depressed, motor
' turns in half step mode in the direction determined by SW_DIR (Pin 7) at
' speed determined by SW_SPEED1 and SW_SPEED2 (terms 5 and 6).
'
' copyright, Peter H. Anderson, Baltimore, MD, Nov, '99

Const CW as Byte = 0
Const CCW as Byte = 1

Const PB8 as Byte = 8
Const SW_DIR as Byte = 7

Dim Index as Integer	' current postition in the stepping motor patt array

Sub Main()

   Dim Patts(1 to 8) as Byte
   Dim Dir as Byte, SwTime as Byte, TimeStep as Single

   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

   Index = 1

   Do
      Register.DDRC = bx00001111	' high nib are input, low nib outputs
      Register.PORTC = Register.PORTC OR bx11110000	
                                        ' pullups on high nib

      Do				' loop until PB8 at zero
         Call PutPin(PB8, 3)
      Loop Until (GetPin(PB8) = 0)
      
      SWTime = (Register.PINC \ 64) AND bx00000011
					' two most significant bits
      Select Case (SwTime)		' determine the speed
         Case 0
               TimeStep = 0.05		' map SwTime into a delay
         Case 1
               TimeStep = 0.1
         Case 2
               TimeStep = 0.25
         Case Else
               TimeStep = 1.0
      End Select   

      Call PutPin(SW_DIR, 3)	' just to be sure pullup is in place
      Dir = GetPin(SW_DIR)               ' determine the direction	 

      Call TurnMotor(Patts, Dir, 1, TimeStep)	
   Loop

End Sub

Sub TurnMotor(ByRef Patts() as Byte, ByVal Dir as Byte, _
              ByVal Steps as Integer, ByVal TimeStep as Single)

   Dim N as Integer

   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