Freedom Scholarship 2025: up to ₹79,000 | 6 Guaranteed Job Interviews | Limited to 1̶0̶0̶ 17 Seats. Apply Now

00D 00H 00M 00S

Menu

Executive Programs

Workshops

Projects

Blogs

Careers

Placements

Student Reviews


For Business


More

Academic Training

Informative Articles

Find Jobs

We are Hiring!


All Courses

Choose a category

Mechanical

Electrical

Civil

Computer Science

Electronics

Offline Program

All Courses

All Courses

logo

CHOOSE A CATEGORY

Mechanical

Electrical

Civil

Computer Science

Electronics

Offline Program

Top Job Leading Courses

Automotive

CFD

FEA

Design

MBD

Med Tech

Courses by Software

Design

Solver

Automation

Vehicle Dynamics

CFD Solver

Preprocessor

Courses by Semester

First Year

Second Year

Third Year

Fourth Year

Courses by Domain

Automotive

CFD

Design

FEA

Tool-focused Courses

Design

Solver

Automation

Preprocessor

CFD Solver

Vehicle Dynamics

Machine learning

Machine Learning and AI

POPULAR COURSES

coursePost Graduate Program in Hybrid Electric Vehicle Design and Analysis
coursePost Graduate Program in Computational Fluid Dynamics
coursePost Graduate Program in CAD
coursePost Graduate Program in CAE
coursePost Graduate Program in Manufacturing Design
coursePost Graduate Program in Computational Design and Pre-processing
coursePost Graduate Program in Complete Passenger Car Design & Product Development
Executive Programs
Workshops
For Business

Success Stories

Placements

Student Reviews

More

Projects

Blogs

Academic Training

Find Jobs

Informative Articles

We're Hiring!

phone+91 9342691281Log in
  1. Home/
  2. Chandrakumar ADEPU/
  3. Project 1 - Controlling a DC motor using PWM and monitoring its Running status

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

