Control Digital de Velocidad de Un Motor DC

16
Control de Velocidad Digital PID de un Motor DC de Escobillas Introducción 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 automática. El sistema se realizó usando un motor DC de escobillas extraído de una impresora de inyección de tinta, el cual es controlado por un H-bridge basado en un chip LMD18200 que permite usando la técnica PWM variar la velocidad del motor y su sentido de giro. Como unidad de realimentación, se utiliza un tacómetro construido como se detalla más adelante y todo el sistema es controlado por un microcontrolador PIC18F452. Sistema de Control de Lazo Cerrado Tal como se muestra en la fig. 1, el sistema consta de un pequeño motor DC de escobillas, cuya sección de potencia la constituye un H-Bridge que permite, por un lado, definir la dirección de giro y por otro, controlar la velocidad con la aplicación de una señal PWM. El lazo de control es cerrado usando un tacómetro construido con un disco de acetato codificado colocado en el eje del motor y el cual se hace pasar por un foto interruptor, para producir así pulsos cuya cantidad por unidad de tiempo es proporcional a la velocidad de giro del motor. Fig. 1 Control de Lazo Cerrado Modulación de Ancho de Pulso (PWM) Es el mecanismo utilizado para variar la velocidad de un motor DC de escobillas. Consiste en variar la anchura de pulso o el duty cycle en un ciclo de PWM de manera de variar el average de la tensión DC aplicada al motor, tal como muestra la fig. 2. Carlos A. Narváez V, 2008 Autor: Ing. Carlos Narváez Universidad de Oriente email: [email protected]

Transcript of Control Digital de Velocidad de Un Motor DC

Page 1: Control Digital de Velocidad de Un Motor DC

Control de Velocidad Digital PID de un Motor DC de Escobillas

Introducción 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 automática. El sistema se realizó usando un motor DC de escobillas extraído de una impresora de inyección de tinta, el cual es controlado por un H-bridge basado en un chip LMD18200 que permite usando la técnica PWM variar la velocidad del motor y su sentido de giro. Como unidad de realimentación, se utiliza un tacómetro construido como se detalla más adelante y todo el sistema es controlado por un microcontrolador PIC18F452. Sistema de Control de Lazo Cerrado Tal como se muestra en la fig. 1, el sistema consta de un pequeño motor DC de escobillas, cuya sección de potencia la constituye un H-Bridge que permite, por un lado, definir la dirección de giro y por otro, controlar la velocidad con la aplicación de una señal PWM. El lazo de control es cerrado usando un tacómetro construido con un disco de acetato codificado colocado en el eje del motor y el cual se hace pasar por un foto interruptor, para producir así pulsos cuya cantidad por unidad de tiempo es proporcional a la velocidad de giro del motor.

Fig. 1 Control de Lazo Cerrado

Modulación de Ancho de Pulso (PWM)

Es el mecanismo utilizado para variar la velocidad de un motor DC de escobillas. Consiste en variar la anchura de pulso o el duty cycle en un ciclo de PWM de manera de variar el average de la tensión DC aplicada al motor, tal como muestra la fig. 2.

Carlos A. Narváez V, 2008

Autor: Ing. Carlos Narváez Universidad de Oriente email: [email protected]

Page 2: Control Digital de Velocidad de Un Motor DC

Fig. 2 Modulación de Ancho de Pulso

PWM es una manera eficiente, para simular un rango de valores análogos usando circuitos digitales. Switchando rápidamente entre cero voltios y el voltaje nominal del motor, se obtiene un valor promedio comprendido entre esos dos límites. Tres señales son presentadas en la figura arriba, todas tienen la misma frecuencia, pero el ancho de los pulsos son diferentes. Variando la duración del tiempo “on”, el motor puede ver un promedio de cualquier valor entre 0V y +V. Frecuencias recomendadas para PWM están entre 20 y 30 Khz.

H-Bridge

El H-Bridge es básicamente un mecanismo para hacer girar un motor DC en dirección hacia adelante y en reversa. Un H-Bridge típico de motores DC de escobillas es el integrado LMD18200 de Nacional Semiconductors el cual puede suministrar continuamente hasta 3 Amp

.1uf 10nf

10nf

U1

LMD18200

123

45

6

1011

78 9

B1Out1Dir

