Está en la página 1de 22

INSTITUTO

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.

Es suficiente para muchos problemas de control Es suficiente para muchos


problemas de control
Ms del 95% de los lazos de control utilizan el PID Ms del 95% de los lazos
de control utilizan el PID
Ha sobrevivido a los cambios tecnolgicos Ha sobrevivido a los cambios
tecnolgicos
Aparicin del microprocesador Aparicin del microprocesador
Auto sintona
Planificacin de ganancia Planificacin de ganancia
Tiene algunas funciones importantes Tiene algunas funciones importantes
Utiliza la realimentacin para rechazar las perturbaciones Utiliza la
realimentacin para rechazar las perturbaciones

Elimina el error estacionario con la accin integral Elimina el error


estacionario con la accin integral
Puede anticipar el futuro con la accin derivativa Puede anticipar el futuro con
la accin derivativa
No es trivial ajustarlo para conseguir los mayores No es trivial ajustarlo para
conseguir los mayores
beneficios sobre el proceso beneficios sobre el proceso
Tres parmetros de control

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

De la grafica anterior se obtienen los parametros

#define F_CPU 16000000UL


#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#define KEY_PRT PORTC
#define KEY_DDR DDRC
#define KEY_PIN PINC
#define ON output_high
#define OFF output_low
#define A6 PIN_A6
#define A7 PIN_A7
#define LCD_DPRT PORTD
#define LCD_DDDR DDRD

#define LCD_DPIN PIND


#define LCD_CPRT PORTB
#define LCD_CDDR DDRB
#define LCD_CPIN PINB
#define LCD_RS 0
#define LCD_RW 1
#define LCD_EN 2
//unsigned char VADC,de;
unsigned int u,i, cen, dec, uni, grados,x;
int ref,error,motor,error1;
unsigned char scancol,scanrow;
char mensaje[16];
//******************************************RUTINA DE
RETARDO**************************************************
void delay_ms(unsigned int d)
{
_delay_ms(d);
}

//******************************************************************************
******************************************
//******************************************************************************
**************************************

void lcdCommand(unsigned char cmnd)


{
LCD_DPRT=cmnd & 0xF0;

//manda CMND

LCD_CPRT &=~ (1<<LCD_RS);

//RS=0 para

LCD_CPRT &=~ (1<<LCD_RW);

//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);
}

//******************************************************************************
***************************************

void lcdData(unsigned char data)


{
LCD_DPRT=data & 0xF0;

//envia DATA a

LCD_CPRT |=(1<<LCD_RS);

//RS=1 para

LCD_CPRT &=~ (1<<LCD_RW);

//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

linea 5x7 matrix


lcdCommand(0x28);
encendido, cursor encendido
lcdCommand(0x0e);

//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)

//manda a imprimir al LCD

{
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;

//Internal Vref turne

//*********** control PID**********************************************


void PID()
{
set_canal0();
DDRA=0b11110000;
TCCR0=0x69;
while(1)
{
ADC_read();
if(motor>ref)
{
PORTA=0b10000000;
OCR0=error;
}
ADC_read();
if(error<15)
{
PORTA=0b00000000;
OCR0=0;
}
else{
if(error1<15){
PORTA=0b00000000;
OCR0=0;
}
}
ADC_read();
if(motor<ref)

{
PORTA=0b01000000;
OCR0=error1;
}
}
}

//*********** PROGRAMA PRINCIPAL*************


int main (void)
{

unsigned int scanrow,scancol,num=0,pos;

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;
}

También podría gustarte