Menu

728x90

468x60

Navbar

Sunday, April 26, 2020

ATMega32 Controlling A DC Servo Motor Without PWM Module

A DC servo motor comes with an electronic hardware control, to rotate to any specific angle. Typically, It can rotate between -90 degrees to +90 degrees.

A simple mini servo motor
The SG90 simple servo motor

Servo Angle Positioning

It come with three pins, in which two pins for supply voltage, the last one is for DC control signal.
The control signal is a square wave with the amplitude of 5 V. Typically, it accept a frequency of 50 Hz. The angle positioning is made by the High time varies from 1 ms to 2 ms.

Servo timing diagram
1 ms to 2 ms duty makes -90 degree to +90 degree angle rotation.
In this example, I use delay function in GCC C for AVR to make timing signal.

Schematic Diagram. A servo motor connects to PB0.
PC0.3 connect to the switches controlling the angle of servo.

Servo is controlled by output signal from PB0. I use three button to control the servo angle to -90 degree, 0 degree and +90 degree.

Source code could be download here.

/*
  * servoExample_1.c
  *
  * Created: 4/26/2020 9:10:13 AM
  * Author : bonTha
  */ 
 #include <avr/io.h>
 #define F_CPU 16000000UL
 #include "util/delay.h"
 #define rotate__90 (PINC&0x01)
 #define rotate_0 (PINC&0x02)
 #define rotate_90 (PINC&0x04)
 void servoRotate(short angle){
 switch(angle){
 case -90:
 PORTB=0x01;
 _delay_us(1000);
 PORTB=0x00;
 _delay_us(19000);
 break;
 case 0:
 PORTB=0x01;
 _delay_us(1500);
 PORTB=0x00;
 _delay_us(18500);
 break;
 case 90:
 PORTB=0x01;
 _delay_us(2000);
 PORTB=0x00;
 _delay_us(18000);
 break;
 default:
 break;
 }
 }
 int main(void)
 {
 DDRB=0x01; //PB0 IS OUTPUT
 DDRC=0xF8; //PC0.2 ARE INPUT 
 PORTC=0x07;
     while (1) 
     {
 if(rotate__90==0) servoRotate(-90);
 else if(rotate_0==0) servoRotate(0);
 else if(rotate_90==0) servoRotate(90);
     }
 }

Back to main tutorial page ATMega32 tutorials in C with Atmel Studio 7.

If you want a standard PCB for ATMega32 micro-controller, you can order my AVR Microcontroller project from PCBWay with a reasonable price. Click here to get a free $5 credit for new account.


 

No comments:

Post a Comment

336x280

Search This Blog

Labels

23K256 (1) 24C16B (2) 25AA010A (2) 8051 (7) 93AA46B (1) ADC (34) Analog Comparator (1) Arduino (16) ARM (13) AT89C52 (7) ATMega32 (58) ATMega644P (27) AVR (87) AVR PCB (2) Bootloader (1) CCS PICC (31) Change Notify Interrupt (CNI) (2) DAC (2) DHT11 (4) Display (133) Distance Sensor (3) ds1307 (10) DS18B20 (5) ds3231 (1) ds3232 (2) dsPIC (5) dsPIC30F1010 (3) dsPIC30F2010 (5) EEPROM (5) Environment Sensor (5) ESP32 (1) esp8266 (1) Graphical LCD (2) I2C (38) ILI9341 (1) Input/Output (76) Interrupt (22) IoT PCB (1) Keil (5) Keypad (16) KS0108 (2) LCD (75) LM35 (3) Master/Slave (2) MAX7221 (1) MCP23017 (8) MCP23S17 (7) MCP4921 (1) MCP4922 (2) Meter (3) MikroC (2) Module PCB (1) Motor (15) MPLABX (73) Nokia 5110 LCD (4) OLED (2) One-Wire (7) Oscillator (8) PCB (10) PCD8544 (3) PCF8574 (10) PIC (108) 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 (12) PICKit2 (1) PICMicro PCB (4) Pin Change Interrupt (1) PWM (12) RTC (12) SBN0064G (1) Sensor (13) SH1106 (3) Shift Register (13) Shift Registers (10) Software TWI (2) SPI (39) ST7735 (1) STM32 (11) STM32 Black Pill (1) STM32 Blue Pill (12) STM32 HAL (5) STM32CubeIDE (13) STM32F103C8T6 (9) STM32F401CCU6 (1) SysTick (4) temperature sensor (13) TFT (1) TG12864A (1) Thermometer (22) Timer/Counter (32) TM1637 (2) twi (10) UART (8) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (96)