BrakePWM

Vs

Out2B2

GroundSense TFO

A-

+

MOTOR DC

12

VS

Fig. 3 H-Brigde LMD18200

Carlos A. Narváez V, 2008

Page 3: Control Digital de Velocidad de Un Motor DC

y opera con suministro de voltaje de hasta 55 Voltios. Tiene protección 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, dirección, sensor de corriente y señal 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 señal de advertencia de temperatura. Es una salida colector abierto que se vuelve ¨0¨ a 145 grados centígrados. El pin Brake realiza un freno de emergencia del motor cuando este pin pasa a ¨1¨y el pin PWM también.

El LMD18200 puede manejar señales PWM del tipo Signo-Magnitud y Locked-antiphase las cuales se describen a continuación.

PWM Locked-antiphase

La Señal PWM de tipo Locked-antiphase, consiste en un única señal de anchura de pulso variable en la cual se codifica tanto la información de dirección como la de amplitud. El 50% de la anchura de pulso representa cero. Valores por debajo del 50% representan dirección reversa y valores por encima del 50% representan dirección hacia adelante del motor. Para el LMD18200 el uso de este tipo de señal PWM implica usar el pin 3 (DIR) como entrada de la señal PWM, mientras el pin 5 (PWM) se lleva a valor lógico 1.

Una de las grandes ventajas de usar señales PWM del tipo locked-antiphase es que sólo se necesita una línea I/O para controlar completamente el motor. Si se tiene restricciones de líneas I/O, esta puede ser una buena opción.

PWM Signo Magnitud

Si se usa señal PWM del tipo signo-magnitud, el microcontrolador establece la dirección de giro del motor a través de un pin del H-Brigde destinado para tal fin (Dir) y varia la cantidad de potencia aplicada al motor o duty-cicle con otro pin del H-Brigde denominado PWM. La ausencia de pulso o lógica 0 en forma continua representa cero y lógica 1 en forma continua representa 100%. Este tipo de señal, por su sencillez, se ha usado en la realización del presente trabajo.

Implementando Modulación de Ancho de Pulso (PWM) en un PIC Para obtener una señal PWM, se usa el timer2, el cual establece la frecuencia de la señal PWM cargando un valor en el registro PR2. El ciclo se inicia con un reset, donde timer2 pasa a cero, luego se va incrementando hasta que su valor iguale a PR2, momento en que ocurre un nuevo reset y así sucesivamente. La anchura del pulso ó el tiempo que la señal permanece a 1 (duty cycle), viene dado por el valor cargado en el registro CCPR1L:CCP1CON<5:4> (8bits ó 10bits). Así cuando ocurre un reset del timer2, el pin de salida PWM pasa a 1, luego cuando timer2 iguale el valor cargado en el registro CCPR1L:CCP1CON<5:4>, el pin de salida PWM pasa a 0. El timer2 continua su conteo hasta que iguale a PR2 y un nuevo reset ocurre.

Carlos A. Narváez V, 2008

Page 4: Control Digital de Velocidad de Un Motor DC

Fig. 4 Ciclo PWM

La fig. 4 muestra un ciclo de una señal PWM. La instrucción setup_ccp1(CCP_PWM) configura el módulo CCP1 como PWM, entonces la patita RC2/CCP1, funciona como salida PWM. El periodo de duración de un ciclo de PWM esta determinado por el valor cargado en PR2 según la fórmula: PWM_Periodo=(1/clock)*4*t2div*(PR2+1) PR2=((PWM_periodo*clock)/(4*t2div))-1 y la anchura de pulso (duty cycle) o tiempo que la señal PWM esta alta durante cada ciclo, viene dada por la formula: Duty_cycle= value*t2div*(1/clock) si value es LONG INT y Duty_cycle= value*t2div*4*(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 instrucción: set_pwm1_duty(value); La instrucción: 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 número entre 1 y 16 que determina cuantas veces el timer2 se resetea antes de ocurrir una interrupción.

Carlos A. Narváez V, 2008

Page 5: Control Digital de Velocidad de Un Motor DC

Ejemplo: Si clock = 20MHZ y PR2 = 127, entonces, un ciclo de PWM dura: Periodo = 1/20000000)*4*1*128 = 25.6 us Luego usando la instrucción: setup_timer_2(T2_DIV_BY_1, 127, 5); Tenemos que Timer2 se incrementa cada 200nseg, reset cada 25.6 useg y genera una interrupción cada 25.6 * 5 = 128 useg. Además 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%.