Project-1: 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.  Explanation: Schematic Circuit: Here,  We are using the At mega 32 microcontrollers and it has 4 ports (PORT A, B, C, D) and the…

    • Chandrakumar ADEPU

      updated on 08 Jun 2023

    Project-1:

    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. 

    Explanation:

    Schematic Circuit:

    Here,  We are using the At mega 32 microcontrollers and it has 4 ports (PORT A, B, C, D) and the Lcd panel is used to monitor the activity state of the motor. The L293 motor driver circuit is used to run the dc motor and the dc motor is connected to the L293 motor driver circuit. the power switch is connected to port c pin 3 to turn on and off the power supply. LCD panel (D4-D7) is connected to Port B pins (B4-B7). The speed-controlled push button is connected to port D and pin D2. and the direction-controlled switch is connected to a 5v supply at one end and another end is connected to port D pin D1. In the Lcd, rs pin is connected to pin D4, and enable pin is connected to pin D6, read and write pin is connected to the ground pin.

    When we pressed the power on switch it will provide the power supply to the microcontroller and the direction control switch is open means the motor will run in a clockwise direction, if the direction controller switch is closed means that the motor will rotate in an anti-clockwise direction and speed controller push button is used to control the speed of the motor using the delay for very instant.

    Configuring Timer0 for PWM generation

    It is simple to configure PWM mode in Timer. We just need to set some bits in the TCCR0 register.

    TCCR0: Timer Counter Control Register 0

    TCCR0

     

    Bit 7- FOC0: Force compare match

    Write only bit, which can be used while generating a wave. Writing 1 to this bit will force the wave generator to act as if a compare match has occurred.

    Bit 6, 3 - WGM00, WGM01: Waveform Generation Mode

     

    WGM00

    WGM01

    Timer0 mode selection bit

    0

    0

    Normal

    0

    1

    CTC (Clear timer on Compare Match)

    1

    0

    PWM, Phase correct

    1

    1

    Fast PWM

     

    Bit 5:4 - COM01:00:

    1. When WGM00: WGM01= 11 i.e. Fast PWM. Compare Output Mode

    waveform generator on OC0 pin

     

    COM01

    COM00

    Mode Name

    Description

    0

    0

    Disconnected

    The normal port operation, OC0 disconnected

    0

    1

    Reserved

    Reserved

    1

    0

    Non-inverted

    Clear OC0 on compare match, set OC0 at TOP

    1

    1

    Inverted PWM

    Set OC0 on compare match, clear OC0 at TOP

     

             2. When WGM00: WGM01= 10 i.e. Phase correct PWM. Compare Output Mode

    waveform generator on OC0 pin

     

    COM01

    COM00

    Description

    0

    0

    The normal port operation, OC0 disconnected

    0

    1

    Reserved

    1

    0

    Clear OC0 on compare match when up-counting, set OC0 on compare match when down-counting

    1

    1

    Set OC0 on compare match when up-counting, Clear OC0 on compare match when down-counting

     

               Bit 2:0 - CS02:CS00: Clock Source Select

    These bits are used to select a clock source. When CS02: CS00 = 000, then timer is stopped. As it gets a value between 001 to 101, it gets a clock source and starts as the timer.

     

    CS02

    CS01

    CS00

    Description

    0

    0

    0

    No clock source (Timer / Counter stopped)

    0

    0

    1

    clk (no pre-scaling)

    0

    1

    0

    clk / 8

    0

    1

    1

    clk / 64

    1

    0

    0

    clk / 256

    1

    0

    1

    clk / 1024

    1

    1

    0

    External clock source on T0 pin. clock on falling edge

    1

    1

    1

    External clock source on T0 pin. clock on rising edge.

     

    Fast PWM mode 

    To set Fast PWM mode, we have to set WGM00: 01= 11. To generate a PWM waveform on the OC0 pin, we need to set COM01:00= 10 or 11.

    COM01:00= 10 will generate a Noninverting PWM output waveform and COM01:00= 11 will generate Inverting PWM output waveform. 

     

    Setting Duty cycle: we have to load the value in the OCR0 register to set the duty cycle.

    255 value for 100% duty cycle and 0 for 0% duty cycle. Accordingly, if we load value 127 in OCR0, the Duty cycle will be 50%.

    Code:

    /*
     * project-1.c
     *
     * Created: 07-06-2023 14:16:36
     * Author : chandra
    */ 
    
    #include <avr/io.h> //we are using I/O registers of AVR
    #define F_CPU 16000000L // define the crystal frequency
    #include "avr/interrupt.h" // we are using external interrupt pin
    #include <util/delay.h> // delay function purpose
    #define sw_dir (PIND & (1<<1)) // d1 pin is declared as push 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 push button for power ON/OFF
    
    #define lcd_port PORTB //PORTB pins are for LCD data
    #define RS_high PORTD |= (1<<5) // d5 pin is used for Register Select(RS)
    #define RS_low PORTD &=~ (1<<5) // d5 pin is used for RS
    #define EN_high PORTD |= (1<<6) // d6 pin is used for Enable
    #define EN_low PORTD &=~ (1<<6) // d6 pin is used for En.
    unsigned char i;
    
    void lcd_cmd(char cmd) //command for lcd display
    {
    	lcd_port = (cmd & 0xf0); //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); //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) {y we r using the 7F+y means we need to dtart 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 adc_read(char channel) // we r configuring the adc value
    {
    	unsigned int a, result;
    	ADMUX = channel; // here we r going to use which channel we need to select in mux here using 2 bit
    	ADCSRA = 0X80; //control & status register to enable the adc conversion ,enable the interrupt flag, adc interrupt. ADEN=1
    	ADCH = 0X00; // showing the value 0 or clearing the adc register
    	ADCL = 0x00; // showing the value 0
    	ADCSRA |= (1<<6); // to start the conversion 6 bit ADSC high
    	while((ADCSRA & 0x40) != 0); // when the conversion become zero means conversion of adc (0x40 means interrupted pin )
    	a= ADCL; //dummy data type a and ais stored the ADCL register (ADC0-ADC7)
    	result = ADCH; // Store the high value (ADC8-ADC9)
    	result = result<<8; //to get proper result or alined value we need to do left shift
    	result = result | a ; // we r adding the ADCL + ADCH to get the 16 bits
    	return result;
    }
    
    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 ON- 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 ON- ACL");
    
    			}
    			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");
    	}
    }
    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//
    }

    Output:

     Before Switch ON the Power switch (power switch off)

     POWER SWITCH= ON and DIRECTION CONTROL SWITCH = OFF

      POWER SWITCH= ON and DIRECTION CONTROL SWITCH = OFF, SPEED CONTROL PUSH BUTTON = HIGH (FOR EVERY 1 PRESS THE SPEED WILL INCREASES) IN CLOCK WISE DIRECTION

      POWER SWITCH= ON and DIRECTION CONTROL SWITCH = ON

      POWER SWITCH= ON and DIRECTION CONTROL SWITCH = OFF, SPEED CONTROL PUSH BUTTON = HIGH (FOR EVERY 1 PRESS THE SPEED WILL INCREASES) IN ANTI-CLOCK WISE DIRECTION

    --------------------------------------------******************---------------------------------------------

     

     

     

    Leave a comment

    Thanks for choosing to leave a comment. Please keep in mind that all the comments are moderated as per our comment policy, and your email will not be published for privacy reasons. Please leave a personal & meaningful conversation.

    Please  login to add a comment

    Other comments...

    No comments yet!
    Be the first to add a comment

    Read more Projects by Chandrakumar ADEPU (25)

    Week - 4

    Objective:

    Implement control logic of a “washing machine” using Stateflow as per given sequence:  If the power supply is available, the system gets activated  If the Water supply is not available, stop the process & indicate through LED Soaking time should be 200s followed by Washing time of 100s. Then rinsing…

    calendar

    29 Sep 2023 07:17 AM IST

      Read more

      Project 2 - V&V SW Analysis II

      Objective:

      Q:- 1. Perform Static Code Review Analysis for “C:\**\LDRA_workarea\Examples\C_Testbed_examples\Testrain\Testrain.c” Generate Code review report and upload them. Ans: Aim: To gernetate the code review report and upload them. Steps:   Steps for White box testing:-                                               Source ->…

      calendar

      18 Aug 2023 01:16 PM IST

        Read more

        Project 1 - V&V SW Analysis - I

        Objective:

        Q:- Write a Test plan to test features of a new mobile phone (Blackbox test) that needs to be implemented based on the following requirements. (The product is still under development stage and is yet to be UA (User Acceptance ) tested…

        calendar

        12 Jul 2023 03:17 AM IST

          Read more

          Project 2 - Measuring distance of an object using ultrasonic sensor (HC-SR04)

          Objective:

          PROJECT-2: Aim: To write a program to measure the distance using ultasonic sensot Schematic Diagram: Steps of Programming ATmega16 microcontroller needs to transmit at least 10 us trigger pulse to the HC-SR04 Trig Pin. After getting a trigger pulse, HC-SR04 automatically sends eight 40 kHz sound waves and the microcontroller…

          calendar

          24 Jun 2023 09:50 AM IST

            Read more

            Schedule a counselling session

            Please enter your name
            Please enter a valid email
            Please enter a valid number

            Related Courses

            coursecard

            Design loads considered on bridges

            Recently launched

            10 Hours of Content

            coursecard

            Design of Steel Superstructure in Bridges

            Recently launched

            16 Hours of Content

            coursecard

            Design for Manufacturability (DFM)

            Recently launched

            11 Hours of Content

            coursecard

            CATIA for Medical Product Design

            Recently launched

            5 Hours of Content

            coursecardcoursetype

            Accelerated Career Program in Embedded Systems (On-Campus) Courseware Partner: IT-ITes SSC nasscom

            Recently launched

            0 Hours of Content

            Schedule a counselling session

            Please enter your name
            Please enter a valid email
            Please enter a valid number

            logo

            Skill-Lync offers industry relevant advanced engineering courses for engineering students by partnering with industry experts.

            https://d27yxarlh48w6q.cloudfront.net/web/v1/images/facebook.svghttps://d27yxarlh48w6q.cloudfront.net/web/v1/images/insta.svghttps://d27yxarlh48w6q.cloudfront.net/web/v1/images/twitter.svghttps://d27yxarlh48w6q.cloudfront.net/web/v1/images/youtube.svghttps://d27yxarlh48w6q.cloudfront.net/web/v1/images/linkedin.svg

            Our Company

            News & EventsBlogCareersGrievance RedressalSkill-Lync ReviewsTermsPrivacy PolicyBecome an Affiliate
            map
            EpowerX Learning Technologies Pvt Ltd.
            4th Floor, BLOCK-B, Velachery - Tambaram Main Rd, Ram Nagar South, Madipakkam, Chennai, Tamil Nadu 600042.
            mail
            info@skill-lync.com
            mail
            ITgrievance@skill-lync.com

            Top Individual Courses

            Computational Combustion Using Python and CanteraIntroduction to Physical Modeling using SimscapeIntroduction to Structural Analysis using ANSYS WorkbenchIntroduction to Structural Analysis using ANSYS Workbench

            Top PG Programs

            Post Graduate Program in Hybrid Electric Vehicle Design and AnalysisPost Graduate Program in Computational Fluid DynamicsPost Graduate Program in CADPost Graduate Program in Electric Vehicle Design & Development

            Skill-Lync Plus

            Executive Program in Electric Vehicle Embedded SoftwareExecutive Program in Electric Vehicle DesignExecutive Program in Cybersecurity

            Trending Blogs

            Heat Transfer Principles in Energy-Efficient Refrigerators and Air Conditioners Advanced Modeling and Result Visualization in Simscape Exploring Simulink and Library Browser in Simscape Advanced Simulink Tools and Libraries in SimscapeExploring Simulink Basics in Simscape

            © 2025 Skill-Lync Inc. All Rights Reserved.

                        Do You Want To Showcase Your Technical Skills?
                        Sign-Up for our projects.