====== Stepper motor ======
//Necessary knowledge:
[HW] [[en:hardware:homelab:combo]],
[AVR] [[en:avr:io]],
[LIB] [[en:software:homelab:library:module:motor]], \\
[LIB] [[en:software:homelab:library:delay]]//
===== Theory =====
[{{ :examples:motor:stepper:stepper.jpg?220|Stepper-motor}}]
Stepper-motors are widely used in applications which demand accuracy. Unlike DC motors, stepper motors do not have brushes nor 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. By construction three additional segments are considered:
* Variable Reluctance Stepper (high accuracy, low torque, low price)
* Permanent Magnet Stepper (low accuracy, high torque, low price)
* Hybrid Synchronous Stepper (high accuracy, high torque, high price)
Variable reluctance stepper motors have toothed windings and toothed iron rotor. The largest pulling force is when the teeth of both sides are covering each other. In Permanent magnet stepper motor,just like the name hints, are permanent magnets which orientate 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 hundredths 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 specially accurate and smooth controlling.
**Unipolar stepper-motor **
Unipolar-stepper motor has 5 or 6 leads. According to the scheme of the motor only ¼ of the windings is activated. //Vcc// lines are usually connected to the positive power supply. During commutation the ends of windings 1a, 1b, 2a and 2b are connected through transistors only to the ground and that makes their control electronics fairly simple.
**Bipolar stepper-motor**
[{{ :examples:motor:stepper:motor_stepper_unipolar.png?250|The windings of an unipolar-stepper motor}}]
[{{ :examples:motor:stepper:motor_stepper_bipolar.png?250|The windings of a bipolar stepper-motor.}}]
Bipolar stepper motor differs from unipolar stepper motor by having the polarity of the windings altered during the commutation. Half of the windings are activated together, this allows to gain higher efficiency than unipolar stepper motors. Bipolar stepper motors have four leads, each connected to a different half-bridge. During commutation half-bridges are applying either positive or negative voltage to the ends of the windings. Unipolar motors can be started using bipolar driver: just connect lines 1a, 1b, 2a and 2b of the windings (//Vcc// will be not connected).
The commutation necessary for controlling stepper-motors with windings at full step mode and half step mode is displayed in the table below. Since in drivers for uni-polar stepper motors only opening of the transistors takes place, the steps are marked by 0 and 1. Controlling of bipolar stepper motors may need more signals and therefore the steps are marked using the polarity of the driver outputs:
^ ^ Unipolar ^^^^ Bipolar ^^^^
^ Step ^ 1A ^ 2A ^ 1B ^ 2B ^ 1A ^ 2A ^ 1B ^ 2B ^
^ Full step ^^^^^^^^^
| 1 ^ 1 | 0 | 0 | 0 ^ + | - | - | - |
| 2 | 0 ^ 1 | 0 | 0 | - ^ + | - | - |
| 3 | 0 | 0 ^ 1 | 0 | - | - ^ + | - |
| 4 | 0 | 0 | 0 ^ 1 | - | - | - ^ + |
^ Half step ^^^^^^^^^
| 1 ^ 1 | 0 | 0 | 0 ^ + | - | - | - |
| 2 ^ 1 ^ 1 | 0 | 0 ^ + ^ + | - | - |
| 3 | 0 ^ 1 | 0 | 0 | - ^ + | - | - |
| 4 | 0 ^ 1 ^ 1 | 0 | - ^ + ^ + | - |
| 5 | 0 | 0 ^ 1 | 0 | - | - ^ + | - |
| 6 | 0 | 0 ^ 1 ^ 1 | - | - ^ + ^ + |
| 7 | 0 | 0 | 0 ^ 1 | - | - | - ^ + |
| 8 ^ 1 | 0 | 0 ^ 1 ^ + | - | - ^ + |
===== Practice =====
The Combo Module has a H-bridges to control bipolar stepper motors and the transistor matrix for unipolar stepper motor.
There are functions //bipolar_init// and //unipolar_init// in the library of the HomeLab which sets the pins as output and functions //bipolar_halfstep// and //unipolar_halfstep// executes revolving by determined half steps. The commutation is done by the table of half steps, but more complex bit operations are used. Unipolar stepper motor is connected to a separate connector //Unipolar Stepper//, bipolar stepper motor is connected to a DC motor connector, where one of the bipolar motor occupies driver pins of two DC motor. The following code section is HomeLab II (ATmega2561) 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 brakes 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);
}
}