Use of a Microchip TC4469 Quad FET Driver to Control a Bipolar Stepper

copyright, Peter H Anderson, Baltimore, MD, Nov, 11

Introduction

The note illustrates how to interface the Arduino and a PICAXE with a bipolar stepper motor using a Microchip TC4469 Quad FET Driver

In Figure #1, note that when input B is at a logic one current flows from terminal 13 to terminal 12. When at a logic zero, current flows from terminal 12 to terminal 13. The same is true for the A input in controlling the second coil. Note that using this arrangement, two coils are always energized.

Schematic - Figure #1

Refer to this BiPolar Stepper Tutorial. Note that in the high torque two phase mode, two adjacent windings are always operated. This is implemented in the following routine by sequentially outputting 00, 01, 11 and 10 or the reverse. Note that the pause is implemented by constantly energizing the same two windings. The up side of this is that when in pause the motor is held. Of course, the down side is that power is always being dissipated in the motor.


Arduino - Stepper_TC4469_1

// Arduino - Stepper_TC4469_1
//
// Push - Bipolar Stepper Control, Full step
//
// Interface of Arduino with Bipolar stepper using a Microchip
// TC4469 Quad MOSFET.
//
// When Arduino Pin 8 is high, advances motor CW.  Else, when Pin 9 is high
// advances motor CCW.  Otherwise holds motor in pause.
//
// Note that two windings are always energized.
//
// copyright, Peter H Anderson, Baltimore, MD,  Oct 3, '11

#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))

#define CW 0
#define CCW 1

#include <avr\io.h>

void turn_step(byte dir);

void setup()
{
   pinMode(2, OUTPUT);
   pinMode(3, OUTPUT);
   pinMode(13, OUTPUT);
}

void loop()
{  
  byte tm=25;

  while(1)
  {
     if(digitalRead(8)==1)
     {
        turn_step(CW);
        delay(tm);
     }
     else if (digitalRead(9)==1)
     {
        turn_step(CCW);
        delay(tm);
     }

     else
     {
        delay(tm);
     }
  }
}

void turn_step(byte dir)
{
   static byte n=0;
   byte patts[4] = {0x00, 0x02, 0x03, 0x01};
  
   if (dir) // go down through patts[]
   {
     if (n == 0) // if index at bottom
     {
        n = 3;
     }
     else
     {
        --n;
     }
   }
   else // go up through patts[]
   {
      if (n == 3) // if index at top
      {
        n = 0;
      }
      else
      {
        ++n;
      }
   }
       
   if (patts[n] & 0x01)  // CW
   {
      sbi(PORTD, 2);
   }
   else
   {
      cbi(PORTD, 2);
   }
   if (patts[n] & 0x02) // CCW
   {
      sbi(PORTD, 3);
   }
   else
   {
      cbi(PORTD, 3);
   }   
}


PICAXE. Stepper_TC4469_1.Bas

Figure #2

' Stepper_TC4469_1.Bas
'
' Push - Pull Bipolar Stepper Control
'
' Interface of PICAXE with Bipolar stepper using a Microchip
' TC4469.
'
' When PinB.2 is low, advances motor CW.  Else, when PinB.3 is low
' advances motor CCW.  Otherwise holds motor in pause.
'
' copyright, Peter H Anderson, Baltimore, MD,  Oct 5, '11

#picaxe 20x2
#Terminal 9600
#No_Table
#No_Data
#freq m4

Symbol Tm = B2
Symbol Index = B3
Symbol Patt = B4
Symbol LSBit = B5
Symbol X = B6
Symbol Y = B7

Symbol CW = PinB.2
Symbol CCW = PinB.3

Symbol AAA = B.0
Symbol BBB = B.1

Main:
 
   Tm = 10
   Index = 0

 Do ' Continuous loop
    
   If CW = 0 Then
   
      If Index = 0 Then
         Index = 3
      Else
         Index = Index - 1
      End If 
      
      GoSub OutPatt
      
   Else If CCW = 0 Then
   
      If Index = 3 Then
         Index = 0
      Else
         Index = Index + 1
      End If 
      
      GoSub OutPatt
         
   End If
   
   Pause Tm
   
 Loop
   
OutPatt:
  
   Lookup Index, ($0, $1, $3, $2), Patt
   
   LSBit = Patt AND $01
   If LSBit = 1 Then
      High AAA
      'SerTxD ("A1")
   Else
      Low AAA
      'SerTxD ("A0")
   End If  
      
   Patt = Patt / 2
     
   LSBit = Patt AND $01
   If LSBit = 1 Then
      High BBB
      'SerTxD ("B1")
   Else
      Low BBB
      'SerTxD ("B0")
   End If           
   
   Return