This is an old revision of the document!
Stepper motors can very generally be divided into unipolar and bipolar steppers. Unipolar stepper motors are characterized by their centre-tapped windings, which divide two coils into four. Stepper motors have neither built-in brushes nor internal electronics, meaning that all commutation must be performed externally. The most common commutation type is the open-loop mode: the motor driver energizes the coils following a certain pattern, but uses no feedback. Steps can be missed in case of motor shaft torque overload. Missed steps cause inaccurate positioning. Bipolar stepper motors usually have four wires and two separate coils inside; they have many features similar to those of unipolar steppers. Unipolar stepper motors can be run as bipolar stepper motors, but not vice versa.
Table of stepper motor windings.
| Pin | Unipolar winding | UP PORT | Bipolar winding | BP PORT |
|---|---|---|---|---|
| 1 | a | 1a | PB0 | |
| 2 | b | 2a | PB1 | |
| 3 | 1a | PE0/PE4 | 1b | PB2 |
| 4 | 2a | PE1/PE5 | 2b | PB3 |
| 5 | 1b | PE2/PE6 | ||
| 6 | 2b | PE3/PE7 |
Table of stepper motor drive signals from ATmega128 to the actuator board.
Bipolar.hex (moves 100 steps one direction and 100 stepes opposite direction in endless loop)
/*------------------------------------------------------------- Title: Bipolar stepper motor with Actuator Board Date: 080328 Ver.: 1.1 Compiler: AVR-GCC Target: ATmega128 Hardware: Main board, Actuator board, bipolar stepper Author: Maido Hiiemaa / Raivo Sell 2008 Notes: Optimization -02 Description: Drives stepper in both directions by 100 steps ---------------------------------------------------------------*/ #define STEPDELAY (50) // one step delay #include <avr/io.h> #include <util/delay.h> //global variables to store commutation patterns static unsigned char bipolar_pattern; //Function prototypes void bipolar_clockwise(int number_of_steps); void bipolar_counter_clockwise(int number_of_steps); ///////////////// Functions ////////////////////////////////// void bipolar_clockwise(int number_of_steps){ int i; for (i=0; i<number_of_steps; i++){ //repeat for each step bipolar_pattern = bipolar_pattern << 1; //shift pattern to the left if (bipolar_pattern>8){ bipolar_pattern=1; } // alter b'10000' to b'0001' if needed PORTB &= 0xF0; //zero last output (low bits) PORTB |= bipolar_pattern; //apply new pattern _delay_ms (STEPDELAY); //wait for the motor to complete the step } PORTB &= 0xF0; //turn off motor } void bipolar_counter_clockwise(int number_of_steps){ int i; for (i=0; i<number_of_steps; i++){//repeat for each stepbipolar_pattern = bipolar_pattern >> 1; //shift pattern to the right bipolar_pattern = bipolar_pattern >> 1; if (bipolar_pattern==0) { bipolar_pattern=8; } //alter b'0000' to b'1000' if needed PORTB &= 0xF0; //clear low bits PORTB |= bipolar_pattern; //apply pattern to output _delay_ms (STEPDELAY); //wait for the motor to complete the step } PORTB &= 0xF0;//turn off motor } ///////////////// Main function ////////////////////////////////// int main(void){ //output ports initialization DDRB=0xFF; //output port for bipolar stepper drive signals PORTB=0; //initial PORTB output bipolar_pattern=0x01; //initial pattern for bipolar stepper while(1){ bipolar_clockwise(100); bipolar_counter_clockwise(100); } }