Professional Documents
Culture Documents
Introduccin
En el presente trabajo se desarrolla un Control de velocidad en lazo cerrado de un motor DC de
Escobillas aplicando el conocido algoritmo de control PID. El objetivo es mantener constante la
velocidad ante variaciones de la carga (perturbaciones), de manera automtica.
El sistema se realiz usando un motor DC de escobillas extrado de una impresora de
inyeccin de tinta, el cual es controlado por un H-bridge basado en un chip LMD18200 que
permite usando la tcnica PWM variar la velocidad del motor y su sentido de giro. Como unidad
de realimentacin, se utiliza un tacmetro construido como se detalla ms adelante y todo el
sistema es controlado por un microcontrolador PIC18F452.
H-Bridge
El H-Bridge es bsicamente un mecanismo para hacer girar un motor DC en direccin hacia
adelante y en reversa. Un H-Bridge tpico de motores DC de escobillas es el integrado
LMD18200 de Nacional Semiconductors el cual puede suministrar continuamente hasta 3 Amp
VS
.1uf
10nf
Vs
Dir
PWM
Brake
Ground
Sense
B1
Out1
Out2
B2
TFO
LMD18200
1
2
10
11
10nf
6
3
5
4
7
8
U1
MOTOR DC
y opera con suministro de voltaje de hasta 55 Voltios. Tiene proteccin contra sobrecarga, sus
entradas son compatibles TTL y CMOS. Usa PWM para regular la velocidad del motor y tienes
pines para las funciones de: freno, direccin, sensor de corriente y seal de advertencia de
temperatura.
El pin sense sirve de sensor de corriente de salida. Tiene una sensibilidad de 377
microamperio por amperio de corriente de salida. Usando una resistencia de 2.7K se tiene
0.999 Voltios por amperio de salida. El pin TOF es una seal de advertencia de temperatura.
Es una salida colector abierto que se vuelve 0 a 145 grados centgrados. El pin Brake realiza
un freno de emergencia del motor cuando este pin pasa a 1y el pin PWM tambin.
El LMD18200 puede manejar seales PWM del tipo Signo-Magnitud y Locked-antiphase las
cuales se describen a continuacin.
PWM Locked-antiphase
La Seal PWM de tipo Locked-antiphase, consiste en un nica seal de anchura de pulso
variable en la cual se codifica tanto la informacin de direccin como la de amplitud. El 50% de
la anchura de pulso representa cero. Valores por debajo del 50% representan direccin reversa
y valores por encima del 50% representan direccin hacia adelante del motor. Para el
LMD18200 el uso de este tipo de seal PWM implica usar el pin 3 (DIR) como entrada de la
seal PWM, mientras el pin 5 (PWM) se lleva a valor lgico 1.
Una de las grandes ventajas de usar seales PWM del tipo locked-antiphase es que slo se
necesita una lnea I/O para controlar completamente el motor. Si se tiene restricciones de
lneas I/O, esta puede ser una buena opcin.
y la anchura de pulso (duty cycle) o tiempo que la seal PWM esta alta durante cada ciclo,
viene dada por la formula:
Duty_cycle= value*t2div*(1/clock)
si value es INT.
Donde value es el valor cargado en CCPR1L:CCP1CON<5:4> (8bits 10bits).
El Duty Cycle puede se establecido usando la instruccin:
set_pwm1_duty(value);
La instruccin:
Setup_timer_2(mode, P, postscale)
permite establecer el periodo del PWM dado un valor de PR2 entre 0 y 255. Este valor
determina cuando timer2 se resetea iniciando as un ciclo de PWM. Postscale es un nmero
entre 1 y 16 que determina cuantas veces el timer2 se resetea antes de ocurrir una
interrupcin.
Ejemplo:
Si clock = 20MHZ y PR2 = 127, entonces, un ciclo de PWM dura:
Periodo = 1/20000000)*4*1*128 =
25.6 us
Tenemos que Timer2 se incrementa cada 200nseg, reset cada 25.6 useg y genera una
interrupcin cada 25.6 * 5 = 128 useg.
Adems si hacemos PR2 igual a 100, un valor de 45 en CCPR1L crea un duty cycle de 45%,
un valor de 65 en CCPR1L crea un duty cycle de 65%.
Tacmetro digital
El tacmetro se construy usando un foto-interruptor CNZ1021 a travs del cual se hace pasar
un disco de acetato codificado colocado en la parte posterior del eje del motor. La fig. 5
muestra un disco codificado de 12 pulsos/rev. Los pulsos emitidos se hacen pasar por el Smithtrigger 7414 y realimentados al microcontrolador para as calcular la velocidad de rotacin del
motor.
+5VDC
180
10K
7414
Seal
CNZ1021
Fig. 6 Tacmetro
Carlos A. Narvez V, 2008
de(t )
1
u (t ) = K e(t ) + e(t )dt + Td
Ti 0
dt
(1-1)
Donde e(t) es la entrada al controlador (seal de error), u(t) es la salida del controlador, K es la
ganancia proporcional, Ti es el tiempo integral (o tiempo de reajuste) y Td es el tiempo
derivativo (o tiempo de adelanto).
Para obtener la funcin de pulso del controlador PID digital, se puede discretizar la ecuacin
1.1 aproximando el trmino integral mediante la sumatoria trapezoidal y el trmino derivativo
mediante diferencias de dos puntos, as se obtiene:
T
T
(1 Z 1 )
+
+ Td
U ( Z ) = K 1
E (Z )
1
T
2Ti Ti (1 Z )
(1.2)
U (Z )
Ki
= Kp +
+ Kd (1 Z 1 )
1
E (Z )
1 Z
(1.3)
donde:
Kp = K
Ki =
KT
Ki
=K
2Ti
2
KT
Ti
Kd =
KTd
T
Ganancia Proporcional
Ganancia Integral
Ganancia Derivativa
y T es el periodo de muestreo.
Ntese que la ganancia proporcional para el controlador PID digital es ms pequea que la
ganancia K para el controlador PID analgico por un factor de Ki/2.
La ecuacin 1.3 puede ser realizada utilizando programacin paralela como indica la figura 7.
Ki
p(kT)
+
+
T
e(kT)
u(kT)
Kp
+
+
Kd
T
q(kT)
BEGIN
DO FOREVER
END
r(kT)
y(kT)
e(kT)=r(kT)y(kT)
P(kT)=Ki.e(kT)+p(kT-T)
q(kT)=Kd.e(kT)Kd.e(kT-T)
u(kT)=p(kT)+Kp.e(kt)+q(kT)
Guarde variables:
p(kT-T)=p(kT)
e(kT-T)=e(kT)
Periodo de Muestreo
Como periodo de muestreo se toma normalmente 1/10 del tiempo de subida del sistema en
lazo cerrado. El tiempo de subida se define como el tiempo necesario para que el sistema pase
del 10% al 90% del valor final de la respuesta.
Otro criterio que se puede usar es 1/10 de la constante de tiempo del sistema. La constante de
tiempo de un sistema se define como el tiempo necesario para que la respuesta a un escaln
unitario alcance el 63% del valor final de la respuesta. Para un sistema que logra su valor final
a los 2 seg. se toma como periodo de muestreo T igual a 0.12 seg. que es 1/10 de la
constante de tiempo del sistema.
Hardware
La fig. 8 muestra el prototipo desarrollado que consta de: Motor DC de escobillas 25 Voltios,
tacmetro, H-Bridge basado en el LMD18200 y fuente de poder 5VDC para la lgica TTL. La
alimentacin de 25VDC para el motor se obtuvo de una fuente de poder variable de laboratorio.
El microcontrolador y el resto del circuito se implement en un break-board separado.
Motor DC
Fuente Poder
+5VDC
Tacmetro
Control LMD18200
+5VDC
+5VDC
Kd
+5VDC
Ki
100
Kp
100
10K
0.1uf
0.1uf
100
10K
0.1uf
+5VDC
RPM
100
10K
10K
0.1uf
+5VDC
10nf
33
34
35
36
37
38
39
40
.1uf
LED
13
14
1K
10Mhz
11
32
PIC18F452
22pf
8
9
10
Vs
Dir
PWM
Brake
Ground
9
Sense TFO
180
10K
1
7414
2
Seal
LMD18200
+5VDC
19
20
21
22
27
28
29
30
+5VDC
10nf
MOTOR DC
CNZ1021
10K
+5VDC
14
13
12
11
10
9
8
7
6
5
4
3
2
1
.1uf
15
16
17
18
23
24
25
26
1
B1 2
Out1 10
Out2 11
B2
D7
D6
D5
D4
D3
D2
D1
D0
E
R /W
RS
VEE
VC C
VSS
VDD
RC0/T1OSO/T1CKI
RA0
RC1/T1OSI
RA1
CCP1/RC2
RA2
RC3/SCK/SCL
RA3
RC4/SKI/SDA
RA4/TOCKI
RC5/SDO
RA5/SS
RC6/TX/CK
RC7/RX/DT
INT0/RB0
INT1/RB1
RD0/PSP0
INT2/RB2
RD1/PSP1
CCP2/RB3
RD2/PSP2
RB4
RD3/PSP3
RB5
RD4/PSP4
RB6
RD5/PSP5
RB7
RD6/PSP6
RD7/PSP7
OSC1/CLKIN
OSC2/CLKOUT
RE0/RD
MCLR/VPP
RE1/WR
RE2/CS
VDD
VDD
VSS
VSS
2
3
4
5
6
7
U4
12
31
10K
+5VDC 25VDC
6
3
5
4
7
8
LCD-Display
+5VDC
4.7K
Software
El Software fue escrito utilizando el compilador C de CCS inc. Los valores de los parmetros
del PID se obtienen a travs de canales del convertidor analgico digital de 10bits. Estos
valores son puestos a formato q7, para que estn en un rango de 0 a 1. El rango de los
parmetros del PID se modifican, cambiando el valor de esta variable. Toda la aritmtica se
realiza utilizando formato q7 a fin de evitar overflow.
El lazo PID se realiza cada 26 miliseg y la actualizacin del duty cicle del mdulo PWM se
realiza cada 408 microseg. El despliegue de informacin en la pantalla LCD se refresca cada
segundo.
///////////////////////////////////////////////////////////////////////////
////
MAESTRO_PID.C
////
////
Control PID de Velocidad de un Motor DC
////
////
Versin Aritmetica Fixed Point
////
///////////////////////////////////////////////////////////////////////////
#include <18f452.h>
#device ADC=10
#fuses HS,PUT,BROWNOUT,WDT128,NOLVP
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
#use delay(clock=10000000,RESTART_WDT)
#use rs232(baud=19200,parity=N,xmit=PIN_C6,rcv=PIN_C7)
#zero_ram
#define TIMER3_DIV 120
#byte
#byte
#byte
#byte
PORTA
PORTB
PORTC
PORTE
=
=
=
=
0xF80
0xF81
0xF82
0xF84
= 0xFCE
= 0xFCF
#define ALL_OUT 0
#define ALL_IN 0xff
/**************************************************************************
* Variables Globales
**************************************************************************/
int tickcount, t;
unsigned ledticks;
unsigned int16 wheel_counts, wheel_test, last_counts;
unsigned int16 delta_counts;
signed int16 pwmSet;
unsigned int16 Driver_pwm;
signed int16 error;
unsigned int16 iPrev;
signed int8 error_S8, ePrev;
I
D ");
%D ",P_GAIN_S8, I_GAIN_S8, D_GAIN_S8);
Counts
%04LU
");
",Vel, Delta_counts);
");
",error);
");
",pwmSet);
/**************************************************************************
* Enviar datos puerto Serial
**************************************************************************/
void rs232(void) {
//
printf("%05LU,", conta0);
//
printf("%03LU,", timer0);
//
printf("%01.4f,", vout0);
//
printf("%01.4f,", vout1);
//
printf("%01.4f,", vout2);
//
printf("%01.4f,", vout3);
// printf("\n\r");
}
/**************************************************************************
* Actualiza el contador tick, retorna no-cero si cambia
**************************************************************************/
short geticks(void)
{
static BYTE tc, lastc=0;
tc = ((get_timer3()>>8) - lastc);
if (tc >= TIMER3_DIV)
{
tickcount++;
lastc += TIMER3_DIV;
return 1;
}
return 0;
}
/***************************************************************************
* Chequea si timeout usando el contador tick dado
***************************************************************************/
short timeout(int &var, int tout)
{
short ret=0;
if (!tout || tickcount-var>=tout)
{
var = tickcount;
ret = 1;
}
return(ret);
}
/**************************************************************************
* Interrupcion INT0
**************************************************************************/
#INT_EXT
// Switch Display UP
void EXT0_isr(void)
{
if(channel == 3)
channel = 0;
else
channel++;
}
/**************************************************************************
* Interrupcion INT1
**************************************************************************/
#INT_EXT1
// Switch Display Down
void EXT1_isr(void)
{
if(channel == 0)
channel = 3;
else
channel--;
}
/**************************************************************************
* Actualiza PWM Duty Cycle
**************************************************************************/
#int_TIMER2
void TIMER2_isr(void)
// 408 microseg - 2450.98 Hz.
{
// update PWMs during rollover for
// glitch-free operation
set_pwm1_duty(Driver_pwm);
// put x% duty on Drive Signal
}
/***************************************************************************
* Lazo PID
***************************************************************************/
#int_timer3
void timer3_isr(void)
// Periodo de muestreo cada 26 miliseg
{
t = t + 1;
Wheel_counts = TMR1H;
wheel_counts = wheel_counts<<8;
Wheel_counts += TMR1L;
Wheel_test = TMR1H;
wheel_test = wheel_test<<8;
Wheel_test += TMR1L;
if(Wheel_test != Wheel_counts)
{
Wheel_counts = TMR1H;
wheel_counts = wheel_counts<<8;
Wheel_counts += TMR1L;
}
//velocidad del motor en pulsos/periodo de muestreo
delta_counts = (Wheel_counts - last_counts);
last_counts = Wheel_counts;
read_vel();
// repone formato q7
//Accin de control
read_pid_Gain();
SYSLED = !SYSLED;
rs232();
desplegar_datos(channel);
t = 0;
}
}
}
Conclusiones
La realizacin de un control PID es una tarea sencilla, pero la entonacin de los parmetros es
compleja. Partiendo del conocimiento del efecto de cada parmetro sobre la accin de control
total y experimentando con diferentes valores, se puede obtener un rendimiento satisfactorio
del sistema.