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.

Interfacing ATMega32 to 74HC595 shift register
ATMega16 ATMega32 Experiment Board PCB from PCBWay

 

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)