proyecto control de motor dc

7
UNIOVI EPI GIJON Control de Posición y Velocidad de un Motor DCPedro 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 05V, 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 05V. 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 T AD =4us, trabajando con el cristal interno del PIC en 8MHz, se debe escoger la opción de T AD =32*T OSC , 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;

Upload: pedro-arevalo

Post on 12-Aug-2015

98 views

Category:

Documents


1 download

DESCRIPTION

Motor control based on low scale microcontrollers

TRANSCRIPT

Page 1: Proyecto Control de Motor DC

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;

Page 2: Proyecto Control de Motor DC

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.

Page 3: Proyecto Control de Motor DC

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)

Page 4: Proyecto Control de Motor DC

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.

Page 5: Proyecto Control de Motor DC

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

Page 6: Proyecto Control de Motor DC

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

Page 7: Proyecto Control de Motor DC

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.