Challenge

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

#include <avr/io.h>

#define F_CPU 8000000L

#include <avr/interrupt.h>

#include <util/delay.h>

unsigned int n,duty;

#define rs_high() PORTA |=(1<<2);

#define rs_low() PORTA &= ~(1<<2);

#define en_high() PORTA |= (1<<3);

#define en_low() PORTA &= ~(1<<3);

#define lcdport PORTC

void lcd_command(unsigned char cmd)

{

lcdport = cmd;

rs_low();

en_high();

_delay_ms(1);

en_low();

}

void lcd_data(unsigned char dat)

{

lcdport = dat;

rs_high();

en_high();

_delay_ms(1);

en_low();

}

void lcd_init()

{

lcd_command(0x38);_delay_ms(5);

lcd_command(0x02);_delay_ms(5);

lcd_command(0x01);_delay_ms(5);

lcd_command(0x0c);_delay_ms(5);

lcd_command(0x06);_delay_ms(5);

lcd_command(0x80);_delay_ms(5);

}

void cursorpos(char x, char y)

{

if( (x < 1 || x > 2) || (y < 1 || y > 16) )

{

x = 1;

y = 1;

}

if(x == 1)

lcd_command(0x7F+y);

else

lcd_command(0xBF+y);

}

void lcd_print(char row, char coloumn, unsigned int value, int digits)

{

unsigned int temp;

unsigned int unit;

unsigned int tens;

unsigned char flag=0;

if(row==0||coloumn==0)

{

cursorpos(1,1);

}

else

{

cursorpos(row,coloumn);

}

if(digits==2 || flag==1)

{

temp = value/10;

tens= temp%10 +48;

lcd_data(tens);

flag=1;

}

if(digits==1 || flag==1)

{

unit = value%10 + 48;

lcd_data(unit);

}

}

void lcd_out(char x,char y,char *str)

{

cursorpos(x,y);

while(*str)

{

lcd_data(*str);

str++;

}

}

int main(void)

{

DDRA=0xff; //Declaring A port pins as output.

DDRD&=~(1<<3); //PD2 as input

PORTD|=(1<<3); //Activate pull up resistor

GICR=(1<<6); //Enable external interrupt 0

MCUCR=0x02; //Make interrupt 0 negative edge

sei(); //enable interrupt

n=128; //50 % duty cycle

TCCR0=0x64; //phase correct pwm, non inverted mode, prescalar 64

DDRB |= (1<<3); //PB3 as output

PORTA=0x01; //enable motor control pins

DDRC=0xff; //set the portB as lcdport output

lcd_init();

while (1)

{

OCR0=n; //Loading duty cycle value

duty=0.39215*n;

lcd_print(1,8,duty,2);//1st row 1st column voltage printing with 4 digits

lcd_out(2,1," Duty cycle "); //2nd row 5th column printing mV unit of voltage

}

}

ISR(INT0_vect)

{

n=n+5;

if(n>=255)

n=128;

}

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.