Tacómetro digital El tacómetro se construyó usando un foto-interruptor CNZ1021 a través 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 Smith-trigger 7414 y realimentados al microcontrolador para así calcular la velocidad de rotación del motor.

Fig. 5 Disco Codificado 12 Pulsos/revolución La fig. 6, muestra el circuito del tacómetro construido utilizando un foto-interruptor CNZ1021 y un acondicionador de señal Smith Trigger 7414.

10K 7414

1 2

CNZ1021

+5VDC

180

Señal

Fig. 6 Tacómetro

Carlos A. Narváez V, 2008

Page 6: Control Digital de Velocidad de Un Motor DC

Implementando un Control PID La acción de control PID en controladores analógicos esta dada por:

++= ∫ dt

tdeTddtteTi

teKtut )()(1)()(0

(1-1)

Donde e(t) es la entrada al controlador (señal 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).

En el dominio S, el controlador PID puede ser escrito como:

)(..11)( SESTdSTi

KSU

++= (1.2)

La forma discreta del controlador PID puede ser derivado encontrando la transformada Z de la ecuación 1.2:

)()1()1(2

1)(1

1 ZETZTd

ZTiT

TiTKZU

−+

−+−=

− (1.3)

ó

)1(1)(

)( 11

−− −+

−+= ZKd

ZKiKp

ZEZU (1.4)

donde:

22KiK

TiKTKKp −=−= Ganancia Proporcional

TiKTKi = Ganancia Integral

T

KTdKd = Ganancia Derivativa

y T es el periodo de muestreo.

Carlos A. Narváez V, 2008

Page 7: Control Digital de Velocidad de Un Motor DC

Nótese que la ganancia proporcional para el controlador PID digital es más pequeña que la ganancia K para el controlador PID analógico por un factor de Ki/2.

La ecuación 1.4 puede ser realizada como indica la figura 7.

Fig. 7 Realización paralela de un controlador PID

Esto puede ser implementado en un computador digital usando el siguiente seudo-código: BEGIN DO FOREVER

Obtenga el set point: r(kT) Obtenga la salida del sistema: y(kT) Calcule el error: e(kT)=r(kT)–y(kT) Calcule el término I: P(kT)=Ki.e(kT)+p(kT-T) Calcule el término D: q(kT)=Kd.e(kT)–Kd.e(kT-T) Calcule la Salida PID: u(kT)=p(kT)+Kp.e(kt)+q(kT) Envíe control al motor

Guarde variables: p(kT-T)=p(kT)

e(kT-T)=e(kT) Espere hasta próximo periodo de muestreo

ENDDO END

Carlos A. Narváez V, 2008

e(kT)

Ki

Kp

Kd

T

T

u(kT)

q(kT)

p(kT)

+ +

+

+

+

-

Page 8: Control Digital de Velocidad de Un Motor DC

Sintonización de los parámetros del PID Conociendo el modelo matemático del motor, es decir su función de transferencia de lazo abierto, podemos aplicar numerosos métodos que incluye la representación de Bode, método de Laplace, respuesta en frecuencia, criterio de Nyquist, lugar geométrico de la raíces y otros para hallar los parámetros del PID adecuados. Como criterio de diseño general, se escogen los parámetros de tal manera que el sistema en lazo cerrado sea estable, de respuesta rápida y sin sobrepaso. Como herramienta de trabajo se pueden usar programas como MATLAB. Existen también, métodos experimentales tales como el ideado en 1942 por John G. Ziegler y Nathaniel B. Nichols que partiendo de la respuesta del proceso a un escalón unitario en lazo abierto, se pueden obtener los parámetros del PID. Ziegler y Nichols también describieron una técnica de ajuste en lazo cerrado. En casos donde no tenemos el modelo del motor, ni podamos aplicar métodos experimentales como Ziegler y Nichols, se puede utilizar un método de prueba y error basado en el conocimiento de lo que cada acción de control (proporcional, integral y derivativa) aporta a la acción de control general del sistema. Por simplicidad utilizaremos esta técnica en el presente trabajo, la cual se describe a continuación: 1) Se requiere de una manera de variar instantáneamente el valor de referencia (set-point) de cero al máximo de la velocidad esperada. Esto es equivalente aplicar un escalón a la entrada del controlador. 2) Teniendo la ganancia integral y derivativa a cero. Aplique un escalón repetidamente variando cada vez la ganancia proporcional hasta obtener un valor razonable de Kp. Esto es que la respuesta se aproxime a la entrada y oscile continuamente alrededor de la entrada con una pequeña cantidad de amortiguamiento. Si la oscilación no decrece gradualmente en su amplitud, entonces el sistema es considerado inestable. 3) Luego que se encuentre un valor razonable para Kp, se trabaja con el ajuste de Kd. Aplique un escalón repetidamente variando cada vez la ganancia derivativa hasta obtener un valor razonable de Kd. Esto es que la respuesta se amortigue rápidamente eliminando las oscilaciones alrededor de la entrada y permaneciendo en un valor ligeramente menor que el valor de la entrada. Esto es lo que se denomina error de estado estable y que puede ser corregido con el ajuste de Ki. 4) Luego que se encuentre un valor razonable para Kd, se trabaja con el ajuste de Ki. Aplique un escalón repetidamente variando cada vez la ganancia integral hasta obtener un valor razonable de Ki. Esto es eliminar el error de estado estable tal que la respuesta sigue a la entrada. Este parámetro debe ajustarse cuidadosamente pues puede introducir inestabilidad en el sistema. 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 escalón 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.

