Bipolar Stepper Motor

by Husham Samir in Circuits > Microcontrollers

69653 Views, 48 Favorites, 0 Comments

Bipolar Stepper Motor

Cir (6).JPG
I had some stepper motors from broken  HP printers ,hard drive and other electronic devices  ,So I thought that it would be a good idea to make them work.
in the beginning I started with uni-polar stepper motor (5,6 wires) with ATMEGA8 MCU and ULN2003 driver  and it simply works  but for Bipolar stepper motor(4-wires),  it was real challenge to me to make it rotate because the polarity should be reveres in each steps  ,so after some web searching I found the solution with  L298 IC  which is 4 Amp. dual H-bridge driver.
  

Materials

Cir (4).JPG

For H-Bridge Materials:
1- PCB (single side printed circuit board).
2- L298 Dual H-bridge driver.
3- 100 uF capacitor.
4- 0.01 uF ceramic capacitor.
5- 7805 voltage regulator.
6- N4001 diode (Qty. 8 diode).
7- 1/2 W 1 Ohm resistors (Qty. 2 resistors).
8- Sockets and wires.
9- Heat sink for L298.
10-Bipolar Stepper Motor.

For Controller Circuit :
1- Atmega16 plus IC holder.
2- 100 uF capacitor.
3- 0.01 uF ceramic capacitor.
4- Socket for ISP.
5- 7805 voltage regulator.

Note that you need only one 7805 regulator but I used two because I made both circuit individually for test purpose.

Circuit Digram

H-Bridge Digram.JPG
For the Circuit diagram
M1 connected to Coil A for stepper motor.
M2 connected to Coil B for stepper motor.
R1 & R2 1 Ohm resistors for current limiting.

I recommended to test  L298 circuit before connecting micro controller to avoid any damage for the Atmega16 chip.
To Test the circuit ,connect  two 12 volt DC motor one to M1 and the other to M2.
 Connect +5 volt  to ENA ,ENB & IN1 (Now M1 should rotate in specific direction ,M2 off).   
 Connect +5 volt  to ENA ,ENB & IN2 (Now M1 should rotate in reverse direction ,M2 off).
 Connect +5 volt  to ENA ,ENB & IN3 (Now M2 should rotate in specific direction ,M1 off).
 Connect +5 volt  to ENA ,ENB & IN4 (Now M2 should rotate in reverse direction ,M1 off).
if the test passed successfully you can now connect L298 to ATmega16 circuit as below:
PA0 --- IN1
PA1 --- IN2
PA2 --- IN3
PA3 --- IN4
PA4 ---ENA
PA5 ---ENB

Also find the attached datasheet for L298 for more information.

Downloads

PCB Work

H-Bridge PCB.JPG
PCB1.JPG
PCB2.JPG
PCB3.JPG
PCB4.JPG
PCB5.JPG
PCB6.JPG
PCB7.JPG
PCB8.JPG
PCB9.JPG
PCB90.JPG
PCB91.JPG
I use proteus software to draw PCB diagram ,I attached all needed files below to any one want to use or modify on this circuit.

PCB work steps:
1-Print the diagram on Photo paper on over head paper using laser printer (don't use inkjet printer ,it wont work).
2-Wash PCB and dry it well.
3-Stick the circuit on the PCB .
4-Set the Iron on maximum temperature and push strongly on PCB for about 15 minutes till the toner stick to PCB.
5-Remove the paper using you fingers and water.
6- Put the PCB in ferric Acid taking in consideration all safety precaution.
7- after Etching clean the PCB from ACID and use Acetone to remove the toner.
8-drill the holes and start to set the components and solder them.
    
       

Downloads

Controller Circuit

Atmega16 Stepper PCB.BMP
Cir (1).JPG
Cir (8).JPG
Cir (10).JPG
Any Micro controller will work for this circuit it depend on what you have in your area market and the price ,in my case I made simple Atmega16 development circuit as shown in the picture.
Note that crystal shown in the diagram not connected .

for programming Atmega16 I use AVR MKII ISP (In system programmer device ).
 


C Code

avr1.JPG
avr2.JPG
avr3.JPG
avr4.JPG
avr5.JPG
avr6.JPG
avr7.JPG
avr8.JPG
avr9.JPG
avr90.JPG
avr91.JPG
avr92.JPG
avr93.JPG
avr94.JPG
Copy below code and Paste it in AVR studio or use the attached file.
Also the attached pictures showing all the steps you need to export code to MCU using AVR studio4 .
 
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
int i;
DDRA =0xFF; //PA5=ENB ,PA4=ENA ,PA3=IN4,PA2=IN3,PA1=IN2,PA0=IN1
while (1) //loop forever
{
// Rotate Anti-Clockwise
for (i=1;i<50;i++)    //Loop from 1 till 50
{
PORTA =0b00110001;   //ENA,ENB & IN1=1 othere=0
_delay_ms(15);       // wait
PORTA= 0b00110100;   //ENA ENB & IN3=1 Others=0
_delay_ms(15);       //Wait
PORTA= 0b00110010;   //ENA ,ENB &IN2=1
_delay_ms(15);       //Wait
PORTA =0b00111000;   //ENA,ENAB &IN4=1
_delay_ms(15);       //Wait
}
// Rotate Anti-Clockwise
for (i=1;i<50;i++)   //Loop from 1 till 50
{
PORTA =0b00111000;   //ENA,ENB & IN4=1 othere=0
_delay_ms(15);       // wait
PORTA= 0b00110010;   //ENA,ENB & IN2=1 othere=0
_delay_ms(15);       //Wait
PORTA= 0b00110100;   //ENA,ENB & IN3=1 othere=0
_delay_ms(15);       //wait
PORTA =0b00110001;   //ENA,ENB & IN1=1 othere=0
_delay_ms(15);
}
}
}