Sei sulla pagina 1di 10

Universidad de cuenca

Facultad de ingeniera

Electrnica y telecomunicaciones
Microprocesadores 2
______________________________________________________________________

Tema: implementacin de un Control PI en microcontrolador


______________________________________________________________________
Edgar Muoz.
Edgar.munoza@ucuenca.ec
Juan Narvez.

Ral Suquinagua.
Raul.suquinagua@ucuenca.ec

Cuenca 2016

Resumen
Este documento presenta los detalles de diseo e implementacin
prctica, de un control PI donde se va a poner en prctica el
uso

del

Microcontrolador

pic18f4550,

cuya

programacin

se

realiza en lenguaje C, con el objetivo de poner en prctica los


conocimientos aprendidos en la asignatura de Microprocedores 2.
Este diseo presentado en esta prctica es un modelo bsico dl
funcionamiento de un control PI sobre un microcontrolador es
decir ya no se realizara de manera analgica sino ahora gracias
al uC se lo realizara de manera digital, este hecho provee una
mejor implementacin de un control digital. Tomando como base
este tipo de implementaciones podemos desarrollar muchas otras
aplicaciones.

Objetivos
Objetivo General.

Disear en el protoboard un circuito de control PI para


poner en prctica todos los conceptos tericos aprendidos
en la materia de Microprocedores 2.

Dar una base para el estudio de controles digitales

Objetivos Especficos.

Realizar

la

programacin

en

un

microcontrolador

microchip.

Implementar varias etapas en el hardware del control PI.

Evaluar los beneficios de programar en uC.

2) Detalles tcnicos

Marco Terico
Para

llegar

comprender

un

control

PI

debemos

tener

claro

cmo

funciona un control P para luego avanzar.

Control Proporcional
La funcin de transferencia entre la salida del controlador u(t) y la
seal de error e(t) es:
()
=
()
Donde se denomina ganancia proporcional.
Otro parmetro importante en la accin de este controlador, es la
denominada banda proporcional que expresa que tan grande ser la
accin de control ante una seal de error en la entrada, y es igual a:
=

Control Proporcional Integral


El valor de salida del controlador proporcional vara en razn
proporcional al tiempo en que ha permanecido el error y la magnitud
del mismo, su funcin de transferencia es:
()
1
= (1 +
)
()

Donde es la ganancia proporcional y se denomina tiempo de accin
integral. Ambos valores son ajustables. El tiempo integral regula la
velocidad de accin de control, mientras que una modificacin en
afecta tanto a la parte integral como a la parte proporcional de la
accin de control [1].

Por lo tanto la respuesta de un regulador PI ser la suma de las


respuestas debidas a un control proporcional P, que ser instantnea a
deteccin de la seal de error, y con un cierto retardo entrar en
accin el control integral I, que ser el encargado de anular
totalmente la seal de error [2].
3) Planteamiento del problema: diseo del control PI
El problema a resolver es la implementacin de un control de tipo PI
el

cual

controlara

la

intensidad

de

iluminacin

de

un

LED

la

intensidad de iluminacin se la da atraves de una resistencia el


elemento que controla la intensidad de iluminacin
resistencia, todo esto se
Como

ya

vimos

el

debe implementar en un microcontrolador.

funcionamiento

de

un

control

PI,

implementarlo en un cdigo para cargarlo al uC, para


cdigo

nos

basamos

en

ser una foto

la

siguiente

figura,

la

ahora

desarrollar el

cual

muestra

solucin del problema planteado mediante diagrama de bloques.

4) Cdigo fuente del Control PI en C


//PIC18F4550 MPLAB C18

debemos
la

#include<p18f4550.h> // Include Header for PIC18f455


