proyecto control de motor dc
DESCRIPTION
Motor control based on low scale microcontrollersTRANSCRIPT
UNIOVI – EPI GIJON
“Control de Posición y Velocidad de un Motor DC” Pedro Arévalo Molina
Escuela Politécnica de Gijón, UNIOVI
Gijón – Asturias – España [email protected]
Abstract – Este documento expone un método de control de
posición y velocidad de un motor de corriente continua presente
en el módulo UMF, mediante un microcontrolador PIC16F917.
El diseño esquemático del hardware utilizado se lo hizo a partir
de ISIS Proteus, y el diseño PCB se lo hizo mediante ARES. Si
bien el hardware es indispensable para el control realizado, el
presente documento se centra en el software implementado para
el microcontrolador. Dicho software fue diseñado en primer
lugar en ANSI C++ y luego mediante el compilador CCS se lo
grabó en el PIC. El código incluye rutinas básicas de control con
son adquisición de datos, comparación entre referencia y señales
de realimentación, cálculo de la señal de control, y generación de
la señal de control. El programa permite realizar comunicación
serial RS232 con el computador, para ampliar el rango de
opciones para el usuario, el cual puede escoger entre control de
posición o velocidad, escoger la referencia para el control, ya
que puede ser un potenciómetro presente en el módulo UMF o
mediante RS232, cambiar la ley de control RZ, encender o
apagar el motor de forma general.
Índices – Control de Posición, Control de Velocidad,
Comunicación RS232, programación de PIC16F917.
I. INTRODUCCIÓN
Un sistema de control no solo está formado por las leyes que
gobiernan el control, sino también por la parte física que permite la
ejecución de estas leyes. En el presente proyecto, el control se
implementa mediante un microcontrolador que ejecuta el código
correspondiente al control deseado y además permite realizar
adquisición de datos y generación de señales de control, en este caso
PWM. Como primer punto, se abordará brevemente el tema del
hardware necesario para la implementación de este control.
A. Placa de control
El diseño del hardware utilizado considera las siguientes etapas:
Acondicionamiento de señales para la adquisición de datos en base a
amplificadores de instrumentación implementados mediante TL084,
comunicación serial RS232 mediante un MAX232, visualización en
LCD, indicadores de modo de control mediante LEDs, interfaz de
programación mediante RJ-11. El diseño esquemático de los
circuitos mencionados fue elaborado en ISIS Proteus, y el diseño del
circuito impreso en ARES.
II. MÓDULOS DEL MICROCONTROLADOR USADOS EN EL
SOFTWARE DE CONTROL
Para la explicación de los módulos utilizados en el software de
control, se dividirá al mismo en sus respectivas funciones que se
relacionan con un módulo específico, sobre el cual se dará una
explicación.
B. A. Adquisición de datos
Para la adquisición de datos se utilizan tres canales analógicos del
microcontrolador: AN0, AN1 y AN2. Las señales obtenidas en cada
canal son las siguientes:
- AN0: Realimentación de Posición (-180/180°)
- AN1: Realimentación de Velocidad (-120/120rpm)
- AN2: Referencia desde potenciómetro (-180/180)
En todos los casos las señales provienen del módulo UMF y
oscilan entre -10 y 10V. Es por ello que se utiliza una etapa de
acondicionamiento previo que convierte estos valores a un rango de
0–5V, que pueden ser ingresados al microcontrolador sin problema.
Para la adquisición de datos se utiliza el módulo de conversión A/D
del PIC, el cual trabaja con 10 bits, dando una resolución de
4.89mV/bit en el rango de 0–5V. Esto dignifica que para la
realimentación de posición se tiene una resolución de 0.352°/bit y
para realimentación de velocidad 0.235rpm/bit. La referencia
obtenida desde potenciómetro tiene la misma resolución que la
realimentación de posición, es decir 0.352u/bit. La referencia puede
estar dada en grados (°) o rpm.
Para la configuración del módulo de conversión A/D del
PIC16F917 se puede proceder de dos formas. Configurar
directamente los registros ADCON0 y ADCON1, o utilizar
instrucciones propias del lenguaje C para PIC. En ambos casos se
tendrá presente las siguientes características:
- Configurar pines correspondientes como entradas
analógicas
- Definir referencias o rangos de voltaje para la adquisición
- Seleccionar reloj de la conversión
- Habilitar módulo de conversión A/D
Cabe indicarse que no se utilizarán interrupciones cuando termina
la conversión A/D.
1) Configuración de ADCON0 y ADCON1
En el PIC16F917, el registro ADCON1 permite seleccionar el
reloj de la conversión. Para un tiempo de conversión por bit
TAD=4us, trabajando con el cristal interno del PIC en 8MHz, se debe
escoger la opción de TAD=32*TOSC, la cual se configura como sigue.
- ADCON1 = 0x20;
El registro ADCON0 permite configurar todos los demás
parámetros citados anteriormente. El código a utilizarse sería el
siguiente.
- ADCON0 = 0x081;
UNIOVI – EPI GIJON
Con esta instrucción se habilita el módulo de conversión A/D, se
rechazan los 6 bits más significativos del registro ADRES y se
selecciona por defecto el canal AN0 para la conversión. Los bits
ADCON <4-2> permiten seleccionar el canal con el que se desea
trabajar, y el bit ADCON,1 (GO/~DONE), permite iniciar la
conversión A/D. Los pasos para realizar una adquisición de datos
analógica en un canal específico serían los siguientes:
- Escoger canal mediante ADCON<4-2>.
- ADCON,1 = 1. (GO/~DONE), y esperar hasta que se
realice la conversión.
- Leer resultado almacenado en ADRES.
2) Configuración mediante instrucciones en C para PIC
Existe un set de instrucciones específicas que permite realizar la
misma configuración descrita anteriormente, de una forma más
sencilla y rápida. Las instrucciones presentadas a continuación
configura el módulo A/D para trabajar con un TAD=4us, AN0, AN1,
AN2 habilitados.
- setup_adc_ports (SAN0|SAN1|SAN2|VSS_VDD);
- setup_adc(ADC_CLOCK_DIV_32);
Finalmente, para la utilización del módulo A/D se procede de
forma similar a la descrita en II.B.1., es decir, primero seleccionar el
canal deseado y luego iniciar una conversión A/D, esperar por su
resultado y luego guardarlo en una variable. Este es el método
utilizado en el código de control diseñado.
- set_adc_channel(n);
- resultado = read_adc( );
C. Generación de Señal de Control
El módulo UMF permite controlar el motor DC mediante la
aplicación de una señal PWM. Al variar la relación de trabajo de la
señal PWM se puede realizar control de posición y de velocidad,
teniendo en cuenta lo siguiente.
- = 50%, motor detenido.
- < 50%, motor gira hacia la izquierda (ángulo negativo)
- > 50%, motor gira hacia la derecha (ángulo positivo)
Para la adecuada generación de la señal, se debe configurar el pin
correspondiente (RC5), como salida. El periodo de la señal PWM
generada por el microcontrolador, se rige por la siguiente expresión.
( ) (1)
La señal PWM a generarse tendrá una frecuencia de 500Hz, la
cual está dentro del límite definido por el módulo UMF,
adicionalmente, la frecuencia del cristal es de 8MHz, con lo cual la
expresión se reduce a lo siguiente.
( ) (2)
Asignando un valor de 16 al prescaler de TMR2, el registro PR2
tendrá un valor de 249.
Se pueden usar dos formas para configurar la salida PWM:
configurar los registros internos del PIC o usar instrucciones en C
para el PIC.
1) Configuración del módulo CPP1
Se utilizará la salida PMW del módulo CCP1, por lo que se
procede a configurar el registro CCP1CON, el cual permite
seleccionar el modo de trabajo del módulo CCP1.
- CCP1CON = 0x0F;
Con ello se configura el módulo CCP1 en modo PWM. Ahora
para la configuración del periodo de la señal, se configura el
TIMER2 mediante el registro T2CON, y el registro asociado PR2.
- T2CON = 0x07;
- PR2 = 249;
Esto permite encender el TMR2, configurar un prescaler de 16,
postscaler de 1, y cumplir con la frecuencia deseada (500Hz). La
señal generada surge de un registro de 10bits formados por el
registro CCPR1L (8bits), y los bits CCP1CON<5-4>. Al tener 10
bits para generar la señal, se tiene una resolución de 4.89mV/bit.
2) PWM mediante instrucciones en C para PIC
Al igual que para el caso de la configuración del módulo para
conversión A/D, es más sencillo y rápido configurar el módulo
CPP1 en modo PWM mediante instrucciones en C para PIC, cuya
secuencia sería como sigue.
- setup_ccp1(CCP,PWM);
- setup_timer_2(T2_DIV_BY_16,249,1);
Mediante esta sencilla secuencia de instrucciones se ha
configurado el módulo CCP1 en modo PWM para generar una señal
con frecuencia de 500Hz. La instrucción para variar la relación de
trabajo de la señal es la siguiente.
- set_pwm1_duty(dutyk);
Donde dutyk, representa un valor entre 0 – 1023 (10bits), que
corresponden linealmente a 0 – 100% de relación de trabajo.
D. Interrupciones para definir periodo de muestreo y
procesamiento de comando ingresado
Se han utilizado dos interrupciones en la implementación del
código de control en el PIC, las cuales son: interrupción por
desbordamiento del TIMER0 e interrupción externa, la cual se usa
para procesar el comando recibido mediante comunicación serial,
una vez que se ha presionado un pulsador colocado en RB0.
La interrupción por desbordamiento del TIMER0 será utilizada
para definir un periodo de tiempo luego del cual se ejecutan las
rutinas de adquisición de datos y actualización de la relación de
trabajo del PWM. Para este trabajo se ha definido este periodo en
20ms. Para implementar la interrupción del TMR0, se deben
configurar en primer lugar el temporizador y luego habilitar la
interrupción por desbordamiento. Cabe anotarse que si bien el
TMR0 debe ser configurado, no necesita ser activado.
Para realizar la configuración de ambas interrupciones, al igual
que en los casos anteriores, se pueden modificar directamente los
registros de configuración, que en este caso son únicamente
OPTION_REG para el temporizador y flanco a detectar en el
cambio de estado en RB0, e INTCON para habilitar las
interrupciones; o se pueden utilizar instrucciones en C para el PIC.
UNIOVI – EPI GIJON
1) Configuración de OPTION_REG e INTCON
Se iniciará con la configuración del temporizador. Para ello, se
usa la expresión presentada a continuación.
( ) (3)
Reemplazando los valores conocidos, y usando un prescaler de
256, el resultado es TMR0 = 99.75. Debido a que no se puede
asignar un valor decimal al registro TMR0 de 8bits, se asignará
TMR0 = 100. El registro OPTION_REG permite asignar el
prescaler al TMR0 en lugar del WDT, seleccionar el valor del
prescaler, y además configurar el flanco deseado para el cambio en
RB0. Dando el valor mostrado a continuación a OPTION_REG, se
asigna el prescaler al TMR0 con un valor de 256 y además se escoge
flanco descendente para la detección de cambio de estado en RB0.
- OPTION_REG = 0x87;
Finalmente para la configuración de las interrupciones, se deben
poner en 1 algunos bits específicos del registro INTCON, que son:
GIE (Global interrupt nable), T0IE (TMR0 overflow interrupt
enable), e INTE (external interrup enable). Para llevar a cabo esta
configuración, se escribe lo siguiente en INTCON.
- INTCON = 0xB0;
El registro INTCON tiene también bits que sirven de aviso
<<flag>> e indican qué interrupción tuvo lugar. En código
ensamblador, es necesario determinar que interrupción se ha
generado al verificar que <<flag>> está activada, y luego se debe
borrar este bit de flag para que la interrupción no sea recurrente sin
razón. Sin embargo, al estar trabajando mediante un compilador de
código en C, ya no es necesario desactivar las banderas que indican
la interrupción que ha tenido lugar, puesto que el compilador se
encarga de ello. Cabe anotarse que en el caso de la interrupción por
desbordamiento del TMR0, se debe volver a escribir el valor de
TRM0 = 100 para que vuelva a contar desde ese valor, caso
contrario, el TMR0 tomará el valor de cero (0) y el tiempo de 20ms
no se cumplirá sino que será mayor.
2) Interrupciones mediante funciones en C para PIC
A diferencia de la configuración mediante registros, la
configuración en base a instrucciones en C para el PIC, habilita cada
interrupción por separado, tal como se muestra en el siguiente
código que permite configurar temporizador e interrupción por
desbordamiento del TIMER0 y luego la interrupción externa con
flanco descendente. Este es el código utilizado en el programa.
- setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
- set_timer0(100);
- enable_interrupts(GLOBAL);
- enable_interrupts(INT_RTCC); //TMR0
- enable_interrupts(INT_EXT); //Externa
- ext_int_edge(H_TO_L); //flanco
//descendente
Debe tenerse en cuenta que el pin RB0 debe estar declarado como
entrada para poder llevar a cabo la interrupción configurada.
E. Comunicación serial bajo el estándar RS232
Se utiliza comunicación serial para enviar avisos al usuario sobre
las opciones que se pueden escoger, enviar mensajes que indican el
estado en que se encuentra el motor; y recibir los comandos que
ingrese el usuario para seleccionar los diferentes modos de control.
Estos comandos son códigos que representan un modo de control
determinado, así por ejemplo el comando “DEF”, indica que se
carguen los valores por defecto en los vectores _a[N] y _b[N]
utilizados para el cálculo de la ley de control. Los modos existentes
en el programa desarrollado se presentan a continuación.
- Control de posición con referencia desde potenciómetro,
“POS=POT”.
- Control de posición con referencia por teclado (RS232),
“POS=NUM”, donde NUM es directamente el valor
numérico deseado, por ejemplo “POS=90”.
- Control de velocidad con referencia desde potenciómetro,
“VEL=POT”
- Control de velocidad con referencia por teclado (RS232),
“VEL=NUM”.
- Apagar Motor, “PARAR”.
- Arrancar Motor, “ARRANCAR”.
- Cambio de la ley de control, que pide el ingreso de _a[N],
_b[N]; “RZ=[b0 b1 .. bm]/[1 a1 … an]”.
Para validar el modo escogido se debe presionar el pulsador de
RB0. Con ello, el microcontrolador procesa el contenido del
comando recibido en una rutina implementada como parte de la
interrupción externa. Más adelante se abordará el tema del
procesamiento de la cadena de caracteres recibida, por ahora se
describirá la configuración del módulo de comunicación serial
AUSART, que permite la transmisión / recepción de datos bajo el
estándar RS232 con formato NRZ.
Para que la comunicación pueda ser realizada con éxito se deben
definir parámetros como velocidad, número de bits por dato y bits
de parada. Para este caso se han escogido los siguientes parámetros.
- Velocidad: 9600 bps
- Número de bits: 8 bits por dato
- Bits de Parada: 1
- Paridad: Ninguna
Esta configuración aplica tanto para la transmisión como para la
recepción. Al igual que en los casos anteriores, existen dos modos
de configurar el módulo AUSART: mediante sus registros de
configuración o mediante instrucciones en C desarrolladas para el
PIC.
1) Configuración de registros TXSTA, RCSTA, SPBRG
Para configurar al módulo AUSART de la forma antes descrita, se
deben asignar valores específicos a los registros de control y estado
para transmisión y recepción TXSTA y RCST respectivamente, y al
registro SPBRG, que permite configurar el baud rate o velocidad de
comunicación.
En primer lugar se define la velocidad de 9600bps. Para ello hay
que escribir un valor en el registro SPBRG según la siguiente
fórmula, considerando alta velocidad de comunicación (BRGH=1),
y un cristal de 8MHz.
( ) (4)
UNIOVI – EPI GIJON
Por lo tanto se escribe SPBRG = 51. Con esta configuración se
tiene un error de 0.16% en el valor real de velocidad de
comunicación, lo cual es perfectamente asumible. Lo siguiente es
configurar los registros TXSTA y RCSTA como sigue.
- RCSTA = 0x90;
- TXSTA = 0x04;
RCSTA: Puerto serial habilitado, recepción con 8bits de datos,
recepción continua habilitada.
TXSTA: Transmisión con 8 bits de datos, transmisión
deshabilitada, AUSART en modo asincrónico, comunicación en alta
velocidad (BRGH=1).
Dado que la recepción puede ocurrir en cualquier momento, la
opción de recepción continua debe estar habilitada, mientras que la
transmisión al ser realizada en un momento determinado por el
programa, no necesita estar habilitada en todo momento sino
únicamente cuando se requiere transmitir los datos, es por ello que
se deshabilita la transmisión en la configuración inicial. No se
utilizará interrupción por recepción, ya que la rutina para recibir
datos y leerlos está dentro del main en un lazo <<while>>, con lo
cual en todo momento el microcontrolador está listo para recibir
datos y guardarlos de forma inmediata. Los datos recibidos se
almacenan en el registro RCREG, el cual debe ser leído luego de la
recepción. El registro RCREG debe ser leído para poder borrarlo y
permitir la recepción de los siguientes datos. RCREG puede
almacenar hasta dos datos sin ocasionar error por sobre escritura.
Para la transmisión de datos, en primer lugar se debe habilitar la
misma mediante TXSTA,TXEN=1, y luego se copia el dato a enviar
en el registro TXREG, esperar hasta que se transmita el dato y luego
escribir el TXREG el siguiente dato.
2) Configuración de comunicación serial mediante
instrucciones en C para el PIC
La configuración de la comunicación serial mediante
instrucciones en C para el PIC es mucho más sencilla y rápida.
Todos los parámetros de la configuración pueden ser definidos en
una sola instrucción. Este el método usado en el programa de
control.
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
De esta forma queda configurada la recepción continua y para
leer los datos se usa la instrucción <<gets>>, que permite recibir una
cadena de caracteres.
gets(cmd); //cmd: variable para cadena de caracteres
Para enviar datos, se procede al igual que en ANSI C++ mediante
la instrucción <<printf>>.
printf(“Motor encendido”);
F. Manejo de Puertos
Adicionalmente a los pines específicos utilizados para los
módulos anteriormente descritos, se ha utilizado el puerto D para
controlar la escritura en el LCD y los pines PORTB <4-1> para
controlar LEDs indicadores del modo de control. Para la escritura en
el LCD, se ha utilizado el fichero de configuración
“LCD_mecatr.c”, y se realiza escritura en coma fija, obteniendo
primero el valor real, luego escribiendo uno a uno los decimales
deseados. Al hacer esto se reduce significativamente el tiempo de
necesario para la escritura, en comparación con la escritura en coma
flotante. La instrucción utilizada para la escritura en LCD, es la
siguiente.
- printf(lcd_putc,”Datos a mostrar”);
Los LEDs utilizados son 4 e indican: referencia desde
potenciómetro, referencia por teclado, modo de control de posición,
modo de control de velocidad. Se encenderán en función del modo
de control en el que se encuentre el sistema. Para encenderlos,
únicamente basta con modificar el valor enviado a los pines PORTB
<4-1>.
III. SOFTWARE DE CONTROL
En este aparatado se abordarán las funciones utilizadas para
definir la lógica de control implementada en el microcontrolador,
incluyendo el procesamiento de los comandos enviados por el
usuario desde teclado.
A. Rutina de control
La rutina de control se ejecuta cada 20ms, definidos por la
interrupción por desbordamiento del TMR0; es decir que la rutina de
control se ejecuta dentro la rutina de la interrupción del TMR0.
Cabe anotarse que todos los cálculos y operaciones realizadas se
realizan en coma fija con variables tipo <<signed long long>>. De
forma general los pasos a seguir para aplicar el control, se muestran
el diagrama de flujo mostrado en la Figura 1.
En primer lugar se verifica cual es la procedencia de la referencia
para el control, potenciómetro o desde teclado. En el caso de
potenciómetro, se adquieren datos desde el canal AN2, luego se los
acondiciona linealmente para tenerlos entre los rangos de -180/180.
Luego se verifica si el motor está encendido; es decir, que el usuario
puede cambiar la referencia cuando el motor está apagado y cuando
se encienda cumplirá con la nueva referencia. En el caso de motor
encendido, se verifica en qué modo de control está: posición o
velocidad. En cualquiera de estos modos se realiza primero la
adquisición de datos, luego el respectivo acondicionamiento lineal:
AN0/-180/180° para posición; AN1/-120/120rpm para velocidad.
Luego, se rota el vector de errores. Posteriormente se calcula el error
actual restando la referencia menos el valor de realimentación. Para
el caso de control de posición, se aplica un límite al error para que
que identifique el camino más corto para cumplir con la referencia
de posición. El límite consiste en restar 360 si el error es mayor de
180, y sumar 360 si el error es menor que -180. A continuación se
rota el vector de señales de control, y se calcula la señal de control
actual mediante el algoritmo de control PID mostrado.
[ ] ∑ [ ] [ ] ∑ [ ] [ ]
(5)
En el control de posición, n=m=1; mientras que en el control de
velocidad n=m=2. Luego de calcular la nueva señal de control, se la
aplica mediante PWM. Para ello se realiza un acondicionamiento
lineal y posterior conversión de coma fija a coma flotante para que
la relación de trabajo de la señal a generar tenga un rango entre
0/1023 (10bits), que representan 0/100%, 0/5V. Finalmente, se
escribe en el LCD los datos correspondientes a los valores de
referencia y salida.
UNIOVI – EPI GIJON
El tiempo que tarda todo el control en ser procesado es de 13ms,
para el caso de control de posición, y 16ms para control de
velocidad, que es menor al periodo de muestreo, con lo que se evita
pérdida de datos para los cálculos. Si se trabajara en coma flotante
en lugar de coma fija, el tiempo de cálculo sería mayor al actual, es
por ello que es recomendable trabajar en coma fija, tal como se ha
hecho para el caso de este programa.
ON?
REF?
LEER POT.DATO
TECLADO
LEER POS
POS/VEL?
LEER VEL
Rotar vector de errores
Calcular error
Limitar error
Rotar vector de Señales de control
Calcular Señal de control
Rotar vector de errores
Calcular error
Rotar vector de Señales de control
Calcular Señal de control
Señal de control = 0
Generar Señal de control
Escribir en LCD
INICIO
FIN
POS VEL
ON OFF
POTRS232
Fig. 1 Diagrama de flujo de la rutina de control
B. Procesamiento de Comando recibido vía RS232
El procesamiento del comando recibido se realiza cuando el
usuario presiona el pulsador colocado en RB0, por lo tanto el
procesamiento del comando se realiza dentro de la rutina de la
interrupción externa. En el diagrama de flujo de la figura 2, se
muestra el esquema seguido para el procesamiento del comando.
De forma general, la rutina realiza en primer lugar la eliminación
de los espacios existentes en la parte inicial del comando; luego
identifica el tipo de comando en función de las letras
correspondientes a cada modo de control. Luego de reconocer el
modo de control, se actualiza una variable que almacena el estado
del control actual, y se cambian de estado los LEDs conectados en
PORTB<4-1> para mostrar el modo de control actual.
INICIO
Remover espacios
ARRANCAR?
PARAR?
POS?
Aplicar control
Detener motor
SI
NO
SI
NO
POT?
Leer valor ingresado
Guardar modo de control
Cambiar LEDs
Guardar modo de control
Cambiar LEDs
SI
NOPOT RS232
VEL?
POT?
Leer valor ingresado
Guardar modo de control
Cambiar LEDs
Guardar modo de control
Cambiar LEDs
SI
NOPOT RS232
A
DEF?
Leer modo actual
POS?
Valores POS por defecto
Valores VEL por defecto
VELPOS
RZ?
Evaluar RZ
RZ OK?
Leer coeficientes
A
FIN
SI
NO
NO
SI
SI
NO
Fig. 2 Diagrama de flujo de la rutina para procesar comando ingresado
En el caso que el usuario introduzca el comando
“AARRANCAR”, se habilita el control que haya estado en
funcionamiento, o bien el modo de control por defecto que es
control de posición con referencia desde potenciómetro. Si el
comando es “PARAR”, se aplica un PWM con relación de trabajo
de 50% para detener el motor. En el caso que el comando
introducido sea “DEF”, indica al controlador que use los valores por
defecto para su ley de control, por lo que primero se debe identificar
en qué modo de control está, y luego aplica los respectivos
coeficientes por defecto. Si el comando ingresado es “RZ”, indica
UNIOVI – EPI GIJON
que se desea cambiar la ley de control, con lo que el programa
evalúa la sintaxis ingresada para RZ y verifica su validez. En caso
de ser válido el comando, lee los coeficientes ingresados, caso
contrario indica al usuario del error cometido. Finalmente, si el
comando es “POS”, indica que se desea modo de control de
posición, pero falta evaluar si se desea referencia desde
potenciómetro o desde teclado. En el caso de potenciómetro, no es
necesario procesamiento adicional, por lo que únicamente actualiza
la variable que guarda el estado de los modos de control, y luego
cambia el estado de los LEDs del puerto B. Para el caso de
referencia desde teclado, lee el valor de la referencia desde el
comando ingresado, por ejemplo si se escribió POS=90, la
referencia es 90, luego actualiza la variable que guarda el estado del
control actual y cambia el estado de los LEDs del puerto B. Para el
caso ingresar el comando “VEL”, se procede al igual que para el
caso de POS; es decir, se evalúa si se desea referencia desde
potenciómetro o desde teclado, y luego se actualiza la variable que
guarda el estado actual del control y se cambia el estado de los
LEDs del puerto B.
Si el comando no es reconocido dentro de ninguno de los casos,
se indica al usuario que los datos ingresados son incorrectos. La
ejecución de la rutina para procesar el comando ingresado tarda un
tiempo máximo de 8.2ms.
C. Función main
Dentro de la rutina principal del programa se encuentra
únicamente la recepción serial para asignar el comando recibido a
una variable que guarda la cadena de caracteres. Las demás
operaciones se realizan desde las interrupciones de TMR0 y externa.
IV. CONSIDERACIONES ESPECIALES
Al momento de pasar el código diseñado en ANSI C++ al PIC, se
deben tener en cuenta algunas consideraciones especiales que se irán
detallando en este apartado. De igual forma se tratarán asuntos
relacionados con los rangos de adquisición de datos de las señales
proporcionadas por el UMF.
A. Tipo de datos
Para realizar las operaciones en coma fija, se debe sustituir la
variable int32 del C a signed long long, y verificar que todas las
variables que intervengan en alguna operación matemática, tengan
el mismo tipo de dato para evitar pérdida de datos. En este punto
vale la pena mencionar que al usar macros para operaciones en
coma fija que desplacen un registro hacia la derecha, como por
ejemplo el producto en coma fija; el PIC no ejecuta adecuadamente
estas operaciones y altera el resultado. Por ende, hay que realizar
modificaciones pertinentes para obtener los resultados correctos. A
continuación se presenta el macro usado en C y luego el usado en el
PIC.
prod_comaf (X,Y) ((X)*(Y)>>Q) Q: #bits decimales (10)
prod_comaf (X,Y) ((X)*(Y)/R) R: 2Q = (1024)
B. Funciones para procesar datos string
Hay funciones para procesar datos string que al ser
implementadas en el PIC no trabajan de la misma forma que en C,
como por ejemplo la función strncmp que compara n caracteres de
dos cadenas y devuelve un resultado booleano. A continuación se
presenta el código usado en C y luego el usado en el PIC.
strncmp(pt,”PARAR”,5);
strncmp(pt,_cmstart,strlen(_cmstart)); //_cmstart[]=”PARAR”
Se guardan los comandos de referencia para la comparación como
constantes string, y luego para determinar el número de caracteres a
comparar se obtiene la longitud de la cadena de referencia mediante
strlen.
C. Rango de sensores del módulo UMF
Las señales de realimentación de posición y velocidad del módulo
UMF tienen lógica invertida, es decir, tienen una salida de 10V para
su mínimo valor y de -10V para el máximo, por lo que al momento
de calcular el error en la rutina de control se puede restar salida
menos referencia, o configurar correctamente desde un principio la
adquisición de datos con esta lógica.
D. Acondicionamiento de señales
Existe la posibilidad de que los circuitos de acondicionamiento de
señal no proporcionen resultados exactos en su operación, tal como
es el caso de este proyecto y por lo tanto se reducirá el rango de
voltaje a obtener. Por ejemplo para el potenciómetro que varía entre
-180/180u, se deberían tener voltajes entre 0/5V, pero en la realidad
se tienen voltajes de 0/4.1V.
Fig. 3 Curvas teóricas y reales obtenidas en los circuitos de
acondicionamiento
UNIOVI – EPI GIJON
Esta pérdida de voltaje en el límite superior ocasiona que se
modifique la curva de acondicionamiento lineal definida en el PIC,
sin embargo se pueden realizar las respectivas correcciones, tal
como se muestra en la figura 3.
Cabe anotarse que estas correcciones deben hacerse para cada
módulo UMF y determinar el valor adecuado de la corrección, ya
que si bien se supone son modelos iguales de UMF, pero su
desempeño puede variar.
V. CONCLUSIONES
Un microcontrolador PIC de gama media como el usado en este
proyecto, permite realizar operaciones de control gracias a los
módulos con los que cuenta, pues permite implementar desde
adquisición de datos y generación de señales de control, hasta
procesamiento de datos tipo string y la realización de operaciones
matemáticas con lógica discreta, como el algoritmo de control
implementado. Sin embargo, es necesario optimizar el código y
tratar de usar el menor número posible de variables, y a más de ello
se deben verificar las funciones utilizadas ya que es posible que el
compilador utilizado no reconozca la función en cuestión o trabaje
con una versión modificada de la misma.
Adicionalmente, se deben tener en cuenta los tiempos de
ejecución, es decir, se debe verificar que la rutina de control
utilizada no se demore un tiempo mayor al tiempo de muestreo para
no perder datos. Para agilitar las operaciones realizadas, se
recomienda trabajar en coma fija, incluso para la escritura en LCD,
teniendo en cuenta que se debe escoger un número de bits adecuado
para la parte decimal que permita expresar las cantidades con las
que se quiere trabajar.
Es probable que existan problemas de adquisición de datos debido
a pérdidas en la etapa de acondicionamiento, sin embargo estos
errores se pueden corregir por software definiendo los límites de la
adquisición y modificando la ecuación de acondicionamiento lineal
implementada en el PIC.
VI. REFERENCIAS
[1] Presentaciones del curso
[3] Datasheet PIC16F917, Microchip
[2] Ogata K, Sistemas de control en tiempo discreto, Prentice Hall.
VII. BIOGRAFÍA DE AUTOR
Pedro J. Arévalo Molina
Nació en Cuenca-Ecuador en 1986.
Realizó sus estudios universitarios en la
Escuela Politécnica Nacional en Quito-
Ecuador, donde obtuvo el título de
Ingeniero en Electrónica y Control con
reconocimiento SUMMA CUM LAUDE, además de distinguirse
como el mejor graduado. Posteriormente realizó estudios en el área
de instrumentación y control aplicados a la industria petrolera
mediante Schlumberger en Houston, TX-USA, donde obtuvo el
grado de Ingeniero LWD, distinguiéndose como el mejor graduado.
Ha desarrollado varios proyectos basados en instrumentación virtual
y robótica conjuntamente con National Instruments-Ecuador, con el
cual fue coautor de una publicación de diseño y construcción de
prototipos de robots industriales. Adicionalmente ha dictado varios
seminarios de visión artificial e instrumentación virtual en base a
LabVIEW. Actualmente cursa el programa de Master in
Mechatronics and Micro-mechatronics EU4M en Europa.