Wednesday, May 20, 2020

PIC16F887 interface to a bipolar stepper motor

A bipolar stepper motor commonly found in a numerical control machine, or a 3D printing machine. It gives a precise stepping angle and high torque. Its power varies with its physical size. For more information, let see this post.

In this example, I use PIC16F887 to control the bipolar stepper motor speed and direction. The direction is determined by a switch connects to RD7.

PIC16F887 interface to a bipolar stepper motor
Schematic diagram.
Pin RD0 to RD3 drive the bipolar stepper motor.
Pin RD7 set the stepping direction.
We assume that the motor working voltage
is 24 V.

Source code is written in XC8.

#include<xc.h>

// PIC16F887 Configuration Bit Settings
// 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
#define _XTAL_FREQ 4000000

#define stepTime 100

//clock wise stepping
void stepCW(){
 PORTD=0b00001100;
 __delay_ms(stepTime);
 PORTD=0b00000110;
 __delay_ms(stepTime);
 PORTD=0b00000011;
 __delay_ms(stepTime);
 PORTD=0b00001001;
 __delay_ms(stepTime);
}

//counter clock wise stepping
void stepCCW(){
 PORTD=0b00001001;
 __delay_ms(stepTime);
 PORTD=0b00000011;
 __delay_ms(stepTime);
 PORTD=0b00000110;
 __delay_ms(stepTime);
 PORTD=0b00001100;
 __delay_ms(stepTime);
}

void main(){
    /*Clear PortD*/
    PORTD=0x00;
    /*RD7 input*/
    TRISD=0x80;
    while(1){
        if(RD7==0) stepCCW();
        else stepCW();
    }
}

Let see the screen shot of the testing program.

PIC16F887 interface to a bipolar stepper motor
A screen shot of the simulation program.

Back to main tutorials page.

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)