====== Stepper motor ======
===== Theory =====
[{{ :examples:motor:stepper:stepper.jpg?200|Stepper-motor}}]
Stepper motors are widely used in applications that demand accuracy. Unlike DC motors, stepper motors do not have brushes or a commutator – they have several independent coils, which are commutated with exterior electronics (drivers). Rotating the rotor is done by commutating coils step by step, without feedback. This is one of the faults in stepper motors – in case of mechanical overloading, when the rotor is not rotating, the steps will be mixed up and movement becomes inaccurate. Two types of stepper motors are distinguished by coils: unipolar and bipolar stepper motors. Variable reluctance stepper motors have toothed windings and a toothed iron rotor. The largest pulling force is when the teeth of both sides are covering each other. In a Permanent magnet stepper motor, just like the name hints, there are permanent magnets that orient according to the polarity of the windings. In hybrid synchronous steppers, both technologies are used.
Depending on the model of stepper motor, performing one full rotation (360 degrees) of the rotor demands hundreds of steps of commutations. For stable and smooth movement, appropriate control electronics are used, which control the motor according to its parameters (inertia of the rotor, torque, resonance, etc.). In addition to control electronics, different commutating methods may be applied. Commutating one winding in a row is called Full Step Drive, and if the drive is alternated between one and two windings, it is called Half Stepping. Cosine micro-stepping is also used, allowing especially accurate and smooth control.
===== Practice =====
The Combo Module has an H-bridge to control bipolar stepper motors and a transistor matrix for unipolar stepper motors.
There are functions //bipolar_init// and //unipolar_init// in the library of the HomeLab, which set the pins as output, and functions //bipolar_halfstep// and //unipolar_halfstep//execute revolving by determined half steps. The commutation is done by the table of half steps, but more complex bit operations are used. The following code section is the HomeLab II library functions.
// Preparing for controlling the bipolar stepper motor
void bipolar_init(void)
{
DDRB |= 0x0F;
PORTB &= 0xF0;
}
// Moving the bipolar stepper motor by half steps
void bipolar_halfstep(signed char dir,
unsigned short num_steps, unsigned char speed)
{
unsigned short i;
unsigned char pattern, state1 = 0, state2 = 1;
// Insuring the direction +- 1
dir = ((dir < 0) ? -1 : +1);
// Execution of half-steps.
for (i = 0; i < num_steps; i++)
{
state1 += dir;
state2 += dir;
// Creating the pattern
pattern = (1 << ( (state1 % 8) >> 1) ) |
(1 << ( (state2 % 8) >> 1) );
// Setting the output.
PORTB = (PORTB & 0xF0) | (pattern & 0x0F);
// Taking a break to wait for executing the step
sw_delay_ms(speed);
}
// Stopping the motor
PORTB &= 0xF0;
}
Usage of the functions is demonstrated by the example program, which rotates the motor alternately to one direction and then to the other direction 200 half steps. The speed of rotating the motor is determined by the length of the breaks made between the steps. If the break is set to be too short, the motor can not accomplish the turn due to the inertia of the rotor, and the shaft does not move.
// The test program for the stepper motor of the HomeLab
#include
// Main program
int main(void)
{
// Set up of the motor
unipolar_init(0);
// Endless loop
while (true)
{
// Turning the rotor 200 half steps to one direction
// at speed of 30 ms/step.
unipolar_halfstep(0,+1, 2000, 30);
// Turning 200 half steps to the other direction
// at speed 30 ms/step.
unipolar_halfstep(0,-1, 2000, 30);
}
}
==== Task to be implemented ====
- Drive the stepper as a clock’s second hand: rotate 6° (one step chunk) every second to complete one full revolution per minute.
- Simulate an analog thermometer: map the measured temperature linearly to a fixed arc and position the stepper ‘needle’ accordingly (use previous scenarios and instructions for temperature sensor).