Carlos A. Narváez V, 2008

Page 9: Control Digital de Velocidad de Un Motor DC

Hardware

La fig. 8 muestra el prototipo desarrollado que consta de: Motor DC de escobillas 25 Voltios, tacómetro, H-Bridge basado en el LMD18200 y fuente de poder 5VDC para la lógica TTL. La alimentación 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.

Fig. 8 Prototipo Control Motores DC de escobillas

La fig. 9 muestra el diagrama esquemático utilizado en este trabajo. En el podemos observar lo siguiente: Se utiliza cuatro potenciómetros conectados a cuatro canales del convertidor analógico digital del PIC18F452, los tres primeros representan los parámetros del controlador digital (Kp, Ki y Kd) y el último establece la velocidad referencia o setpoint. Se utiliza una pantalla LCD de 16X2 caracteres, comandada por dos interruptores (push-botton) los cuales permiten desplegar información variada, uno de ellos despliega la información en sentido hacia delante y el otro en reversa. El LMD18200 ha sido configurado para ser utilizado en modo PWM signo-magnitud. La dirección de giro se escogió de manera arbitraria, en este caso colocando el pin Dir a “1” y el freno (pin Brake) se deshabilitó colocando este pin a “0”. La señal PWM se obtiene configurando el módulo CCP1 del microcontrolador en modo PWM y los pulsos generados por el tacómetro son realimentados al microcontrolador y contados configurando el TIMER1 en modo contador. El microcontrolador trabaja a 10Mhz.

Carlos A. Narváez V, 2008

Tacómetro

Motor DC

Fuente Poder +5VDC

Control LMD18200

Page 10: Control Digital de Velocidad de Un Motor DC

Kp

22pf

10K

10nf

10Mhz

+5VDC

0.1uf

100

+5VDC

100

10K

7414

1 2

+5VDC

1KLED

PIC18F452

8910

12

14

15161718

19202122

23242526

27282930

31

1

13

234567

3334353637383940

3211

RE0/RDRE1/WRRE2/CS

VS

S

OSC2/CLKOUT

RC0/T1OSO/T1CKIRC1/T1OSICCP1/RC2

RC3/SCK/SCL

RD0/PSP0RD1/PSP1RD2/PSP2RD3/PSP3

RC4/SKI/SDARC5/SDO

RC6/TX/CKRC7/RX/DT

RD4/PSP4RD5/PSP5RD6/PSP6RD7/PSP7

VS

S

MCLR/VPP

OSC1/CLKIN

RA0RA1RA2RA3RA4/TOCKIRA5/SS

INT0/RB0INT1/RB1INT2/RB2CCP2/RB3RB4RB5RB6RB7

VDDVDD

100

+5VDC

A-

+

MOTOR DC

12

10nf

.1uf

