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
© Copyright 2025 ExpyDoc