Documentos de Académico
Documentos de Profesional
Documentos de Cultura
POLITECNICO
NACIONAL
Escuela Superior de
Ingeniera Mecnica y
Elctrica
Materia: Interfaces, perifricos y
programacin I
Alumnos:
Armenta Arias Sergio Adrin
Hernndez Lpez Ricardo Daniel
Snchez Rocha Antonio
Profesor: Rivera Blas Ral
Grupo: 7RM3
I. INTRODUCCIN
Este articulo muestra el uso de los AVRs para realizar el control PID de
posicin de un motor DC, mediante la programacin del AVR realizamos el
control completo de la posicin de este, este articulo mostrara como se debe
realizar detalladamente el control PID.
El presente trabajo, muestra la aplicacin de un algoritmo tipo PID,
implementado sobre un microcontrolador compatible con un AVR, dedicado al
control de posicin de un motor de corriente continua
Los controladores PID, son ampliamente usados desde hace varias dcadas, en
el control de todo tipo de sistemas lineales, dada su alta eficacia, simplicidad y
su fcil aplicacin. En este caso, se ve aplicado al control de posicin de un
motor de corriente continua, pero mediante ligeras modificaciones, puede
aplicarse a cualquier tipo de sistema lineal. Es por esto que se seleccion este
tipo de algoritmo.
VARIABLES A CONTROLAR
II. OBJETIVOS
OBJETIVO GENERAL:
Realizar el control de posicin PID de un motor DC mediante la
utilizacin de AVRs ATMEGA16 para reforzar los conocimientos
adquiridos.
OBJETIVOS ESPECIFICOS:
Se realiza el diseo del sistema (motor) que deseamos controlar.
Una vez realizada todos los clculos correspondientes, se procede a
simular el circuito a implementar.
Adquirimos todos los componentes a utilizar
Implementamos el circuito de control PID del motor.
Realizamos varias pruebas para verificar su correcto uso
Elaboracin del informe del trabajo final correspondiente a la tercera
unidad.
III. DESARROLLO
OBTENIENDO VALORES DEL MOTOR DC Y OBTENIENDO VALOR DE LA
PENDIENTE
y=2.86 x +1.7
//******************************************************************************
******************************************
//******************************************************************************
**************************************
//manda CMND
//RS=0 para
//RW=0 para
a el puerto
comando
escribir
LCD_CPRT |=(1<<LCD_EN);
//EN=1 para H-
a-L pulsos
delay_ms(0.001);
//da
tiempo al EN
LCD_CPRT &=~ (1<<LCD_EN);
//EN=0 para H-
a-L pulsos
delay_ms(0.1);
LCD_DPRT = cmnd<<4;
LCD_CPRT |=(1<<LCD_EN);
delay_ms(0.001);
LCD_CPRT &= ~ (1<<LCD_EN);
delay_ms(0.1);
}
//******************************************************************************
***************************************
//envia DATA a
LCD_CPRT |=(1<<LCD_RS);
//RS=1 para
//RW=0 para
LCD_CPRT |=(1<<LCD_EN);
//EN=1 para H-
el puerto
data
escribir
a-L pulsos
delay_ms(0.001);
//da
tiempo al EN
LCD_CPRT &=~ (1<<LCD_EN);
a-L pulsos
LCD_DPRT = data<<4;
LCD_CPRT |= (1<<LCD_EN);
//EN=0 para H-
delay_ms(0.001);
LCD_CPRT &= ~ (1<<LCD_EN);
delay_ms(0.1);
}
//******************************************************************************
***************************************
void lcd_init()
//enciende el LCD
{
LCD_DDDR=255;
LCD_CDDR=255;
LCD_CPRT &=~(1<<LCD_EN);
//LCD_EN=0
lcdCommand(0x33);
lcdCommand(0x32);
//init. LCD 2
//display
//limpia LCD
lcdCommand(0x01);
delay_ms(2);
//espera
lcdCommand(0x06);
//coloca el
cursor a la derecha
}
//******************************************************************************
***************************************
void lcd_gotoxy(unsigned char x, unsigned char y)
el puntero en la posicion
{
unsigned char firstCharAdr[]={0x80,0xC0,0x94,0xD4};
lcdCommand(firstCharAdr[y-1]+x-1);
//coloca
delay_ms(0.1);
}
//******************************************************************************
***************************************
void lcd_print(char * str)
{
unsigned char i=0;
while(str[i]!=0)
{
lcdData(str[i]);
i++;
}
}
//************************************CONFIG. ADC Y PWM******************
void set_canal0()
{
DDRA=0xF0;
ADCSRA=0xA0;
ADCSRA=0xE0;
ADMUX=0x20;
off-right-ADC0
SFIOR=0;
}
//*************LECTURA ADC**********************
void ADC_read()
{
motor=ADCH+ADCL;
ref=(grados*1023)/270;
error=motor-ref;
error1=ref-motor;
{
PORTA=0b01000000;
OCR0=error1;
}
}
}
ret:
lcd_init();
lcd_gotoxy(1,1);
lcd_print("SELEC POSICION");
lcd_gotoxy(1,2);
lcd_print("ANG=");
pos=1;
i=1;
KEY_DDR=0xF0;
KEY_PRT=0x0F;
while(1)
{
principal:
for(scancol=4;scancol<7;scancol++)
{
KEY_PRT&=~(1<<scancol);
for(scanrow=0;scanrow<4;scanrow++)
{
if((KEY_PIN&(1<<scanrow))==0)
num=((scancol-4)+1)+(3*scanrow);
}
KEY_PRT |=(1<<scancol);
}
if(num>0)
{
if (i == 2)
{cen=u*100;}
if (i == 3)
{dec=u*10;}
if (i == 4)
{uni=u;}
lcd_gotoxy(((pos)+4),2);
lcdCommand(0x0E);
switch(num)
{
case 1:
lcd_print("1");
pos ++;
i++;
u=1;
while((KEY_PIN&(1<<scanrow))==0);
_delay_ms(20);
break;
case 2:
lcd_print("2");
pos ++;
i++;
u=2;
while((KEY_PIN&(1<<scanrow))==0);
_delay_ms(20);
break;
case 3:
lcd_print("3");
pos ++;
i++;
u=3;
while((KEY_PIN&(1<<scanrow))==0);
_delay_ms(20);
break;
case 4:
lcd_print("4");
pos++;
i++;
u=4;
while((KEY_PIN&(1<<scanrow))==0);
_delay_ms(20);
break;
case 5:
lcd_print("5");
pos ++;
i++;
u=5;
while((KEY_PIN&(1<<scanrow))==0);
_delay_ms(20);
break;
case 6:
lcd_print("6");
pos ++;
i++;
u=6;
while((KEY_PIN&(1<<scanrow))==0);
_delay_ms(20);
break;
case 7:
lcd_print("7");
pos ++;
i++;
u=7;
while((KEY_PIN&(1<<scanrow))==0);
_delay_ms(20);
break;
case 8:
lcd_print("8");
pos ++;
i++;
u=8;
while((KEY_PIN&(1<<scanrow))==0);
_delay_ms(20);
break;
case 9:
lcd_print("9");
pos ++;
i++;
u=9;
while((KEY_PIN&(1<<scanrow))==0);
_delay_ms(20);
break;
case 11:
lcd_print("0");
pos ++;
i++;
u=0;
while((KEY_PIN&(1<<scanrow))==0);
_delay_ms(20);
break;
case 12:
{
if(i>3){
grados=cen+dec+uni;
lcdCommand(0x0C);
lcdCommand(0x01);
lcd_gotoxy(1,1);
lcd_print("CONFIRMADO..");
lcd_gotoxy(5,2);
sprintf(mensaje,"%d
send",grados);
lcd_print(mensaje);
PID();
_delay_ms(20);
break;
}
if(i<3)
{
lcdCommand(0x0C);
lcdCommand(0x01);
lcd_gotoxy(2,1);
lcd_print("ERROR TECLEA");
lcd_gotoxy(4,2);
lcd_print("3 DIGITOS");
_delay_ms(20);
break;
}
}
}
}
else
goto principal;
num=0;
if (pos>4)
{
lcdCommand(0x0C);
lcdCommand(0x01);
lcd_gotoxy(2,1);
lcd_print("ERROR.MAX");
lcd_gotoxy(4,2);
lcd_print("3 DIGITOS");
_delay_ms(40);
goto ret;
}
}
return 0;
}