Tuesday, May 19, 2020

PIC16F887 interfaces to a unipolar stepper motor

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
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.

PIC16F887 interfaces to a unipolar stepper motor
The schematic diagram.
A single PortD used for both stepping and set the
direction.
RD0 to RD3 used for pulsing the four lines
of the stepper motor.
RD7 connects to a switch to get the direction
of stepping.

C source code is written using XC8.

#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.

PIC16F887 interfaces to a unipolar stepper motor
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

Search This Blog

Labels

25AA010A (1) 8051 (7) 93AA46B (1) ADC (30) Analog Comparator (1) Arduino (15) ARM (6) AT89C52 (7) ATMega32 (54) AVR (57) CCS PICC (28) DAC (1) DHT11 (2) Display (105) Distance Sensor (3) DS18B20 (3) dsPIC (2) dsPIC30F1010 (2) EEPROM (5) Environment Sensor (4) esp8266 (1) I2C (29) Input/Output (67) Interrupt (19) Keil (5) Keypad (10) LCD (46) Master/Slave (1) MAX7221 (1) MCP23017 (5) MCP23S17 (4) Meter (3) MikroC (2) Motor (15) MPLABX (66) Nokia 5110 LCD (3) OLED (2) One-Wire (6) Oscillator (8) PCB (6) PCD8544 (3) PCF8574 (5) PIC (107) PIC12F (2) PIC16F628A (2) PIC16F630 (1) PIC16F716 (3) PIC16F818 (10) PIC16F818/819 (2) PIC16F84A (15) PIC16F876A (1) PIC16F877A (9) PIC16F88 (1) PIC16F887 (60) PIC18 (19) PIC18F1220 (4) PIC18F2550 (3) PIC18F4550 (12) PWM (11) RTC (8) Sensor (10) SH1106 (1) Shift Register (11) Shift Registers (2) SPI (24) STM32 (6) STM32 Blue Pill (6) STM32CubeIDE (6) STM32F103C8T6 (6) SysTick (3) temperature sensor (11) Thermometer (21) Timer/Counter (30) TM1637 (2) UART (7) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (94)