Menu

Adskeeper - header widge

728x90

Search This Blog

468x60

Navbar

AdsKeeper - IAB Display Standard Ad Unit

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

Adskeep- Standard Ads

Electronics and Programming Tutorials

336x280

DIY Electronic Projects And Instruments

AdsKeeper - 2091654

Labels

23K256 (1) 24C16B (2) 25AA010A (2) 8051 (7) 93AA46B (1) ADC (40) Analog Comparator (1) Arduino (16) ARM (32) AT89C52 (7) ATMega32 (59) ATMega644P (27) AVR (88) AVR PCB (2) Bootloader (1) CCS PICC (31) Change Notify Interrupt (CNI) (2) DAC (2) DHT11 (5) Display (157) Distance Sensor (3) dot matrix (1) ds1307 (10) DS18B20 (6) ds3231 (2) ds3232 (2) dsPIC (16) dsPIC30F1010 (3) dsPIC30F2010 (15) EEPROM (5) Environment Sensor (6) ESP32 (1) esp8266 (1) Graphical LCD (3) HD44780 (12) I2C (40) ILI9341 (1) Input/Output (84) Interrupt (22) IoT PCB (1) Keil (5) Keypad (16) KS0108 (3) LCD (87) LM35 (4) Master/Slave (2) MAX7221 (1) MCP23017 (8) MCP23S17 (7) MCP4921 (1) MCP4922 (2) Meter (3) MikroC (2) MikroC ARM (1) MikroC dsPIC (11) MikroC PIC (1) Module PCB (2) Motor (15) MPLABX (73) Nokia 5110 LCD (5) OLED (2) One-Wire (7) Oscillator (8) PCB (13) PCD8544 (3) PCF8574 (13) PIC (121) PIC12F (3) PIC16 (105) PIC16F628A (3) PIC16F630 (2) PIC16F716 (4) PIC16F818 (11) PIC16F818/819 (3) PIC16F84A (16) PIC16F876A (2) PIC16F877A (9) PIC16F88 (2) PIC16F887 (60) PIC18 (19) PIC18F1220 (5) PIC18F2550 (5) PIC18F4550 (13) PICKit2 (1) PICMicro PCB (4) Pin Change Interrupt (1) PLL (1) PWM (12) RTC (13) SBN0064G (1) Sensor (15) SH1106 (3) Shift Register (15) Shift Registers (19) SN74HC595N (9) Software SPI (1) Software TWI (3) SPI (44) sprinf (3) ST7735 (1) STM32 (29) STM32 Black Pill (1) STM32 Blue Pill (12) STM32 HAL (23) STM32CubeIDE (32) STM32F103C8T6 (9) STM32F103R6 (18) STM32F401CCU6 (1) SysTick (7) temperature sensor (15) TFT (1) TG12864A (1) Thermometer (22) Timer/Counter (32) TM1637 (2) twi (10) UART (11) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (96)