Saturday, May 2, 2020

Controlling a servo motor with PIC16F84A via buttons

In the previous example, I use ATMega32 to rotate a servo motor without the hardware PWM.


SG90 mini servo motor

ATMega32 controls a servo motor with three angles rotation.

In this example, I use the popular PIC16F84A microcontroller to rotate the angle of servo motor via two button. These two buttons could rotate between -90 degree to _90 degree with about 5 degree per step.



A rotating servo motor in simulator. The PIC16F84A CPU clocks at 20MHz giving
more precise timing.

Since PIC16F84A doesn't have any hardware PWM module. I use a built-in delay function of CCS PICC compiler. Any non negative variable could make the delay.


RB0 is used to increase the rotating angle. While RB1 is used to decrease the rotating angle.

To make the servo rotate, we make a high pulse ranging from 1500 uS to 2000 us, within a 20 ms period.


source code could be download here:


#include<16F84A.h>
#fuses HS
//for delay function
#use delay(clock=20M)

void main(){
   int16 highTime=0;
   unsigned int16 _H=0,_L=0;
   output_b(0x00);
   //make RB0.1 inputs
   set_tris_b(0x03);
   //turn on port b input pullups
   port_b_pullups(true);
   
   
   while(1){
      //increase the angle
      if(input(pin_B0)==0){
         delay_ms(5);
         if(_H<2000)
         highTime+=50;
         //making high pulse
         _H=1000+(highTime/18);
         //calculate the total 20 ms period
         _L=20000-_H;
         //start the rotation
         output_high(PIN_B2);
         delay_us(_H);
         output_low(PIN_B2);
         delay_us(_L);
      }
      //decrease the angle
      if(input(pin_B1)==0){
         delay_ms(5);
         if(_H>1000)
         highTime-=50;
         //making high pulse
         _H=1000+(highTime/18); 
         //calculate the total 20 ms period
         _L=20000-_H;      
         //start the rotation
         output_high(PIN_B2);
         delay_us(_H);
         output_low(PIN_B2);
         delay_us(_L);
      }
   }
}

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)