This is an old revision of the document!


Stepper motor

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.

Electrical connections

Table of stepper motor windings.

Table of stepper motor drive signals from ATmega128 to the actuator board.

  1. Make sure all power is off.
  2. Connect the actuator board and main board with a 26-pin cable.
  3. Connect the stepper to the actuator board, as shown in Figure. Note: The unipolar motor cable must be properly connected (wires a and b, according to figure 1, connects to pin 1 and 2 on connector UNI1 or UNI2).
  4. Connect the JTAG converter with the ATmega128 main board and the PC.
  5. Finally, connect the power to the main and actuator boards.

Test programs

Bipolar.hex (moves 100 steps one direction and 100 stepes opposite direction in endless loop)

Example code

/*-------------------------------------------------------------
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);
		}
}
en/examples/motors/stepper.1238501017.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0