#include <delays.h>
// PIC18F4550 Configuration Bit Settings
// CONFIG1L
#pragma config PLLDIV = 1
// PLL Prescaler Selection bits
(Divide by 5 (20 MHz oscillator input))
#pragma config CPUDIV = OSC1_PLL2// System Clock Postscaler Selection
bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2])
#pragma config USBDIV = 2
// USB Clock Selection bit (used in
Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes from
the 96 MHz PLL divided by 2)
// CONFIG1H
#pragma config FOSC = HSPLL_HS // Oscillator Selection bits (HS
oscillator, PLL enabled (HSPLL))
#pragma config FCMEN = OFF
// Fail-Safe Clock Monitor Enable bit
(Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF
// Internal/External Oscillator
Switchover bit (Oscillator Switchover mode disabled)
// CONFIG2L
#pragma config PWRT = OFF
// Power-up Timer Enable bit (PWRT
disabled)
#pragma config BOR = ON
// Brown-out Reset Enable bits
(Brown-out Reset enabled in hardware only (SBOREN is disabled))
#pragma config BORV = 3
// Brown-out Reset Voltage bits
(Minimum setting)
#pragma config VREGEN = ON
// USB Voltage Regulator Enable bit
(USB voltage regulator enabled)
// CONFIG2H
#pragma config WDT = OFF
// Watchdog Timer Enable bit (WDT
disabled (control is placed on the SWDTEN bit))
#pragma config WDTPS = 32768
// Watchdog Timer Postscale Select
bits (1:32768)
// CONFIG3H
#pragma config CCP2MX = ON
// CCP2 MUX bit (CCP2 input/output is
multiplexed with RC1)
#pragma config PBADEN = OFF
// PORTB A/D Enable bit (PORTB<4:0>
pins are configured as digital I/O on Reset)
#pragma config LPT1OSC = OFF
// Low-Power Timer 1 Oscillator
Enable bit (Timer1 configured for higher power operation)
#pragma config MCLRE = ON
// MCLR Pin Enable bit (MCLR pin
enabled; RE3 input pin disabled)
// CONFIG4L
#pragma config STVREN = ON
// Stack Full/Underflow Reset Enable
bit (Stack full/underflow will cause Reset)
#pragma config LVP = OFF
// Single-Supply ICSP Enable bit
(Single-Supply ICSP disabled)
#pragma config ICPRT = OFF
// Dedicated In-Circuit
Debug/Programming Port (ICPORT) Enable bit (ICPORT disabled)
#pragma config XINST = OFF
// Extended Instruction Set Enable
bit (Instruction set extension and Indexed Addressing mode disabled
(Legacy mode))
// CONFIG5L
#pragma config CP0 = OFF
// Code Protection bit (Block 0
(000800-001FFFh) is not code-protected)
#pragma config CP1 = OFF
// Code Protection bit (Block 1
(002000-003FFFh) is not code-protected)
#pragma config CP2 = OFF
// Code Protection bit (Block 2
(004000-005FFFh) is not code-protected)
#pragma config CP3 = OFF
// Code Protection bit (Block 3
(006000-007FFFh) is not code-protected)
// CONFIG5H

#pragma config CPB = OFF


// Boot Block Code Protection bit
(Boot block (000000-0007FFh) is not code-protected)
#pragma config CPD = OFF
// Data EEPROM Code Protection bit
(Data EEPROM is not code-protected)
// CONFIG6L
#pragma config WRT0 = OFF
// Write Protection bit (Block 0
(000800-001FFFh) is not write-protected)
#pragma config WRT1 = OFF
// Write Protection bit (Block 1
(002000-003FFFh) is not write-protected)
#pragma config WRT2 = OFF
// Write Protection bit (Block 2
(004000-005FFFh) is not write-protected)
#pragma config WRT3 = OFF
// Write Protection bit (Block 3
(006000-007FFFh) is not write-protected)
// CONFIG6H
#pragma config WRTC = OFF
// Configuration Register Write
Protection bit (Configuration registers (300000-3000FFh) are not
write-protected)
#pragma config WRTB = OFF
// Boot Block Write Protection bit
(Boot block (000000-0007FFh) is not write-protected)
#pragma config WRTD = OFF
// Data EEPROM Write Protection bit
(Data EEPROM is not write-protected)
// CONFIG7L
#pragma config EBTR0 = OFF
// Table Read Protection bit (Block 0
(000800-001FFFh) is not protected from table reads executed in other
blocks)
#pragma config EBTR1 = OFF
// Table Read Protection bit (Block 1
(002000-003FFFh) is not protected from table reads executed in other
blocks)
#pragma config EBTR2 = OFF
// Table Read Protection bit (Block 2
(004000-005FFFh) is not protected from table reads executed in other
blocks)
#pragma config EBTR3 = OFF
// Table Read Protection bit (Block 3
(006000-007FFFh) is not protected from table reads executed in other
blocks)
// CONFIG7H
#pragma config EBTRB = OFF
// Boot Block Table Read Protection
bit (Boot block (000000-0007FFh) is not protected from table reads
executed in other blocks)
//===================================================|
//
Variables
//===================================================|
unsigned int i, j;
unsigned int rT,yT;
float a,b,c;
//Constantes para parmetros de controlador PID
float eT,iT,dT,uT,iT0,eT0; //Variables de controlador PID
float max,min;
void temporizador(void);
//===================================================|
//
Vector de Interrupcion
//===================================================|
#pragma code prioridad_nomal = 0X0008
void interrupcion_normal (void)
{
_asm goto temporizador _endasm
}
#pragma code
//===================================================|
//
SUBRutina de Interrupcion
//===================================================|
#pragma interrupt temporizador
void temporizador(void)

