Solución - EtxeSare

SISTEMAS ELECTRÓNICOS DIGITALES
6. MÓDULOS DE CAPTURA DE PULSOS (IC)
Ejercicio 7.1
Tenemos un pequeño motor eléctrico de CC cuya velocidad queremos controlar
en el rango entre 1.000 rpm y 8.000 rpm (medidos en el eje del motor, sin considerar la
reductora acoplada de 1:53). El motor incorpora un encoder incremental de efecto Hall
que da 6 pulsos por revolución. Queremos utilizar un módulo IC (input capture) del
PIC24F para calcular la velocidad de rotación del motor en cada instante, para lo cual se
conectará la salida del encoder al canal IC número 1 del microcontrolador.
Se trata de configurar los registros necesarios del microcontrolador y de
utilizar correctamente los temporizadores y los módulos IC para obtener una lectura fiable de la velocidad del motor en tiempo real. Nos gustaría tener la máxima
resolución posible en la medida de la velocidad, pues vamos a utilizar esta información
como entrada en un algoritmo de control PI del motor.
Medida de la frecuencia:
La velocidad angular de un motor mediante la señal de un encoder se realiza
midiendo la frecuencia de la señal generada por el mismo. Hay dos maneras de medir la
frecuencia de una señal cuadrada con un módulo IC:
1. Contar el número de pulsos de la señal durante un tiempo determinado: Este
método es preciso siempre que la frecuencia relativa de la señal con respecto al
periodo de tiempo establecido para la medida, ya que en este caso se producen
un gran número de pulsos durante dicho tiempo. La principal ventaja de este
método es que el tiempo de medida es constante para cualquier frecuencia, sin
embargo, para frecuencias relativamente pequeñas, la precisión de medida puede
disminuir excesivamente.
2. Medir el tiempo transcurrido entre dos pulsos de la señal (medida del periodo):
Este método es más adecuado para frecuencias relativamente bajas de la señal.
En este caso, para obtener una alta resolución de medida será necesario que la
frecuencia de conteo del temporizador sea relativamente elevada. Sin embargo,
debemos tener en cuenta que para bajas frecuencias de la señal a medir esto puede suponer que sobrepasemos el límite del registro del temporizador (overflow)
y además, el tiempo de medida puede resultar excesivo. Otro aspecto a considerar es que la exactitud de la medida puede verse comprometida por el ruido
y las desviaciones en los pulsos del encoder. Esto puede solucionarse en cierta
forma si tomamos medidas de varios periodos y luego calculamos un valor
medio.
1
SISTEMAS ELECTRÓNICOS DIGITALES
En este ejercicio optaremos por la segunda opción, es decir, la medida directa
del periodo de la señal. Según lo expuesto hasta ahora, debes crear un proyecto de
MPLAB IDE con la programación necesaria para realizar la medida de frecuencia de
una señal cuadrada entre los límites de frecuencia mencionados para obtener una estimación fiable de la velocidad de giro del motor. La verificación de este programa
podrás realizarla sobre la tarjeta Explorer16 en la próxima sesión de laboratorio
(Práctica 6). Sigue los siguientes pasos para el desarrollo del sistema:
1. Infórmate sobre qué es un encoder incremental y sobre cómo y para qué se utiliza. Resume brevemente lo aprendido.
Un encoder incremental es un dispositivo que “informa” de la modificación de
la posición de un eje. Tiene dos generadores de pulsos, ambos en función del movimiento del eje, desplazados entre sí 90º, más un tercero, opcional, que informaría del paso
por el origen de giro. Las tecnologías más habituales son la magnética, con sensores de
efecto Hall, por ejemplo, como el que usaremos en esta práctica, y la óptica, como los
que usaban los antiguos ratones de ordenador (los que iban provistos de una bola, que
se apoyaba en dos ejes perpendiculares, al rodar sobre la superficie de apoyo).
Al analizar los dos trenes de impulsos, podemos observar cuál se adelanta o
retrasa, respecto al otro, pudiendo conocer de esta forma el sentido de giro del eje.
2. Elije la fuente de reloj y la configuración de reloj más conveniente para esta
aplicación (supondremos que trabajamos con la tarjeta de desarrollo Explorer 16). Para
ello debes tener en cuenta los siguientes aspectos:
a.
Se quiere obener la máxima resolución posible en la medida.
b. Debes calcular cuáles serán los límites inferior y superior de la
frecuencia a medir.
c.
Debes tener en cuenta el límite de conteo de los temporizadores, ya que
pueden producirse overflows a frecuencias bajas. Por tanto, o evitas de
alguna forma que se supere el límite del registro contador (16 bits) o
gestionas los overflows de alguna manera.
Para conocer los límites de la frecuencia (b) basta con multiplicar el número de
pulsos por revolución del encoder por las velocidades mínima y máxima; obtenemos
6.000 (mínima) y 48.000 (máxima) pulsos por minuto, que son 100 y 800 Hz.
El límite de conteo se alcanzaría en el peor de los casos, que se daría con la
frecuencia más baja (100 Hz). Como este límite es de 65.536 (advertido en el punto
“c”), el reloj no podrá superar esta cantidad en una centésima de segundo (f=100 Hz),
lo que fija un límite máximo de 6.553.600 Hz; puesto que contamos con un reloj externo, con cristal de 8 MHz, y otro interno de la misma frecuencia, parece que cualquiera de estas dos fuentes puede ser la óptima, divida por 2. Con esta frecuencia de 4
MHz podemos tener una cuenta entre 5.000 y 40.000, que parece ser suficiente para
conocer la velocidad del motor.
2
SISTEMAS ELECTRÓNICOS DIGITALES
3. Selecciona el temporizador que vas a asociar al módulo IC y configúralo conve
nientemente. Argumenta tu elección de configuración y escribe el valor del re
gistro de configuración correspondiente: TxCON.
Elegimos el módulo T1CON, por ejemplo, conectando al pde entrada in IC1 uno
de los trenes de pulsos del encoder.
ICSIDL:
ICTMR:
ICI<1:0>:
ICOV:
ICBNE:
ICM<2:0>:
Puesto que no usaremos modo idle, lo ignoramos (dejamos a 0).
Elegimos el temporizador TM3 (sólo porque responde a un 0).
Activamos el flag en cada evento (00).
(Sólo lectura, irrelevante).
(Sólo lectura, irrelevante).
Sabiendo que el encoder tiene 3 palas, los 6 pulsos que obtendremos por
revolución supongo que han de proceder de los flancos, tanto ascenden
tes como descendentes, de cada pulso (001).
IC1CON = b’0000 0000 0000 0010 = H’0002
Debemos establecer configuraciones adicionales (TMR2, TMR3, TRISD):
TRISDbits.RD8 = 1
( bit 8 del puerto D es el mismo IC1: entrada).
T2CONbits.T32 = 0
TMR2 y TMR3 funcionan como timers de 16 bits.
T3CON = b’1000 0000 0000 0000 = H’8000:
Activo, Fosc(interno)/2.
4. Una vez seleccionadas frecuencia de reloj y configuración del temporizador,
calcula cuál será la máxima y la mínima resolución que obtendrás en la me
dida de la frecuencia de la señal.
Para el reloj que usamos, la mínima resolución se obtendrá con la velocidad
máxima, y la máxima resolución con la velocidad mínima:
5. Decide qué modo de operación del módulo IC es el más conveniente. Argu
menta tu elección y escribe el valor del registro IC1CON. Según esta configura
ción, calcula cuáles serán los tiempos máximo y mínimo para realizar una
medida de la frecuencia.
3
SISTEMAS ELECTRÓNICOS DIGITALES
Según se ha detallado antes, configuramos el módulo IC para que guarde el
valor del temporizador TMR3 en cada evento (flancos ascendentes y descendentes). El
registro IC1CON contendrá: b’0000 0000 0000 0010 = H’0002.
Dado que el valor de las frecuencias entrantes se encuentran entre 100 y 800
Hz, los tiempos máximo y mínimo se corresponden con los períodos de las frecuencias
mínima y máxima, respectivamente:
6. Establece la manera de obtener una temporización de la lectura de la frecuencia de la señal de tal manera que esta lectura se realice exactamente cada 100
ms (este será el periodo de muestreo de nuestro futuro controlador). Piensa si
puedes utilizar el mismo temporizador que has utilizado para la medida de la
frecuencia o si necesitas de otro temporizador. Ten en cuenta que no necesariamente las medidas de frecuencia realizadas mediante el módulo IC y lo que denominamos “lectura de la frecuencia” por el sistema deben ser coincidentes. Por
ejemplo, podríamos estar realizando la medida de la frecuencia ininterrumpidamente a cada periodo de la señal de entrada, mientras que el sistema solo realiza
una “lectura” de esta medida cada 100 ms para calcular la velocidad del motor
en ese instante.
Se podría usar el mismo temporizador, siempre que las medidas fueran alternativas, es decir, no se realicen simultáneamente. Pero, de todas las maneras, parece más
apropiado usar TMR1 (el primero libre) para contar el tiempo, mientras TMR2 actuará
como contador, al seleccionar como Clock Source T2CK, donde conectamos una de las
salidas del encoder (puede ser la misma que se utiliza en IC1 o la otra); puesto que en
este caso sólo se cuentan los flancos de subida, la frecuencia de la entrada se recorta a
la mitad.
Para fijar el tiempo de muestreo, la forma de trabajo es distinta. Se activa la
interrupción de un temporizador, para que se dispare en 100 ms, lo que implica una
cuenta máxima de 65.536 en este período, correspondiente a una frecuencia de 655.360
Hz; se podría usar una frecuencia de 500 kHz para el temporizador. Contando pulsos
del encoder, llegarían entre 2.500 y 20.000 Hz, por lo que llegarían a contarse de 250 a
2.000 pulsos en este tiempo.
7. Finalmente escribe un programa en lenguaje C en el que se describen todas las
configuraciones indicadas más arriba y cualquier otra que sea necesaria para el
correcto funcionamiento del sistema (por ejemplo, la configuración del puerto
correspondiente).
a.
Añade al menos una función principal y una/s ISR o función/es de rutina
de servicio para que se produzca una lectura de frecuencia de la señal del
motor exactamente cada 100 ms, calcule la velocidad angular del eje de
4
SISTEMAS ELECTRÓNICOS DIGITALES
salida del motor (aquí debes tener en cuenta que el motor tiene una reductora de 1:53) y guarde estos dos valores en sendas variables denominadas “frecuencia” y “velocidad”.
b. Para tener cierta visualización externa de cuándo se produce efectivamente cada medida de frecuencia por el módulo IC, y de cuándo se realiza la lectura de frecuencia por el sistema (cada 100 ms) haz que sendos
LEDs de la placa se enciendan cada vez que se produzcan dichos eventos
(si configuras el sistema para que dichos eventos sean coincidentes, basta
con que utilices un solo LED).
NOTA: Sería muy conveniente que antes de escribir el programa realices un diagrama
de flujo del algoritmo que quieres programar.
#include <PIC24FJ128GA010.h>
#include <config.h>
int
float
frecuencia, anterior, actual;
velocidad, v_angular;
// ************************************************** //
void
configura(void) {
// Configura dispositivos
TRISA = 0xFF00;
TRISDbits.TRISD8 = 1;
TRISCbits.TRISC1 = 1;
// LEDs son salidas
// IC1 es entrada
// T2CK es entrada
IC1CON = 0x0002;
// IC1
TMR1 = 0;
PR1 = 50000;
IFS0bits.T1IF = 0;
IEC0bits.T1IE = 1;
T1CON = 0x8010;
//
//
//
//
//
T2CON =
0x8002;
// TMR2 - cuenta pulsos (FA)
T3CON =
0x8000; }
// TMR3 – cta. pulsos (FAyD)
TMR1
consigna (100 ms)
borra flag
activa interrupción
arranca timer
// ************************************************** //
void
main(void) {
configura();
while (IC1CONbits.ICBNE == 0);
anterior = IC1BUF;
while (1) {
while (IC1CONbits.ICBNE == 0);
PORTAbits.RA7 = 1;
actual = IC1BUF;
actual = actual - anterior;
if (actual < 0)
actual += 65536;
frecuencia =
anterior = actual;
PORTAbits.RA7 = 0; }}
5
SISTEMAS ELECTRÓNICOS DIGITALES
// ************************************************** //
void _ISR _T1Interrupt(void) {
int
LED7, lectura;
IEC0bits.T1IE = 0;
// Deshabilita Interrupción
TMR1 = 0;
LED7 = PORTAbits.RA7;
PORTAbits.RA0 = 1;
// LED 0: lectura cada 100 ms
lectura = TMR2;
velocidad = lectura * 100 / 53;
// velocidad en r.p.m.
v_angular = lectura * 3.14159 / 3; // velocidad angular en rad/s
PORTAbits.RA0 = 0;
PORTAbits.RA7 = LED7;
IFS0bits.T1IF = 0;
// Borrado del Flag
IEC0bits.T1IE = 1; }
// Habilita Interrupción
// ************************************************** //
6