Challenge

Project 1 - Controlling a DC motor using PWM and monitoring its Running status

Question

Overview of the Project:

Implement a system on the simulator for controlling a DC motor using L293 motor driver, monitor its status and print the running status of motor on the LCD Display.

Goals:

  • Implement a system on simulator for Controlling the DC motor using L293 motor driver.
  • Displaying the running status of DC motor on the LCD display.

Key Highlights of the Project:

  • The DC motor can be controlled by using L293 motor driver.
  • The speed of a DC motor can be controlled by varying its input voltage, for doing this is to use PWM (Pulse Width Modulation).
  • L293D IC is a typical Motor Driver IC which allows the DC motor to drive on any direction.

Deliverables of this project:

  • Implement the system for controlling DC motor.
  • Controlling the speed of the DC motor using PMW.
  • Displaying the present running status of DC machine on LCD display.

Expected Outcomes:

  • Implement a system on simulator to control a DC motor using PMW
  • Monitoring the running status of the DC motor using L293 motor driver which allows the DC motor to drive on any direction.
  • Running status i.e. on which direction the DC motor is running is to be displayed on the LCD screen.

Your Answers

PROJECT
AIM:
Implement a system on the simulator for controlling a DC motor using L293 motor
driver, monitor its status and print the running status of motor on the LCD Display.
Goals:
• Implement a system on simulator for Controlling the DC motor using L293
motor driver.
• Displaying the running status of DC motor on the LCD display.
Key Highlights of the Project:
• The DC motor can be controlled by using L293 motor driver.
• The speed of a DC motor can be controlled by varying its input voltage, for
doing this is to use PWM (Pulse Width Modulation).
• L293D IC is a typical Motor Driver IC which allows the DC motor to drive on
any direction.
Deliverables of this project:
• Implement the system for controlling DC motor.
• Controlling the speed of the DC motor using PMW.
• Displaying the present running status of DC machine on LCD display.
DC Motor:
• A DC motor is defined as a class of electrical motors that convert direct
current electrical energy into mechanical energy.

  • When kept in a magnetic field, a current-carrying conductor gains torque
    and develops a tendency to move.
    • Thus when electric fields and magnetic fields interact, a mechanical force
    arises.
    • This is the principle on which the DC motors work

L293 Motor Driver:
• L293d IC is known as a motor driver.

  • It is a low voltage operating device like other ICs.
  • The other ICs could have the same functions like L293d but
    they cannot provide the high voltage to the motor.
  • L293d provides the continuous bidirectional Direct Current to the Motor.
  • The Polarity of current can change at any time without affecting the whole
    IC or any other device in the circuit.
  • L293d has an internal H-Bridge installed for two motors.

Code:
#include <avr/io.h> //we are using the I/O registers of AVR
#define F_CPU 16000000L // define the CPU frequency
#include "avr/interrupt.h" // we are using external interrupt pin
#include <util/delay.h> // delay function
#define sw_dir (PIND & (1<<1)) // d1 pin is declared as switch button for direction
control.
#define sw_dspd (PIND & (1<<2)) // d2 pin is declared as push button for speed
control.
#define pw (PINC & (1<<3)) // c3 is declared as switch button for power ON/OFF

#define lcd_port PORTB //PORTB pins are dedicated for LCD data
#define RS_high PORTD |= (1<<5) // d5 pin is used for RS
#define RS_low PORTD &=~ (1<<5)
#define EN_high PORTD |= (1<<6) // d6 pin is used for EN
#define EN_low PORTD &=~ (1<<6)

unsigned char i; //variable declared to increase the duty cycle in PWM

void lcd_cmd(char cmd) //command for lcd display
{
lcd_port = (cmd & 0xf0); // Masking 4 bits for 4 bit lcd mode
RS_low;
EN_low;
_delay_ms(1); //after 1ms disable lcd
EN_high; //enable the lcd
lcd_port = ((cmd<<4) & (0xf0)); //lcd port
RS_low;
EN_low;
_delay_ms(1); //after 1ms disable lcd
EN_high; //enable the lcd
}