10K

10K

+5VDC

0.1uf

U4

LMD18200

123

45

6

1011

78 9

B1Out1Dir

BrakePWM

Vs

Out2B2

GroundSense TFO

+5VDC

VDD

LCD-Display

1234567891011121314

VSS

VC

CV

EERS

R/WED

0D

1D

2D

3D

4D

5D

6D

7

.1uf

RPM

10K

+5VDC

+5VDC

0.1uf

100

Kd

4.7K

CNZ1021

Señal

10K

+5VDC

10K

Ki

0.1uf

25VDC

+5VDC

180

Fig. 9 Diagrama Esquemático del Sistema

Carlos A. Narváez V, 2008

Page 11: Control Digital de Velocidad de Un Motor DC

Software

El Software fue escrito utilizando el compilador C de CCS inc. Los valores de los parámetros del PID se obtienen a través de canales del convertidor analógico digital de 10bits. Estos valores son divididos por la variable INPUT_SCALE, para que los valores estén en un rango de 0 a 1. El rango de los parámetros del PID se modifican, cambiando el valor de esta variable. El lazo PID se realiza cada 26 miliseg y la actualización del duty cicle del módulo PWM se realiza cada 408 microseg. El despliegue de información en la pantalla LCD se refresca cada segundo.

/////////////////////////////////////////////////////////////////////////// //// MOTOR_PID.C //// //// Control PID de Velocidad de un Motor DC //// /////////////////////////////////////////////////////////////////////////// #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 PORTA = 0xF80 #byte PORTB = 0xF81 #byte PORTC = 0xF82 #byte PORTE = 0xF84 #bit SYSLED = PORTB.4 #define LEDTIME 10 #byte TMR1L = 0xFCE /* definitions for Timer1 module */ #byte TMR1H = 0xFCF #define ALL_OUT 0 #define ALL_IN 0xff /************************************************************************** * Variables Globales **************************************************************************/ int tickcount, t; unsigned ledticks; // P_GAIN, I_GAIN, D_GAIN valor entre 0.0 y 1.0 resolucion 0.0009 #define Input_Scale 1024; unsigned int16 wheel_counts, wheel_test, last_counts; unsigned int16 delta_counts; signed int16 pwmSet; signed int16 error, ePrev, iPrev; unsigned int16 Drive_Command; // PWM values

Carlos A. Narváez V, 2008

Page 12: Control Digital de Velocidad de Un Motor DC

//definiciones para motor trabajando a 25 Voltios DC #define MIN_PULSES 1 /* Mínimo pulsos por periodo de muestreo */ #define MAX_PULSES 21 /* Máximo pulsos por periodo de muestreo */ #define MAX_PWM 1015 /* Maximo PWM (100%) del controlador */ #define MIN_PWM 40 /* Minimo PWM del controlador */ unsigned int channel; signed int16 P_Term, I_Term, D_Term; unsigned int16 Vel, P_GAIN, I_GAIN, D_GAIN; #include "lcd-pd.h" // Rutinas Manejo LCD /************************************************************************** * Leer Velocidad Motor **************************************************************************/ void read_Vel(void) {

SET_ADC_CHANNEL(0); delay_us(10); Vel = READ_ADC(); // Motor Velocidad, escala 0-1023 } /************************************************************************** * Leer Ganancias PID **************************************************************************/ void read_pid_Gain(void) { SET_ADC_CHANNEL(1); delay_us(10); P_GAIN = READ_ADC(); // Ganancia Proporcional SET_ADC_CHANNEL(2); delay_us(10); I_GAIN = READ_ADC(); // Ganancia Integral SET_ADC_CHANNEL(3); delay_us(10); D_GAIN = READ_ADC(); // Ganancia derivativa } /************************************************************************** * desplegar datos segun channel **************************************************************************/ void desplegar_datos(int channel) {

switch(channel) { case 0: printf(displays,"\r P I D "); printf(displays,"\n%4LU %4LU %4LU ",P_GAIN, I_GAIN, D_GAIN); break; case 1: printf(displays,"\rVel. Counts "); printf(displays,"\n%04LU %04LU ",Vel, Delta_counts); break;

case 2: printf(displays,"\rError "); printf(displays,"\n%5ld ",error); break; } }

Carlos A. Narváez V, 2008

