Monday, May 18, 2020

PIC16F887 controlling the DC servo motor without hardware PWM module

A servo motor is popular in any application where they need to adjust a precise rotation angle. Some servo motor could rotate at 180 degree range, while others could rotate at 360 degree.

popular sg90 servo motor
A popular miniature servo motor SG90.
It runs at 5V.
The control pulse is between 4.8 V to 5V.

For more timing and angle relationship click here for more information.

In this example, PIC16F887 listens to the inputs from three buttons. They are used to control three angles of rotations, 0, 90 and 180 degrees.


PIC16F887 servo motor control
Schematic diagram.
PIC16F887 clocks at 4 MHz with 5 V DC supply.
Three button used to rotate the servo between 0 and 180 degrees.

Source code is written in 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
#define _XTAL_FREQ 4000000
#define sw0  RD0
#define sw90 RD1
#define sw180 RD2
void rotate0(void){
    RD7=1;
    __delay_us(1000);
    RD7=0;
    __delay_us(19000);
}
void rotate90(void){
    RD7=1;
    __delay_us(1500);
    RD7=0;
    __delay_us(18500);
}
void rotate180(void){
    RD7=1;
    __delay_us(2000);
    RD7=0;
    __delay_us(18000);
}
void main(void){
    PORTD=0x00;
    TRISD=0x07;
   
    while(1){
        if(sw0==0){
            __delay_ms(100);
            rotate0();
        }
        if(sw90==0){
            __delay_ms(100);
            rotate90();
        }
        if(sw180==0){
            __delay_ms(100);
            rotate180();
        }      
    }
}

I took a screen shot of the simulation here.

simulation screen shot
A simulation screen shot.
The picture show the rotation command of 90 degree with some
rotation angle errors.




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)