{
if(INTCONbits.TMR0IF)
{
INTCONbits.TMR0IF = 0;
/////////////////////////////////////////////
//ASIGNACION DE VALORES
/////////////////////////////////////////////
max=255.0;
min=0.0;
iT0=0.0;
eT0=0.0;
a=2.0;
b=0.62;
c=0.6215;
/////////////////////////////////////////////
// ADC CONVERSION
/////////////////////////////////////////////
ADCON0 = 0b00000011;
//GO/DONE=1 => Inicia Conversion
LATCbits.LATC1 = 1;
//;Visualizar GO/DONE
//INICIA CONVERSION
while(ADCON0!=0b00000001);
//CONVERSION LISTA
LATCbits.LATC1 = 0;
//;Visualizar GO/DONE
yT= ADRESL;
//FEEDBACK
ADCON0 = 0b00000111;
//GO/DONE=1 => Inicia Conversion
LATCbits.LATC1 = 1;
//;Visualizar GO/DONE
//INICIA CONVERSION
while(ADCON0!=0b00000101);
//CONVERSION LISTA
LATCbits.LATC1 = 0;
//;Visualizar GO/DONE
rT=ADRESL;
//REFERENCE
/////////////////////////////////////////////
//PROCESS
/////////////////////////////////////////////
eT=rT-yT;
//COMPUTING SIGNAL ERROR e(kT)
iT=b*eT+iT0;
//COMPUTING INTEGRAL TERM i(kT)
uT=a*eT+iT;
//COMPUTING CONTROL TERM u(kT)
if (uT>max)
//ANTI WIND-UP
{
uT=max;
}
else
{
if (uT<min)
{
uT=min;
}
}
LATB=uT;
//OUTPUT VALUE
iT0=iT;
//VARIABLES UPDATE
eT0=eT;
TMR0H = 0X00,TMR0L = 100;
}
}
//======================================================|
//
Retardo
//======================================================|
void delayzz(void)
{
for(i=0;i<5000;i++)
{

for(j=0;j<2;j++)
{
Nop();
}
}
}
//======================================================|
//
Programa Principal
//======================================================|
void main(void)
{
//CONFIGURACION A/D
ADCON0 = 0b00000000;
ADCON1 = 0X0E;
ADCON2 = 0X86;
//CONFIGURACION PUERTOS
TRISA = 0b00011111;
TRISB = 0b00000000;
TRISC = 0b00000000;
TRISD = 0b00000000;
TRISE = 0b00000000;
//CONFIGURACION TIMER0
T0CON = 0X42;
TMR0H = 0X00;
TMR0L = 196;
RCON = 0X00;//IPEN = 0
INTCON = 0XA0;//configuramos la interrupcion del timer0
//ENCENDEMOS TIMER0 Y ADC
T0CON = 0b11000010; //OJO------10
ADCON0 = 0b00000001;
while(1)
{
//-------------------------------------|
//INTERMITENCIA LED
//-------------------------------------|
LATCbits.LATC6 = 1;
// RB-1 to High
for( i = 1; i<4; i++)
{
Delay10KTCYx(1000); //Delay 120K cycles (1 second at 1MHz
since each instruction takes 4 cycles)
delayzz();
Nop();
}
LATCbits.LATC6 = 0;
// RB-0 to LOW
delayzz();
}
5) breve explicacin del cdigo implementado
Primeramente tomamos las seales: de referencia y del elemento de
medicin (LDR) y las convertimos a digitales, para posteriormente
ser procesadas. Luego calculamos el error, que es la seal de
referencia menos la seal de medicin. Procedemos a calcular
nuestro sistema proporcional que es nicamente una constante de
proporcin ponderada por la seal de error. Para el sistema
integrador hacemos la sumatoria de los errores en lugar de la
integral
dado
que
trabajamos
en
tiempo
discreto.
Tambin
implementamos un sistema anti windup que bsicamente limita el
mximo y mnimo valor de salida al puerto en uso.

Cabe recalcar que estamos trabajando con interrupciones,


tener una mejor precisin del tiempo de muestreo.

para

6) Diseo del Hardware

En el esquema podemos observar el circuito necesario:


pic18F4550.- con su respectivo cristal, su botn de reset.
Red R-2R.- est conectada al puerto D esta red es de 8 bits, como
se sabe esta red es un DAC.
LDR.- este es un sensor que verifica la intensidad de iluminacin
del led y est conectado al pin AN0 por medio de este pin es un
pin

de

entrada

que

toma

la

el

voltaje

entregado

por

el

LDR

dependiendo de la intensidad del led.


LED.- este led est conectado a la Red y es donde se ejerce el
control.
POTENCIOMETRO.- este es la referencia, est conectado al pin AN1.
7) Conclusiones

Se puede concluir que el uso de microcontrolador tiene muchas


aplicaciones, como es el caso del control PI que se usa para el
control de una iluminacin como ejemplo estamos usando un LDR
que controla la intensidad de iluminacin de la luz de un led.
Mediante la prctica se ha demostrado que se pueden implementar
sistemas digitales de control a partir de sistemas analgicos.

Se puede modelar de forma ms precisa el control en los sistemas


digital, La respuesta es ms rpida.
El uso de este sistema reduce el error a cero, es una ventaja
dado que el control p siempre tiende a esta oscilando.
En la prctica se hiso pruebas cubriendo el contorno de nuestro
circuito para no tener influencia de la luz del ambiente y as
reducir los errores al mximo.

Bibliografa

[1] << control P>> [En lnea]. Disponible en:


http://www.udb.edu.sv/udb/archivo/guia/electronicaingenieria/sistemas-de-control-automatico/2013/i/guia-6.pdf

[2] << control PI>> [En lnea]. Disponible en:


http://educativa.catedu.es/44700165/aula/archivos/repositorio//4750/49
26/html/13_controlador_de_accin_proporcional_e_integral_pi.html

Potrebbero piacerti anche