void lcd_data (char data) //send the data to lcd
{
lcd_port = (data & 0xf0); // Masking 4 bits for 4 bit lcd mode
RS_high; //access data register
EN_low;
_delay_ms(1);
EN_high;
lcd_port = ((data<<4) & (0xf0)); //4 bits for 4 bit lcd mode
RS_high; //access data register
EN_low;
_delay_ms(1);
EN_high;
}

void lcd_init()
{
lcd_cmd(0x28);// used for 4 bit lcd mode
_delay_ms(5);
lcd_cmd(0x02); // return home
_delay_ms(5);
lcd_cmd(0x01); // clear screen
_delay_ms(5);
lcd_cmd(0x0C); // display on cursor off
_delay_ms(5);
lcd_cmd(0x06); // increment the display cursor
_delay_ms(5);
lcd_cmd(0x80); // force cursor to begin from 1st line
_delay_ms(5);
}

void cursorpos(char x,char y)
{

if((x<1 || x>2) || (y>16 || y<1 )) //condition will checks the 2 rows and 16 columns

{
x=1; //x= row
y=1; //y= column
}
if(x==1)
{

lcd_cmd(0x7F + y); //{ 80-1 = 7F} for starting the 1st line hex decimal value (80) we
are using 7f+y as need to start from that column
}
else //(x==2)
{

lcd_cmd(0xBF + y); //{0C-1 = 0B} for starting the 2nd line, 2nd row
}
}

void lcd_out(char x, char y, char *str) //here we are checking which position we
want to print
{
cursorpos(x,y);
while(*str)
{
lcd_data(*str);
str++;
}
}

int main(void)
{
DDRB = 0XFF; //Declaring all 8-pins as output
DDRA |= ((1<<0)| (1<<1)); //Declaring A0 & A1 pins as output
DDRD &=~ (1<<1); //Declaring D1 pin as input
DDRD &=~ (1<<2); //Declaring D2 pin as input
DDRD |= (1<<5); //Declaring D5 pin as output
DDRD |= (1<<6); //Declaring D6 pin as output
DDRC &=~ (1<<3); //Declaring C3 pin as input
PORTD |= (1<<2); //enabling internal pull up resistor for D2
PORTC |= (1<<3); //enabling internal pull up resistor for D3
i=64; //initializing i=64 because we are running the motor with 25% duty cycle
TCCR0=0X61; //Non-Inverting mode, PWM phase correct mode,NO prescalar
GICR=(1<<INT0); //using INT0 for interrupt
MCUCR=0X02; //make interrupt negative edge triggered
sei(); //Enable global interrupt
lcd_init(); //Initialize lcd

while(1)
{
while(pw==0) //continue till the push button is released.
{
if(sw_dir == 0) //if the direction control push button is released.
{
PORTA = 0b00000001; // 1 0 to respective 1A 2A pins to rotate in clockwise
direction.
lcd_out(1,1,"Motor Running CL"); //Running clock wise direction

}
else
{
PORTA = 0b00000010; // 1 0 to respective 1A 2A pins to rotate in Anti-Clockwise
direction.
lcd_out(1,1,"Motor Running ACL"); //Running Anticlock wise direction

}
OCR0 = i; //i increases in ISR, the corresponding value is to be loaded into OCR0.

}

PORTA = 0x00; // 0 0 to respective 1A 2A pins to Stop rotation.
lcd_out(1,1,"Motor is TURNOFF"); //motor is turnoff
}
}
ISR(INT0_vect) //interrupt service routine
{
i=i+20; /* as i increases the duty cycle also increases. i increases by 20 in each
push
and the corresponding value is to be loaded into OCR0 in while loop*/
}

Result:
• Thus implemented a system on simulator to control a DC motor using
PMW.
• Monitoring the running status of the DC motor using L293 motor driver
which allows the DC motor to drive on any direction.
• Running status i.e. on which direction the DC motor is running is to be
displayed on the LCD screen.

Your portfolio, next

Ship work like this
in your own course.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.