Unlike brushed DC motor, unipolar stepper could be controlled using for digital pulses. With these four digital pulses, the total rotation is difference due to the model of the stepper motor itself. It is defined by stepping angle. Some unipolar stepper motor have internal reduced gears.
Some unipolar stepper motors, removed from old photocopier and printers. |
To read more about stepper motor click here.
In this example, I mention only the controlling/stepping method. There are two stepping methods, half-stepping and full-stepping.
Now, let do the half-stepping first. Half-stepping is very easy to implement. It's done by giving a high pulse one by one of the four control line consequently. Without a microcontroller, we can implement it using CD4017 fed by a digital clock source. However, half-stepping yield a lower torque force.
I use PIC16F887 to control the stepping direction of the motor. The direction is determined by a on/off switch. The stepping speed is determined by the delay between steps. More delay times makes slower rotating speed. The delay is around one hundred milliseconds.
#include"xc.h"
// CONFIG1
#pragma config FOSC = XT
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config MCLRE = ON
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config IESO = ON
#pragma config FCMEN = ON
#pragma config LVP = ON
// CONFIG2
#pragma config BOR4V = BOR40V
#pragma config WRT = OFF
/*Parameter used for delay*/
#define _XTAL_FREQ 4000000
/*Set the step delay*/
#define stepTime 100
/*Set the button control*/
#define dirControl RD7
void stepBackward(void){
PORTD=0x01;
__delay_ms(stepTime);
PORTD=0x02;
__delay_ms(stepTime);
PORTD=0x04;
__delay_ms(stepTime);
PORTD=0x08;
__delay_ms(stepTime);
}
void stepForward(void){
PORTD=0x08;
__delay_ms(stepTime);
PORTD=0x04;
__delay_ms(stepTime);
PORTD=0x02;
__delay_ms(stepTime);
PORTD=0x01;
__delay_ms(stepTime);
}
void main(){
//Clear PortD
PORTD=0x80;
//RD7 is input
TRISD=0x80;
while(1){
if(dirControl) stepForward();
else stepBackward();
}
}
A screen shot of the simulation.
A simulation screen shot of the rotation unipolar stepper motor |
For the full-stepping, it give a higher torque force with full power. If we wish to implement the full-stepping, use the code below.
#include"xc.h"
// CONFIG1
#pragma config FOSC = XT
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config MCLRE = ON
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config IESO = ON
#pragma config FCMEN = ON
#pragma config LVP = ON
// CONFIG2
#pragma config BOR4V = BOR40V
#pragma config WRT = OFF
/*Parameter used for delay*/
#define _XTAL_FREQ 4000000
/*Set the step delay*/
#define stepTime 100
/*Set the button control*/
#define dirControl RD7
void stepForward(){
PORTD=0b1001;
__delay_ms(stepTime);
PORTD=0x0011;
__delay_ms(stepTime);
PORTD=0b0110;
__delay_ms(stepTime);
PORTD=0b1100;
__delay_ms(stepTime);
}
void stepBackward(){
PORTD=0b1100;
__delay_ms(stepTime);
PORTD=0b0110;
__delay_ms(stepTime);
PORTD=0b0011;
__delay_ms(stepTime);
PORTD=0b1001;
__delay_ms(stepTime);
}
void main(){
//Clear PortD
PORTD=0x80;
//RD7 is input
TRISD=0x80;
while(1){
if(dirControl) stepForward();
else stepBackward();
}
}
No comments:
Post a Comment