Page 13: Control Digital de Velocidad de Un Motor DC

/************************************************************************** * Interrupcion INT0 Switch Display UP **************************************************************************/ #INT_EXT void EXT0_isr(void) { if(channel == 2) channel = 0; else channel++; } /************************************************************************** * Interrupcion INT1 Switch Display Down **************************************************************************/ #INT_EXT1 void EXT1_isr(void) {

if(channel == 0) channel = 2; 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(Drive_Command); // put x% duty on Drive Signal } /*************************************************************************** * Lazo PID Periodo de muestreo cada 26 miliseg ***************************************************************************/ #int_timer3 void timer3_isr(void){ t = t + 1; Wheel_counts = TMR1H << 8;

Wheel_counts += TMR1L; Wheel_test = TMR1H << 8; Wheel_test += TMR1L; if(Wheel_test != Wheel_counts) { Wheel_counts = TMR1H << 8; Wheel_counts += TMR1L; }

//velocidad del motor en pulsos/periodo de muestreo

delta_counts = (Wheel_counts - last_counts); last_counts = Wheel_counts;

//Velocidad Referencia (Setpoint) Escala 0-1023 read_vel(); // Escale delta_counts a valores PWM (0-1023)

// para usar la misma escala y calcule el Error error = (vel - ((delta_counts*MAX_PWM) / MAX_PULSES));

Carlos A. Narváez V, 2008

Page 14: Control Digital de Velocidad de Un Motor DC

// Ecuación Estándar PID

P_Term = (signed int32)P_GAIN * error/input_scale; I_Term = (signed int32)I_GAIN * error/Input_Scale; I_Term = I_Term + iPrev; D_Term = (signed int32)(D_GAIN * error - D_GAIN * ePrev)/Input_Scale; //Acción de control escala 0-1023

pwmSet = pwmset + (P_Term + I_Term + D_Term) ;

// Guarde el error actual y el término integral actual //para se usado como valores previos en el próximo periodo de muestreo

ePrev = error;

iPrev = I_Term; // Limite la salida al Máximo o mínimo del Controlador

if(pwmSet >= MAX_PWM) pwmSet = MAX_PWM; else if(pwmset <= MIN_PWM) pwmSet = MIN_PWM;

// Aplique valor a módulo PWM del microcontrolador

Drive_Command = (int16)pwmSet; } /************************************************************************** * Programa Principal **************************************************************************/ void main() { setup_adc_ports(ALL_ANALOG); // Configura los 8 Convertidores A/D setup_adc(ADC_CLOCK_DIV_32); // setup_wdt(WDT_ON);

// Perro guardian ON setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1); // Contador eventos Externos setup_ccp1(CCP_PWM); // Configura modulos CCP1 como PWM setup_timer_2(T2_DIV_BY_4, 255, 1); // PWM 2.44Khz, interrupción 40 mseg setup_timer_3(T3_INTERNAL|T3_DIV_BY_1); // Real time interval 26 milliseg set_tris_A(ALL_IN); set_tris_B(0x0F); set_tris_c(0x01); set_tris_D(ALL_OUT); LCD_SETUP(); disp_serial = FALSE; disp_lcd = TRUE; timeout(ledticks,0); port_b_pullups(false); read_pid_Gain(); // Leer ganancias PID set_pwm1_duty(0); enable_interrupts(INT_EXT); ext_int_edge(0,H_TO_L); enable_interrupts(INT_EXT1); ext_int_edge(1,H_TO_L); enable_interrupts(INT_TIMER2); enable_interrupts(INT_TIMER3); enable_interrupts(GLOBAL); while(1) { restart_wdt(); if(t > 38) // Una vez por segundo.... { read_pid_Gain(); SYSLED = !SYSLED; desplegar_datos(channel); t = 0; } } }

Carlos A. Narváez V, 2008

Page 15: Control Digital de Velocidad de Un Motor DC

Conclusiones

La realización de un control PID es una tarea sencilla, pero la entonación de los parámetros es compleja. Partiendo del conocimiento del efecto de cada parámetro sobre la acción de control total y experimentando con diferentes valores, se puede obtener un rendimiento satisfactorio del sistema.

Carlos A. Narváez V, 2008

Page 16: Control Digital de Velocidad de Un Motor DC