Instituto Tecnológico de Costa Rica Escuela de Ingenierı́a Electrónica Unidad Controladora de Procesos Manual de Usuario Ejecutor: Daniel Castro Molina Cartago, 2 de junio de 2008 Índice general 1. Introducción 1 2. Diagrama de pines de la placa base 2 3. Descripción de hardware 6 3.1. Bus de datos SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 3.2. Bus de datos I2C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.3. Bus de datos de 16 bits . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.3.1. Puerto de comunicación UART . . . . . . . . . . . . . . . . . . 14 3.4. Puerto de comunicación Ethernet . . . . . . . . . . . . . . . . . . . . . 16 3.5. Entradas Analógicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.6. Salidas Analógicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.7. Interface de Encodificador de Cuadratura (QEI) . . . . . . . . . . . . . 23 3.8. Salidas de control PWM: . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.9. Funciones de control de dispositivos IO . . . . . . . . . . . . . . . . . . 26 3.10. Módulo de Conversión Analógico Digital: . . . . . . . . . . . . . . . . . 27 3.10.1. Opciones de configuración del módulo: . . . . . . . . . . . . . . 27 3.10.2. Funciones del módulo: . . . . . . . . . . . . . . . . . . . . . . . 29 3.11. Módulo de comunicaciones I2C: . . . . . . . . . . . . . . . . . . . . . . 31 3.11.1. Opciones de configuración del módulo: . . . . . . . . . . . . . . 31 3.11.2. Funciones del módulo: . . . . . . . . . . . . . . . . . . . . . . . 32 i ÍNDICE GENERAL ii 3.12. Módulo de comunicaciones SPI: . . . . . . . . . . . . . . . . . . . . . . 35 3.12.1. Opciones de configuración del módulo: . . . . . . . . . . . . . . 35 3.12.2. Funciones del módulo: . . . . . . . . . . . . . . . . . . . . . . . 36 3.13. Módulo de comunicaciones UART: . . . . . . . . . . . . . . . . . . . . 38 3.13.1. Opciones de configuración del módulo: . . . . . . . . . . . . . . 38 3.13.2. Funciones del módulo: . . . . . . . . . . . . . . . . . . . . . . . 39 3.14. Módulo PWM: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.14.1. Opciones de configuración del módulo: . . . . . . . . . . . . . . 41 3.14.2. Funciones del módulo: . . . . . . . . . . . . . . . . . . . . . . . 43 3.15. Módulo Interfaz de Encodificador de Cuadratura (QEI): . . . . . . . . . 45 3.15.1. Opciones de configuración del módulo: . . . . . . . . . . . . . . 45 3.15.2. Funciones del módulo: . . . . . . . . . . . . . . . . . . . . . . . 46 4. Esquema general del software 48 4.1. Requerimientos mı́nimos de software y hardware . . . . . . . . . . . . . 48 4.2. Abrir el proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.3. Estructura del proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 4.3.1. Descripción de archivos importantes . . . . . . . . . . . . . . . . 49 5. Guia de comandos 51 5.1. Estructura de los comandos . . . . . . . . . . . . . . . . . . . . . . . . 52 5.2. Secuencia de Envı́o y Confirmación . . . . . . . . . . . . . . . . . . . . 52 5.2.1. Secuencia de ejemplo . . . . . . . . . . . . . . . . . . . . . . . . 52 6. Lista de Comandos 55 6.1. Funciones de hardware y sistema . . . . . . . . . . . . . . . . . . . . . 56 6.1.1. Iniciar o detener máquina virtual . . . . . . . . . . . . . . . . . 56 6.1.2. Devuelve registro de estado . . . . . . . . . . . . . . . . . . . . 56 6.1.3. Borra la memoria EEPROM . . . . . . . . . . . . . . . . . . . . 57 ÍNDICE GENERAL iii 6.1.4. Guarda la configuración de sistema en EEPROM . . . . . . . . 58 6.1.5. Recibe el archivo de aplicación . . . . . . . . . . . . . . . . . . . 58 6.1.6. Recibe un archivo de configuración IO . . . . . . . . . . . . . . 58 6.1.7. Reinicia el sistema . . . . . . . . . . . . . . . . . . . . . . . . . 59 6.1.8. Asigna un valor a un elemento de salida (DAC o PWM) . . . . 59 6.1.9. Define un rango de medición a un canal ADC . . . . . . . . . . 59 6.1.10. Define un rango de medición a un canal DAC . . . . . . . . . . 60 6.1.11. Lee un canal ADC . . . . . . . . . . . . . . . . . . . . . . . . . 61 6.2. Funciones de módulos parte I . . . . . . . . . . . . . . . . . . . . . . . 61 6.2.1. Cambiar la configuración de un filtro . . . . . . . . . . . . . . . 61 6.2.2. Configurar un módulo de función de transferencia . . . . . . . . 62 6.2.3. Recibe coeficientes Kp, Ki, Kd, Ts para configurar PID . . . . . 63 6.2.4. Recibe parametros de configuración de oscilador senoidal . . . . 64 6.2.5. Recibe parámetros de configuración de oscilador rectagular . . . 65 6.2.6. Recibe parametros de configuración de oscilador triangular . . . 65 6.2.7. Recibe parametros de configuración de oscilador triangular . . . 66 6.2.8. Recibe parámetros de configuración de K . . . . . . . . . . . . . 66 6.3. Funciones de módulos parte II . . . . . . . . . . . . . . . . . . . . . . . 67 6.3.1. Crear o destruir módulos virtuales . . . . . . . . . . . . . . . . . 67 6.3.2. Ajusta ganancia de un módulo GAIN . . . . . . . . . . . . . . . 67 6.3.3. Ajusta lı́mites de un módulo SAT . . . . . . . . . . . . . . . . . 68 6.3.4. Ajusta lı́mites de un módulo NOISE . . . . . . . . . . . . . . . 68 6.3.5. Funciones de captura e información . . . . . . . . . . . . . . . . 68 6.3.6. Recibir parametros de configuración de la tarea de captura . . . 68 6.3.7. Recibir parámetros de configuración de la tarea de captura . . . 69 6.3.8. Devolver valor de los registros de la tarea de captura . . . . . . 70 6.3.9. Enviar valores de salida de los módulos virtuales . . . . . . . . . 70 ÍNDICE GENERAL iv 6.3.10. Guardar valor en un registro de propósito general . . . . . . . . 71 6.3.11. Enviar información acerca porcentaje de uso de la CPU . . . . . 71 7. Cambiar la configuración de los periféricos 72 8. Creación de módulos 77 8.1. Definiciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 8.2. Estructura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 8.3. Valor tipo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 8.4. Número base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 8.5. Función NEW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 8.6. Función DESTROY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 8.7. Función GETPTR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 8.8. Función de configuración . . . . . . . . . . . . . . . . . . . . . . . . . . 82 8.9. Función SAMPLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 Esquemas 86 Bibliografı́a 97 Índice de figuras 2.1. Diagrama de pines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3.1. Estructura del hardware de la unidad . . . . . . . . . . . . . . . . . . . 7 3.2. Conexión del módulo SPI . . . . . . . . . . . . . . . . . . . . . . . . . 9 3.3. Esquema del módulo SPI en la unidad . . . . . . . . . . . . . . . . . . 10 3.4. Conexión del módulo I2C . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.5. Esquema del módulo I2C en la unidad . . . . . . . . . . . . . . . . . . 12 3.6. Conexión del puerto UART al PC . . . . . . . . . . . . . . . . . . . . . 14 3.7. Esquema del puerto UART . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.8. Conexión del puerto Ethernet . . . . . . . . . . . . . . . . . . . . . . . 16 3.9. Sistema Xport AR de Lantronix . . . . . . . . . . . . . . . . . . . . . . 16 3.10. Esquema del puerto Ethernet . . . . . . . . . . . . . . . . . . . . . . . 17 3.11. Conexión de las entradas analógicas . . . . . . . . . . . . . . . . . . . . 18 3.12. Esquema de las entradas analógicas . . . . . . . . . . . . . . . . . . . . 20 3.13. Conexión de las salidas analógicas . . . . . . . . . . . . . . . . . . . . . 21 3.14. Esquema de las salidas analógicas . . . . . . . . . . . . . . . . . . . . . 22 3.15. Conexión de QEI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.16. Esquema de QEI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.17. Conexión de PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.18. Esquema de PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 v ÍNDICE DE FIGURAS vi 3.19. Estructura C de la capa drivers . . . . . . . . . . . . . . . . . . . . . . 27 3.20. Curvas representativas de los modos de operación offset del PWM . . . 43 5.1. Algoritmo de la tarea de comunicación . . . . . . . . . . . . . . . . . . 53 7.1. Comando recibido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Capı́tulo 1 Introducción La unidad controldadora de procesos fue diseñada para facilitar la creación de estructuras de control y regulación para el laboratorio de control automático del escuela de Ingenierı́a en Electrónica del ITCR. Esta unidad controladora permite utilizar interfaces de entrada y salida como convertidores analógicos, buses de comunicación SPI, I2C, decodificadores de cuadratura y generación PWM, como herramientas de hardware para facilitar la conexión de plantas experimentales. La unidad también dispone de algoritmos y rutinas de filtros digitales, funciones de control, funciones generales de operaciones comunes y matemáticas. Además posee un convertidor serial/ethernet con servidor web permitiéndose crear páginas y aplicaciones tipo JAVA Applets. Se recomienda leer [13], ya que contiene información muy detallada sobre el funcionamiento del microcontrolador. 1 Capı́tulo 2 Diagrama de pines de la placa base AN#+: Entrada analógica positiva. 10V máximo. AN#-: Entrada analógica negativa. -10V mı́nimo. AOUT#: Salida analógica. 10 mA máximo. AGND: Tierra analógica. QEA: Entrada A del encodificador de cuadratura. 5V CMOS. QEB: Entrada B del encodificador de cuadratura. 5V CMOS. INDX: Entrada INDEX del encodificador de cuadratura. 5V CMOS. PWM#H: Salida PWM primaria. Colector abierto, 5V. PWM#L: Salida PWM secundaria. Colector abierto, 5V. DIR#: Salida PWM de dirección. Colector abierto, 5V. FLTA: Entrada A por falla en motor. 5V CMOS. FLTB: Entrada B por falla en motor. 5V CMOS. 2 CAPÍTULO 2. DIAGRAMA DE PINES DE LA PLACA BASE Figura 2.1: Diagrama de pines. 3 CAPÍTULO 2. DIAGRAMA DE PINES DE LA PLACA BASE 4 TEST#: Punto de prueba salida analógica del acondicionador de señal. MCLR: Salida para conexión de botón de reinicio. Tipo NO. ACC: Salida para conexión de botón de acción. Tipo NO. SDO: Salida digital de bus SPI. 5V CMOS. SDI: Entrada digital de bus SPI. 5V CMOS. SCK: Salida digital de reloj SPI. 5V CMOS. SPI#: Salida de selección dispositivo SPI. 5V CMOS. SDA: Entrada - Salida de datos bus I2C. 5V CMOS. SCL: Salida digital de reloj I2C. 5V CMOS. A1: Ánodo de LED indicador de RUN. 5V TTL, 5mA máximo. K1: Cátodo de LED indicador de RUN. A2: Ánodo de LED indicador de ERROR. 5V TTL, 5mA máximo. K2: Cátodo de LED indicador de ERROR. T#: Entrada para temporizador, sincronizador o entrada digital de propósito general. 5V CMOS.d V+: Entrada de alimentación, +12V. V-: Entrada de alimentación, -12V. GND: Tierra digital. TX1: Transmisión puerto serie RS232, directo del XPort. RX1: Recepción puerto serie RS232, directo del XPort. CAPÍTULO 2. DIAGRAMA DE PINES DE LA PLACA BASE CTS1: Clear to send puerto serie RS232, directo del XPort. RTS1: Ready to send puerto serie RS232, directo del XPort. TX2: Transmisión puerto serie RS232, directo del microcontrolador. RX2: Recepción puerto serie RS232, directo del microcontrolador. CTS2: Clear to send puerto serie RS232, directo del microcontrolador. RTS2: Ready to send puerto serie RS232, directo del microcontrolador. 5 Capı́tulo 3 Descripción de hardware Un esquema simple del hardware de toda la unidad se muestra en la figura 3.1; como unidad central se utilizó el dsPIC33FJ256MC710 previamente descrito. El sistema cuenta con: 3 buses de datos: SPI, I2C y uno paralelo de 16 bits (desarrollo parcial): Para expansión de hardware. Puerto de comunicación UART: Para operación y configuración local de la unidad. Puerto de comunicación Ethernet mediante Lantronix XPortAR: Para operación y configuración remota de la unidad. 4 entradas y 2 salidas analógicas: De rangos fijos seleccionables. Control de motores: Mediante QEI y PWM. Puerto RJ11 para programación del dsPIC mediante MPLAB ICD2. Nota: No debe utilizarse las fuentes de la unidad para alimentar cualquier conexión externa. Para estos casos utilizase una fuente externa. 6 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE Figura 3.1: Estructura del hardware de la unidad. 7 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 3.1. 8 Bus de datos SPI El módulo SPI (Interface Serial para Periféricos) es un bus de comunicaciones serial sı́ncrono que se utiliza para comunicaciones entre circuitos integrados a corta distancia, estos circuitos integrados son por lo general memorias, microcontroladores, sensores digitales, etc. Es muy popular porque el protocolo es muy simple y veloz (10Mbps máximo). La unidad cuenta con 3 pines de bus y 8 pines de selección de dispositivos: SCK: Salida del reloj de sincronización. SDO: Salida de datos seriales. SDI: Entrada de datos seriales. SSx: Hasta 8 salidas para selección de dispositivos activos en bajo. La figura 3.2 muestra el diagrama de conexión con otros dispositivos. La figura 3.3 muestra el circuito de interfaz con el microcontrolador, se utilizan buffers no inversores 74HC7014 tipo Schmitt trigger para proteger las entradas del microcontrolador, cada salida soporta hasta 20mA de corriente compatible con los niveles TTL de +5VDC. CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE Figura 3.2: Conexión del módulo SPI. 9 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE Figura 3.3: Esquema del módulo SPI en la unidad. 10 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 3.2. 11 Bus de datos I2C El módulo I2C ( bus de Circuitos Inter–Integrados) es un bus de datos serial de 2 lı́neas que permite la conexión de hasta 127 dispositivos en modo simple y hasta 1023 dispositivos en modo extendido sobre el mismo bus, la velocidad de comunicación puede ser de hasta 400Kbps en versiones antiguas pero se puede lograr 1Mbps en nuevas versiones limitando el número de dispositivos conectados al bus1 . Los pines del módulo son: SCL: Salida del reloj de sincronización. SDA: Pin bidireccional de datos seriales. La figura 3.4 muestra el diagrama de conexión con otros dispositivos. Figura 3.4: Conexión del módulo I2C. Se utilizó el CI P82B96 el cual es un buffer bidireccional especial para I2C. Este buffer permite extender la comunicación hasta 25 metros a 150Kbps y 3 metros a 400kbps. La figura 3.5 muestra el circuito de interfaz recomendado por el fabricante NXP semiconductors. Para la selección de las resistencias de pull–up R10 y R11 se debe considerar la capacitancia total sobre cada lı́nea y la velocidad de comunicación, sin 1 Según la capacitancia de entrada de cada dispositivo CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 12 embargo, este como proyecto es de aplicación general, se seleccionó los valores estándar teóricos para lograr una comunicación de hasta 100kbps según lo detalla Microchip en la hoja de datos del microcontrolador; el valor correcto se puede seleccionar empı́ricamente, se pueden agregar resistencias externas para disminuir el valor equivalente de la resistencia de pull–up y asi aumentar la velocidad del bus. Generalmente el bus I2C se utiliza para comunicaciones Master – Slave, pero también permite comunicaciones Master – Master sin modificación de la capa fı́sica. Figura 3.5: Esquema del módulo I2C en la unidad. CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 3.3. 13 Bus de datos de 16 bits De manera opcional se diseño un bus paralelo de 16 bits similar a la interfaz que presentan los microprocesadores 8086. Este bus puede direccionar hasta 128k direcciones de memoria para datos y periféricos E/S. Este bus no se desarrolló completamente debido a que no se adquirieron los componentes necesarios para su implementación. Posterior a la construcción del circuito impreso, se detectaron errores de diseño, además, se pensó en utilizar estos pines no como bus de datos de 16 bits si no como entradas y salidas de propósito general (tipo PLC) ya que se consideró el bus paralelo como obsoleto debido al auge de dispositivos seriales I2C y SPI. Ninguna de las dos formas esta implementada a nivel de hardware ni software y se deja como recomendación final. CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 3.3.1. 14 Puerto de comunicación UART Se habilitó un puerto UART para comunicación local; se usa un cable directo RS– 232 para conexión con la PC, Figura 3.6: Conexión del puerto UART al PC. CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE Figura 3.7: Esquema del puerto UART. 15 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 3.4. 16 Puerto de comunicación Ethernet Para la conectividad Ethernet se utiliza un sistema XPortAR de Lantronix; este sistema convierte de manera transparente la comunicación serial RS232 a una comunicación Ethernet, además integra un servidor WEB que es compatible con aplicaciones JAVA Applets e integra un conjunto de métodos para estableces sesiones remotas y funciones de send, get, length, etc. Figura 3.8: Conexión del puerto Ethernet. El sistema XPortAR incluye dos puertos RS232, ambos puertos pueden establecer sesiones con el microcontrolador, el puerto 2 del XportAR está directamente conectado al puerto 2 del microcontrolador; el puerto 1 del XportAR está habilitado para conexión directa con la PC pero se puede conectar al puerto 1 del microcontrolador utilizando un cable serial cruzado, o realizando la conexión directamente desde la placa. Figura 3.9: Sistema Xport AR de Lantronix. CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 3.5. 17 Entradas Analógicas La unidad cuenta con 4 entradas analógicas, cada entrada analógica puede medir señales de hasta ±50mV , el rango de medición se puede ajustar por software y se puede calibrar cada entrada con mediante una rutina especial. Cada entrada es diferencial y se puede conectar a cualquier tipo de sensor analógico. La figura 3.11 ejemplifica los modos de conexión. El microcontrolador permite un rango máximo de +3.3V en cada entrada analógica, se tuvo que crear un circuito acondicionador ajustable para permitir los rangos que muestra la tabla 3.2. La primera etapa del circuito de la figura 3.12utiliza un amplificador INA121 como diferenciador y cada entrada esta acondicionada para que se atenúe, amplifique o aplique un nivel CD a la señal, esto se realiza con potenciómetros digitales AD5263 de 256 pasos; los potenciómetros R1 y R2 se utilizan para atenuar la señal, el potenciómetro R3 ajusta la ganancia del amplificador de instrumentación y el potenciómetro R4 sirve para aplicar un nivel CD. La segunda etapa del circuito consiste de un filtro pasobajos antialias tipo Bessel de orden 2, este filtro se hace necesario para atenuar ruido Figura 3.10: Esquema del puerto Ethernet. 18 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE Figura 3.11: Conexión de las entradas analógicas. Tabla 3.1: Rangos de medición de cada entrada analógica. Opción Rango Bipolar Rango Unipolar 1 ±10V 0V – 10V 2 ±5V 0V – 5V 3 ±2V 0V – 2V 4 ±1V 0V – 1V 5 ±500mV 0V – 500mV 6 ±200mV 0V – 200mV 7 ±100mV 0V – 100mV 8 ±50mV 0V – 50mV CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 19 y para eliminar las frecuencias que puedan interferir en el procesamiento digital. La frecuencia máxima de muestreo del sistema es 1 kHz, esto permite representar señales de hasta 500Hz. Los sistemas de control que se encuentran en el laboratorio son en su mayorı́a mecánicos y unos pocos son térmicos, sistemas de este tipo con ancho de banda superior a los 100Hz son poco comunes, se eligió una frecuencia de corte en los filtros de al menos 25 % superior a 100Hz. La estructura Salley–Key es ideal porque es de ganancia unitaria y no inversor, se calcularon las resistencias R6 y R7 de tal modo que se permitiera una relación de C2 = 2C1 y que la frecuencia de corte dependa del valor de C1 sin cambiar el comportamiento de filtro Bessel. El valor de C1 se calcula con la fórmula: 3,0524 × 10−6 C1 = fc Para obtener un valor cercano de 125 Hz como frecuencia de corte C1 debe ser de 24.42 nF, se utilizó un el valor estándar de 22 nF, resultando una frecuencia de corte de 138 Hz. 3.6. Salidas Analógicas Se diseño el sistema con 2 salidas analógicas, cada salida analógica se calibra de la misma manera que las entradas y se pueden seleccionar rangos de operación, los rangos son: Cada salida es de baja potencia y no puede superar los 20mA. Si se desea una salida de mayor potencia se puede utilizar el LM675T el cual puede suministrar cargas de hasta 4A, en caso de su utilización, se debe usar una fuente externa. CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE Figura 3.12: Esquema de las entradas analógicas. 20 21 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE Tabla 3.2: Rangos de medición de cada salida analógica. Opción Rango Bipolar Rango Unipolar 1 ±10V 0V – 10V 2 ±5V 0V – 5V 3 ±2V 0V – 2V 4 ±1V 0V – 1V Figura 3.13: Conexión de las salidas analógicas. CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE Figura 3.14: Esquema de las salidas analógicas. 22 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 3.7. 23 Interface de Encodificador de Cuadratura (QEI) La interfaz QEI es un circuito especial para medición de posición y velocidad de motores. Para ello se debe utilizar un encoder rotatorio incremental el cual se conecta al eje del motor, el encoder tiene 2 salidas (A y B) estas dos lı́nea permiten medir velocidad, si se quiere medir posición se debe utilizar un encoder con 3 salidas (A, B e Index). La unidad incluye 3 entradas (A, B y Index) con lo cual se puede medir posición y velocidad. Figura 3.15: Conexión de QEI. La velocidad máxima de medición está limitada por el tiempo de muestreo de la unidad (1ms), con esta restricción se pueden medir velocidades de hasta 30000 rpm; la resolución de medición de posición depende del encoder siempre y cuando la frecuencia de los pulsos no supere al máximo permitido por el microcontrolador (300ms). 3.8. Salidas de control PWM: La unidad cuenta con 4 módulos PWM, cada módulo se compone de tres señales: PWMxH: Salida de modulación por ancho de pulso H. PWMxL: Salida de modulación por ancho de pulso L. CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 24 Figura 3.16: Esquema de QEI. DIR: Salida de dirección. Las salidas PWMxH y PWMxL son iguales, sin embargo, la señal de PWMxH puede ser complementaria a la señal de PWMxL, además, se puede seleccionar la función de cada salida como PWM, DIR o ON/OFF. Los 4 módulos operaran con un único timer, esto limita el sistema a una frecuencia única para los 4 módulos. Cada salida es de colector abierto, esto permite conectar la salida a niveles superiores que los utilizados por lógica TTL; se recomienda aislar eléctricamente cada salida de manera óptica. Además se cuenta con 2 entradas FLTx, estas entradas se pueden utilizar como paro de emergencia del PWM, ambas señales actúan sobre los cuatro módulos, las condiciones pueden ser exceso de velocidad, sobrecarga del motor, etc; en caso de utilizarse se debe usar un circuito acondicionador externo que determine las condiciones de paro. CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE Figura 3.17: Conexión de PWM. Figura 3.18: Esquema de PWM. 25 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 3.9. 26 Funciones de control de dispositivos IO La estructuración de la capa controladores se muestra en la figura 3.20; el archivo IO CFG.H se utiliza como archivo único de configuración mı́nima y selección de parámetros propios del microcontrolador, los archivos subsecuentes contienen las funciones disponibles para la utilización de cada periférico. Se pueden realizar cambios en el archivo IO CFG.H pero estos solo son válidos en tiempo de compilación del programa, es decir, se debe recompilar todo el proyecto y bajarlo a la unidad utilizando algún programador compatible con dsPIC33F2 . Sin embargo, IO CFG.H solo representa la configuración inicial del sistema, también conocida como configuración mı́nima, esta configuración mı́nima solo es necesaria para que el microcontrolador pueda arrancar e inicializar todos los dispositivos y periféricos, a la vez, esta es una configuración conocida de hardware funcional, 100 % operativo y se puede utilizar como configuración final del sistema. Si el usuario necesita de otra configuración, esta se puede realizar mediante comandos utilizando cualquier puerto RS232, esta nueva configuración se puede guardar en memoria EEPROM y el microcontrolador la cargará despues de que se reinicie la unidad. Para ello cada parámetro de configuración está asociado con un registro de comando llamado IO Config. Si la nueva configuración no resulta correcta, esta se puede omitir dejando presionando el botón ACC durante el arranque, el microcontrolador ignorará la configuración en EEPROM y cargará únicamente la configuración mı́nima; después el usuario debe modificar la configuración o simplemente enviar el comando de guardar para mantener la configuración mı́nima. Las opciones de configuración son propias del microcontrolador dsPIC33FJ256MC710, el manual de referencia [13] de la familia dsPIC33F detalla cada módulo y se recomienda leerlo antes de realizar cualquier modificación. 2 La unidad tiene le conector RJ11 para el programador MPLAB ICD2 de Microchip CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 3.10. Módulo de Conversión Analógico Digital: 3.10.1. Opciones de configuración del módulo: 27 El microcontrolador tiene disponible dos módulos de conversión A/D y 32 canales; ambos módulos están disponibles en la unidad, sin embargo, se limitaron a 4 canales, ambos módulos operan en forma independiente; el archivo de configuración IO CFG.H presenta las siguientes opciones para los módulos A/D, el valor “x” representa el número Figura 3.19: Estructura C de la capa drivers. CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 28 de módulo (1 ó 2): ADCx EN PERIPH 1 IO Config[0.0] ADCx SAMPLING MODE 1 IO Config[0.1] ADCx SAMPLES PCV 1 IO Config[0.7-2] ADCx SAMPLING RATE 500 IO Config[1]:IO Config[2] ADCx V REF POS CH AVDD IO Config[3.3-0] ADCx V REF NEG CH AVSS IO Config[3.7-4] ADCx RES BITS 1 IO Config[4.3-0] ADCx DATA OUT SIGN INT IO Config[4.7-4] ADCx EN PERIPH: Habilita (1) o deshabilita (0) el módulo. ADCx SAMPLING RATE: Se especifica la velocidad de conversión de una muestra, el valor máximo es 500 cuando se usan 12bits, y 1100 es el valor máximo cuando se usa 10bits de resolución. ADCx SAMPLING MODE: Permite cambiar el modo de conversión cuando se desea tomar muestras en más de un canal, con el valor de 0 se toman muestras de los canales en secuencia, es decir, un canal a la vez, con el valor de 1 se configura el módulo para que tome las muestras de manera simultánea en los canales seleccionados. ADCx SAMPLES PCV: Especifica el número de muestras por conversión, el resultado final es el promedio total de las muestras por canal, esta caracterı́stica aumenta el tiempo de conversión. ADCx V REF POS CH : Selección la fuente de referencia AVDD es la alimentación del módulo ADC del microcontrolador, VREF P selecciona la fuente de referencia externa. ADCx V REF NEG CH : Selección la fuente de referencia AVSS es la alimentación del módulo ADC del microcontrolador, VREF N selecciona la fuente de referencia externa. ADCx RES BITS: Especifica el valor de resolución de cada muestra, las opciones son 12 ó 10 bits. CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 29 ADCx DATA OUT: Selecciona el formato del resultado de la conversión, las opciones son: SIGN INT, para formato entero con signo; UNSIGN INT, formato entero sin signo; SIGN FRAC, formato fraccional (1.15) con signo y UNSIGN FRAC, formato fraccional sin signo. No se recomienda cambiar este valor (por defecto es SIGN INT), ya que la unidad utiliza este formato para la aritmética del sistema. 3.10.2. Funciones del módulo: El módulo de conversión A/D tiene varias funciones con las que se pueden tomar muestras y realizar conversiones, las siguientes funciones se ubican en el archivo IO ADC.C: Función IO ADCxconfig Formato: void IO ADC1config( void ) Valor de Entrada: vacı́o Valor de Retorno: vacı́o Operación: Esta función configura el módulo A/D de acuerdo a las opciones establecidas en el archivo IO CFG.H; esta función se invoca cuando se inicializa la unidad. Ejemplo: IO ADC1config(); Función IO ADCxreadS Formato: void IO ADCxreadS( INT8U in0 sel, INT8U in0 mod, INT16S Valor de Entrada: in0 sel: Número de entrada analógica del dsPIC a leer. in0 mod: 0: común, 1: diferencial. ptr rst: Puntero al registro para resultado. Valor de Retorno: vacı́o Operación: Esta función realiza una muestra simple sobre el canal 0 del microcontrolador. En el caso de modo diferencial utilizará la entrada AN1 del microcontrolador como entrada negativa; en modo común el valor VREF(-). ptr rst ) 30 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE Ejemplo: IO ADC1readS( 4, 0, &ResultadoADC ); Función IO ADCxreadM Formato: IO ADCxreadM( INT8U in0 sel, INT8U in0 mod, INT8U in123 sel, INT8U in123 mod, INT8U n ch, INT16S Valor de Entrada: ptr rst ) in0 sel: Número de entrada analógica del dsPIC a leer. in0 mod: 0: común, 1: diferencial. in123 sel: Seleccion de entradas analogicas. in123 mod: 0: común, 1: diferencial. n ch: Numero de canales: 1, 2 o 4. ptr rst: Puntero al registro o arreglo para resultado. Valor de Retorno: vacı́o Operación: Esta función realiza un muestreo múltiple sobre los canales 0, 0,1 ó 0,1,2,3. Esta función es ejecutable si la resolución configurada es de 10bits. El microcontrolador permite cualquier entrada analógica sobre el canal 0, pero no asi sobre los canales 1,2 y 3, para mayores detalles refierase al archivo IO ADC.C Ejemplo: IO ADC1readM( 4, 0, 0, 0, 4, ResultadoADC ); Función IO ADCreadDS Formato: IO ADCreadDS( INT8U CH0AD1, INT8U CH0AD2, INT16S Valor de Entrada: CH0AD1: Número de entrada analogica para CH0 de AD1. ptr rst ) CH0AD2: Número de entrada analogica para CH0 de AD2. ptr rst: Puntero al arreglo para resultado. Valor de Retorno: vacı́o Operación: Esta función realiza un muestreo doble simple utilizando ambos módulos. Se convierte en una función muy útil cuando para obte- CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 31 ner conversiones con resolución de 12bits. Antes de usar la rutina se debe llamar a la función IO ADCinitDS( ) al menos una vez. Ejemplo: IO ADCinitDS( ); ... IO ADCreadDS( 0, 1, ResultadoADC ); 3.11. Módulo de comunicaciones I2C: 3.11.1. Opciones de configuración del módulo: El microcontrolador cuenta con dos módulos I2C, el módulo I2C1 se utiliza para control de periféricos internos propios de la unidad, por lo tanto no se recomienda modificar la configuración; el módulo I2C2 se utiliza como bus externo para conexión de nuevos periféricos y cualquier configuración es permitida. El I2C2 se puede utilizar de la forma tradicional mediante comandos de lectura/escritura usando las funciones de bloques disponibles. I2CX EN PERIPH 1 IO Config[0.0] I2CX IPMIEN 0 IO Config[0.1], 0: Dis, 1: Ena I2CX A10M 0 IO Config[0.2], 0: Dis, 1: Ena I2CX DISSLW 0 IO Config[0.3], 0: Dis, 1: En I2CX SMEN 0 IO Config[0.4], 0: Dis, 1: Ena I2CX GCEN 1 IO Config[0.5], 0: Dis, 1: Ena I2CX FCLK 1000 IO Config[0.7-6], en kHz I2CX EN PERIPH: Habilita (1) o deshabilita (0) el módulo. I2CX IPMIEN: Habilita(1) ó deshabilita (0) el modo IPMI. 32 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE I2CX A10M: Especifica si las direcciones fı́sicas son de 10 bits. I2CX DISSLW: Mejora la velocidad de comunicación cuando el Clock Rate es mayor a 400kHz. III2CX SMEN: Habilita(1) ó deshabilita (0) el modo IPMI. II2CX GCEN: Habilita (1) o deshabilita (0) la compatibilidad con el SMBus. II2CX FCLK: Especifica la velocidad del reloj de sincronización del bus, 1000kHz máximo. 3.11.2. Funciones del módulo: Las siguientes funciones se ubican en el archivo IO I2C.C. Función IO I2Cconfig Operación: Esta función configura los módulos I2C de acuerdo a las opciones establecidas en el archivo IO CFG.H; esta función se invoca cuando se inicializa la unidad. Formato: void IO I2Cconfig( void ) Valor de Entrada: vacı́o Valor de Retorno: vacı́o Ejemplo: IO I2Cconfig(); Función IO I2CXread Operación: Realiza una lectura secuencial de N cantidad de datos sobre algún dispostivo I2C. Formato: IO I2CXread(INT8U add, INT8U Valor de Entrada: add: Dirección fı́sica del dispositivo a leer. rdptr, INT8U length) rdptr: Puntero al arreglo de datos destino. length: Cantidad de datos a leer. 33 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE Valor de Retorno: vacı́o Ejemplo: IO I2C2read( 0xA0, datos, sizeof(datos) ); Función IO I2CXwrite Operación: Realiza una escritura secuencial de N cantidad de datos sobre algún dispositivo I2C. Formato: IO I2CXwrite(INT8U add, INT8U Valor de Entrada: add: Dirección fı́sica del dispositivo a escribir. wrptr, INT8U length) wrptr: Puntero al arreglo de datos. length: Cantidad de datos a escribir. Valor de Retorno: vacı́o Ejemplo: IO I2C2write( 0xA0, datos, sizeof(datos) ); Función IO I2CXpageHDread Operación: Realiza una lectura secuencial de N cantidad de datos sobre una dirección de lógica (inicio de página) de 16bits de algún dispositivo I2C. Formato: IO I2CXpageHDread(INT8U add, INT16U dir, INT8U rdptr, INT8U length) Valor de Entrada: add: Dirección fı́sica del dispositivo I2C a leer. dir: Dirección lógica del dispositivo I2C. rdptr: Puntero al arreglo de datos. length: Cantidad de datos a escribir. Valor de Retorno: vacı́o Ejemplo: IO I2C2pageHDread( 0xA0, 0x0100, datos, sizeof(datos) ); 34 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE Función IO I2CXpageLDread Operación: Realiza una lectura secuencial de N cantidad de datos sobre una dirección de lógica (inicio de página) de 8bits de algún dispositivo I2C. Formato: IO I2CXpageLDread(INT8U add, INT16U dir, INT8U rdptr, INT8U length) Valor de Entrada: add: Dirección fı́sica del dispositivo I2C a leer. dir: Dirección lógica del dispositivo I2C. rdptr: Puntero al arreglo de datos. length: Cantidad de datos a escribir. Valor de Retorno: vacı́o Ejemplo: IO I2C2pageLDread( 0xA0, 0x10, datos, sizeof(datos) ); Función IO I2CXpageHDwrite Operación: Realiza una escritura secuencial de N cantidad de datos sobre una dirección de lógica (inicio de página) de 16bits de algún dispositivo I2C. Formato: IO I2CXpageHDwrite(INT8U add, INT16U dir, INT8U wrptr, INT8U length) Valor de Entrada: add: Dirección fı́sica del dispositivo I2C a escribir. dir: Dirección lógica del dispositivo I2C. wrptr: Puntero al arreglo de datos. length: Cantidad de datos a escribir. Valor de Retorno: vacı́o Ejemplo: IO I2C2pageHDwrite( 0xA0, 0x0100, datos, sizeof(datos) ); Función IO I2CXpageLDwrite 35 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE Operación: Realiza una escritura secuencial de N cantidad de datos sobre una dirección de lógica (inicio de página) de 8bits de algún dispositivo I2C. Formato: IO I2CXpageLDwrite(INT8U add, INT16U dir, INT8U wrptr, INT8U length) Valor de Entrada: add: Dirección fı́sica del dispositivo I2C a escribir. dir: Dirección lógica del dispositivo I2C. wrptr: Puntero al arreglo de datos. length: Cantidad de datos a escribir. Valor de Retorno: vacı́o Ejemplo: IO I2C2pageLDwrite( 0xA0, 0x10, datos, sizeof(datos) ); 3.12. Módulo de comunicaciones SPI: Existen dos módulos SPI, al igual que el I2C, el módulo SPI1 se reserva para periféricos internos a la unidad y el SPI2 está disponible para operaciones de bus mediante funciones simples de lectura/escritura. 3.12.1. Opciones de configuración del módulo: SPIX EN PERIPH 1 IO Config[0.0] SPIX MODE MASTER IO Config[0.1] SPIX SMP 0 IO Config[0.2], 0: en la mitad, 1: al final SPIX CKE 1 IO Config[0.3], 0: cambio de idle a active, 1: cambio de active a idle CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE SPIX CKP 0 36 IO Config[0.4], 0: idle bajo y active alto, 1: idle alto y active bajo, SPIX SPRE 4 IO Config[0.7-5] SPIX PPRE 2 IO Config[1] SPIX EN PERIPH: Habilita (1) o deshabilita (0) el módulo. SPIX MODE: Selecciona la operación del módulo como MAESTRO ó ESCLAVO SPIX SMP: Indica en que parte de la seña de reloj se capturan los datos. SPIX CKE: Especifica en que flanco de la señal de reloj se cambia el dato de salida. SPIX CKP: Configura la polaridad de la señal de reloj. SPIX SPRE: Configura el valor del preescaler primario. SPIX PPRE: Configura el valor del preescaler secundario. 3.12.2. Funciones del módulo: Las siguientes funciones son las rutinas disponibles de lectura/escritura SPI. El protocolo de comunicación SPI tiene la caracterı́stica de que una operación de escritura es a la vez una operación de lectura, y viceversa, esto reduce el número de funciones y es por esta razón que no se detallan funciones de lectura/escritura por separado. Para mayor información sobre el protocolo de comunicación SPI se puede consultar el manual de referencia [13]. Función IO SPIconfig Operación: Esta función configura los módulos SPI de acuerdo a las opciones establecidas en el archivo IO CFG.H; esta función se invoca cuando se inicializa la unidad. Formato: void IO SPIconfig( void ) Valor de Entrada: vacı́o 37 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE Valor de Retorno: vacı́o Ejemplo: IO SPIconfig(); Función IO SPIXcommB Operación: Esta función realiza una operación de lectura/escritura de 8bits sobre el bus I2C. Una operación de escritura sobreescribe los datos del buffer con datos leı́dos del bus SPI; para una operación de lectura es necesario llenar el buffer con datos nulos o vacı́os. Formato: void IO SPIXcommB( INT8U puerto, INT8U INT8U Valor de Entrada: ptr datain, ptr dataout ) puerto: Número de puerto (0 – 7). ptr datain: Puntero a registro fuente. ptr dataout: Puntero a registro destino. Valor de Retorno: vacı́o Ejemplo: datain = 0x00; //Registro de recepción. dataout = 0xA5; //Valor a escribir en el bus. IO SPIXcommB( 5, &datain, &dataout ); Función IO SPIXcommW Operación: Esta función realiza una operación de lectura/escritura de 16bits sobre el bus I2C. Una operación de escritura sobreescribe los datos del buffer con datos leı́dos del bus SPI; para una operación de lectura es necesario llenar el buffer con datos nulos o vacı́os. Formato: void IO SPIXcommW( INT8U puerto, INT16U INT16U Valor de Entrada: ptr dataout ) puerto: Número de puerto (0 – 7). ptr datain, CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 38 ptr datain: Puntero a registro fuente. ptr dataout: Puntero a registro destino. Valor de Retorno: vacı́o Ejemplo: datain = 0x0000; //Registro de recepción. dataout = 0x5AA5; //Valor a escribir en el bus. IO SPIXcommW( 5, &datain, &dataout ); 3.13. Módulo de comunicaciones UART: El microcontrolador cuenta con dos módulos de comunicaciones UART, se utiliza el módulo UART1 para operaciones de configuración local o conexión directa con la PC; el módulo UART2 se utiliza para conexión directa con el Lantronix XportAR. 3.13.1. Opciones de configuración del módulo: UARTX EN PERIPH 1 IO Config[0.0] UARTX PAR 0 IO Config[0.2-1], 0: No, 1: impar, 2:par. UARTX STOP 1 IO Config[0.3], 1: un bit, 2: dos bits. UARTX HFC 0 IO Config[0.4] UARTX MODE RTS 0 IO Config[0.5], 0: Flow control, 1: Simplex. UARTX BR 57600 IO Config[0.7-6] : IO Config[1]: IO Config[2] UARTX BUFF SIZE 128 Tama~ no del buffer de datos para UARTX. UARTX EN PERIPH: Habilita (1) o deshabilita (0) el módulo. UARTX BR: Configura la velocidad de comunicación en BPS. UARTX PAR: Habilita la paridad y el número de bits. UARTX STOP: Configura los bits de parada. CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 39 UARTX HFC: Se habilita el control de flujo por hardware. UARTX MODE RTS: Modo para el pin RTS. UARTX BUFF SIZE: Tamaño del buffer de datos de salida y entrada, la asignación de este espacio solo es posible en tiempo de programación, ya que se reserva espacio en memoria DMA y no en memoria convencional. 3.13.2. Funciones del módulo: Las siguientes funciones son las rutinas disponibles de lectura/escritura UART. Función IO UARTconfig Operación: Esta función configura los módulos UART de acuerdo a las opciones establecidas en el archivo IO CFG.H; esta función se invoca cuando se inicializa la unidad. Formato: void IO UARTconfig( void ) Valor de Entrada: vacı́o Valor de Retorno: vacı́o Ejemplo: IO UARTconfig(); Función IO UARTXwriteC Operación: Esta función envı́a un byte por UART Formato: void IO UART1writeC( INT8U dato ) Valor de Entrada: dato: Valor (byte) a enviar por UART. Valor de Retorno: vacı́o Ejemplo: IO UART1writeC( ’A’ ); Función IO UARTXreadC Operación: Esta función lee un byte del buffer de datos UART Formato: INT8U IO UART1readC( void ) CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE Valor de Entrada: vacio Valor de Retorno: El dato leido Ejemplo: dato = IO UART1readC; Función IO UARTXwriteS Operación: Esta función envı́a una trama de bytes de datos UART. Se utiliza el DMA para optimizar el uso de CPU. Formato: void IO UARTXwriteS( INT8U Valor de Entrada: ptr datos: Puntero al arreglo de datos. ptr datos, INT16U count ) count: Tamaño de la trama a enviar. Valor de Retorno: vacı́o Ejemplo: IO UART2writeS( datos, sizeof(datos) ); Función IO UARTXreadS Operación: Esta función lee una trama de bytes de datos UART. Se utiliza el DMA como buffer de datos, si el buffer se llena, por defecto, se sobreescriben los primeros datos (buffer circular). Formato: void IO UARTXreadS( INT8U Valor de Entrada: ptr datos: Puntero al arreglo de datos. ptr datos, INT16U count ) count: Tamaño de la trama a leer. Valor de Retorno: vacı́o Ejemplo: IO UART2readS( datos, 10 ); Función IO UARTXlength Operación: Devuelve la cantidad de datos en buffer de recepción. Formato: INT16U IO UARTXlength( void ) Valor de Entrada: vacı́o. Valor de Retorno: La cantidad de datos en buffer. Ejemplo: tama~ no = IO UART2length( ); 40 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 3.14. Módulo PWM: 3.14.1. Opciones de configuración del módulo: PWM EN PERIPH 1 IO Config[0.0] PWM FREC 10000 IO Config[1]:IO Config[2] PWM INTPOST 0 IO Config[0.7-4] PWM PTMOD 0 IO Config[0.2-1]: 41 0: Salida libre 1: Evento simple 2: Continuo, con cuenta de subida y bajada 3: Continuo, con cuenta de subida y bajada con interrupciones PWM PMOD 1 IO Config[0.3], 0: Complementario, 1: independientes ON/OFF: 0, DIR: 1, PWM: 2 PWMX PINH 2 Modo pin H: PWM o DIR o OFF PWMX PINL 1 Modo pin L: PWM o DIR o OFF PWMX PIND 0 Modo pin D: DIR o OFF PWMX OFF DIR 1 Offset, 0: no direccional, 1: direccional PWMX ONOFF D 0 IO Config[3.6] PWMX OFFSET 50 IO Config[4] PWM EN PERIPH: Habilita (1) o deshabilita (0) el módulo. PWM FREC: Configura la frecuencia del módulo PWM. PWM INTPOST: Genera una interrupción cada N ciclos PWM. PWM PTMOD: Modo de la base de tiempos PWM. PWM PMOD: Modo de la operación de los pines L/H. CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 42 PWMX PINH: Modo de operación del pin H: PWM, dirección, on/off. PWMX PINL: Modo de operación del pin L: PWM, dirección, on/off. PWMX PIND: Modo de operación del pin D: Dirección, on/off; en caso de utilizar L/H como dirección el pin D será complementario a L/H. PWMX ONOFF D: Estado OFF de la salida ON/OFF, solo activo si se selecciona. PWMX OFF DIR: Modo de operación del offset: no direccional, direccional PWMX OFFSET: Valor en % de ciclo de trabajo para usarlo como offset Operación del ciclo de trabajo OFFSET Se puede configurar un valor OFFSET a cualquier salida PWM; toda la aritmética de la unidad opera con valores normalizados, es decir, el valor 1.0 significa valor máximo en cualquier módulo, 0.0 significa valor cero o nulo y -1.0 valor mı́nimo o negativo del máximo, un valor de 1.0 en el PWM significa el 100 % de ciclo de trabajo en el PWM, ası́ mismo, el valor -1.0 serı́a 100 % de ciclo de trabajo pero con el bit de dirección invertido, en estos casos, el valor offset es 0, sin embargo si el usuario ajusta un valor offset el PWM puede funcionar de dos maneras: No direccional: Un offset no direccional en la salida PWM significa que el valor 0.0 será el valor offset configurado, si el usuario ajusta un offset de 50 % (50) la salida sera un PWM con 50 % de ciclo de trabajo cuando se ingrese 0.0, por lo tanto un valor de -1.0 ajustará 0 % de ciclo de trabajo. El offset unidireccional no varı́a los bits de dirección, es decir, el sistema ajusta automáticamente la pendiente con el offset y el valor máximo positivo, cualquier valor negativo que resulte inferior al valor mı́nimo de 0 % de ciclo de trabajo será saturado a 0 %. Esta funcionalidad es útil cuando se utiliza Servo Motores controlados por PWM en donde el valor central se ajusta con un PWM con 50 % de ciclo de trabajo. Direccional: Un offset bidireccional en la salida PWM significa que el valor 0.0 será el valor offset configurado, pero a diferencia del offset unidireccional, el offset bidireccional utiliza los bits de dirección, la pendiente se ajusta con el valor offset y el valor máximo, 43 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE pero de igual manera, este patrón se repite para valores PWM negativos; un valor de +0.0 ajustará el ciclo de trabajo del PWM al offset configurado, un valor de 1.0 ajustará al 100 % en ciclo de trabajo. Un valor de -0.0 ajustará el ciclo de trabajo del PWM al offset configurado, pero invertirá el bit de dirección, de igual manera con el valor -1.0 resultará un ciclo de trabajo de 100 % pero con el bit de dirección igualmente invertido. Esta función es útil para eliminar no linealidades de motores CD que por naturaleza del torque de arranque estos no giran para valores pequeños de tensión. La figura 3.20 muestra las curvas representativas para los modos offset del PWM. No Direccional Direccional Figura 3.20: Curvas representativas de los modos de operación offset del PWM. 3.14.2. Funciones del módulo: Función IO PWMGconfig Operación: Esta función configura el módulo PWM de acuerdo a las opciones establecidas en el archivo IO CFG.H; esta función se invoca cuando se inicializa la unidad. Formato: void IO PWMGconfig( void ) CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE Valor de Entrada: vacı́o Valor de Retorno: vacı́o Ejemplo: IO PWMGconfig(); Función IO PWMfrec Operación: Esta función ajusta el valor de frecuencia de la señal PWM, el valor de frecuencia es el mismo para las cuatro salidas PWM. Formato: void IO PWMfrec( INT16U pwm frec ) Valor de Entrada: pwm frec: Valor de frecuencia en Hz. Valor de Retorno: vacı́o Ejemplo: IO PWMXduty( 1000 ); Función IO PWMXduty Operación: Ajusta el valor del ciclo de trabajo de la señal PWM, el formato debe ser punto fijo 2.14 o el seleccionado previamente. Formato: void IO PWMXduty( INT16S pwm duty ) Valor de Entrada: pwm duty: Valor del ciclo de trabajo. Valor de Retorno: vacı́o Ejemplo: IO PWMfrec( 0x3FFF ); Función IO PWMstart Operación: Inicia el PWM en los 4 módulos Formato: void IO PWMstart( void ) Valor de Entrada: vacio Valor de Retorno: vacı́o Ejemplo: IO PWMstart( ); 44 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE 45 Función IO PWMstop Operación: Detiene el PWM en los 4 módulos Formato: void IO PWMstop( void ) Valor de Entrada: vacio Valor de Retorno: vacı́o Ejemplo: IO PWMstop( ); 3.15. Módulo Interfaz de Encodificador de Cuadratura (QEI): El microcontrolador cuenta con un módulo de interfaz para encodificadores de cuadratura, este permite medir velocidad y posición de manera digital. Estas operaciones se realizan con software. 3.15.1. Opciones de configuración del módulo: QEI EN PERIPH 1 IO Config[0.0] QEI QEIM2 1 IO Config[0.1] 0: 2x, 1: 4x QEI SWPAB 0 IO Config[0.3] 0: No, 1: Invertir QEI QEIM1 1 IO Config[0.4], 0: con Index, 1: valor máximo QEI POSRES 1 IO Config[0.7], 0: Apagado, 1: Activo QEI MAXCNT1 6 IO Config[1]:IO Config[2] QEI EN PCDOUT 0 IO Config[0.5] 0: Apagado, 1: Encendido QEI EN QECK 1 IO Config[0.6]: Habilitar Filtro digital QEI QECK 8 IO Config[3]: Divisor de reloj del filtro digital, 0 - 7, 8: auto QEI NUMT 2 IO Config[4] max 255 QEI MAXR 1000 IO Config[5]:IO Config[6] CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE QEI EN PERIPH: Habilita el módulo QEI. QEI QEIM2: Modo de operación. QEI SWPAB: Invertir canales A y B. QEI QEIM1: Reset de contador. QEI POSRES: Reset de contador con Index. QEI MAXCNT1: Pulsos por revolución, PPR. QEI EN PCDOUT: Habilita salida del pin de dirección, (no utilizable) QEI EN QECK: Habilitar Filtro digital. QEI QECK: Divisor de reloj del filtro digital. QEI NUMT: Numero de vueltas para un ciclo (Relación de caja reductora). QEI MAXR: Se habilita el control de flujo por hardware. 3.15.2. Funciones del módulo: Función IO QEIconfig Operación: Esta función configura el módulo QEI de acuerdo a las opciones establecidas en el archivo IO CFG.H; esta función se invoca cuando se inicializa la unidad. Formato: void IO QEIconfig( void ) Valor de Entrada: vacı́o Valor de Retorno: vacı́o Ejemplo: IO QEIconfig(); 46 CAPÍTULO 3. DESCRIPCIÓN DE HARDWARE Función IO QEIposition Operación: Obtiene el valor de posición del motor. Formato: void IO QEIposition( void ) Valor de Entrada: vacı́o Valor de Retorno: Posicion del motor Ejemplo: PosAct = IO QEIposition(); Función IO QEIstart Operación: Inicia el timer asociado para la medición de velocidad. Formato: void IO QEIstart( void ) Valor de Entrada: vacı́o Valor de Retorno: vacio Ejemplo: IO QEIstart(); Función IO QEIstop Operación: Detiene el timer asociado para la medición de velocidad. Formato: void IO QEIstop( void ) Valor de Entrada: vacı́o Valor de Retorno: vacio Ejemplo: IO QEIstop(); Función IO QEIspeed Operación: Obtiene el valor actual de la velocidad del motor. Formato: void IO QEIstop( void ) Valor de Entrada: vacı́o Valor de Retorno: vacio Ejemplo: SpdAct = IO QEIspeed(); 47 Capı́tulo 4 Esquema general del software El firmware de la unidad controladora está programada en el lenguaje C30 de Microchip el cual es compatible con el estándar ANSI C. Cualquier ayuda sobre le lenguaje C30 y el estandar ANSI C los puede encontrar en [15] y en [8]. Ası́ mismo, la unidad utiliza el sistema operativo en tiempo real MicroC/OS-II de Micrium que permite al microcontrolador efectuar diferentes tareas con mayor facilidad y eficiencia. Sobre la teorı́a de sistemas operativos en tiempo real y sobre MicroC/OS-II lo puede encontrar en [11]. 4.1. Requerimientos mı́nimos de software y hardware Para poder abrir el proyecto, solamente necesita de MPLAB IDE v8.0 o superior y del plug–in C30 Compiler v3.1 o superior, puede utilizar la versión estudiante. Este plug–in incluye todas las bibliotecas necesarias. Además, necesita un programador compatible con dsPIC, para ello puede utilizar el programador MPLAB ICD2; la placa de la unidad controlador incluye un conector RJ11 compatible con el programador. Por último, es necesaria una fuente de ±12V para alimentar la unidad. 48 CAPÍTULO 4. ESQUEMA GENERAL DEL SOFTWARE 4.2. 49 Abrir el proyecto Se incluye un disco con todo el código fuente del proyecto. El proyecto es toda la carpeta llamada: Micrium. Copie la carpeta Micrium a la unidad C del computador. Ahora, abra MPLAB IDE; luego, ingrese a Project ->Open... y busque la carpeta Micrium que copió previamente. Busque el archivo OS-Probe.mcp dentro de la ruta: C:\Micrium\Software\Evalboards\Microchip\Explorer16\PIC33FJ256\MPLAB-C30\OS-Probe Seguidamente se abrirá el proyecto. 4.3. Estructura del proyecto Los archivos .C contienen el código y funciones ejectuables en el proyecto. Los archivos inciados con OS pertenecen al sistema operativo en tiempo real; observe que el RTOS no es una apliación instalable, esta consiste de un conjunto de archivos que el usuario puede modificar; se recomienda no alterar ningún parámetro. Los archivos iniciados con IO se refieren a funciones del hardware, estas funciones llaman controladores. Los archivos iniciados con APP se refieren a los archivos de la aplicación y máquina virtual. Los archivos .H son los encabezados o headers. Estos archivos guardan todos los parámetros relacionados con la configuración de hardware y del RTOS. 4.3.1. Descripción de archivos importantes APP.C: Este es el archivo principal, contiene: La función main. Declaración de variables globales. Estructura de las tareas. CAPÍTULO 4. ESQUEMA GENERAL DEL SOFTWARE Declaración de los elementos del sistema operativo. TRAPS.C: Rutinas de interrupción para detección de errores. COMMAND.C: Lista y funciones de instrucciones y comandos de usuario. IO CFG.H: Archivo con la configuración mı́nima de hardware. SYS DEF.H: Definiciones de los módulos virtuales. SYS BLOCKS.H: Estructuras de los módulos virtuales. SYS CFG.H: Parámetros y definiciones especiales de la unidad. APP FUNC.H: Encabezado de definiciones con todas las funciones globales. Cada archivo mantiene información importante que sirve de ayuda al usuario. 50 Capı́tulo 5 Guia de comandos Los comandos permiten utilizar y configurar las todas las opciones de hardware y funciones de máquina virtual. El archivo COMMAND.C contiene todo el código para la ejecución de comandos. Esta primera versión de la unidad no cuenta aún con algún software de administración y configuración, para realizar tales acciones el usuario puede utilizar cualquier programa de envı́o y recepción de tramas hexadecimales por puerto serie RS232 ó puede automatizar los procedimientos con cualquier lenguaje de programación. Durante este proyecto se utilizó el programa LookRS232 de fCoderGroup1 como depuración y el lenguaje de programación JAVA con el IDE NetBeans2 para la creación de aplicaciones web. La unidad esta pendiente de las acciones del usuario mediante las tareas de comunicaciones, si alguna tarea detecta un comando con la secuencia correcta se procederá a ejecutar la función Command COM, la cual evaluará el comando. Cada tarea de comunicación es independiente y el RTOS no permite que se comparta información entre las tareas. 1 2 www.lookrs232.com/ www.netbeans.org 51 CAPÍTULO 5. GUIA DE COMANDOS 5.1. 52 Estructura de los comandos Cada comando se compone de: 1. Código de comando, es un número en hexadecimal que identifica el comando. 2. Número de bytes de la trama de comando. 3. Trama de comando, 5.2. Secuencia de Envı́o y Confirmación Para minimizar los errores de comunicación se implementó un enlace de tres vı́as; para ello se estableció el siguiente procedimiento de envı́o y confirmación (ver figura 5.1): 1. El usuario envı́a el código de comando. 2. La unidad envı́a el mismo código como señal de confirmación. Si el comando no existe, la unidad reinicia y envı́a el código 0x53 ó el carácter S en ASCII. 3. Si el código es correcto, se debe enviar la trama de comando encabezado con un byte que indique el tamaño de la trama. Tanto el código de comando y el numero de bytes no cuentan como miembros de la trama de comando. Cuando la tarea de comunicación termina de ejecutar el comando, la tarea reinicia y envı́a el código 0x53. Un comando se puede cancelar esperando 1 segundo o enviando 0 en el número de bytes de la trama. 5.2.1. Secuencia de ejemplo Se desea configurar el rango de medición de ±2 en el canal 0 del ADC. El código de comando para cambiar el rango de medición de un canal ADC es 0x1A. La trama de comando se conforma de: Número de canal y código de rango. En este caso, el número de canal es 0x00 y el número de rango para ±2 es 0x02. La secuencia de envı́o y confirmación es: CAPÍTULO 5. GUIA DE COMANDOS Figura 5.1: Algoritmo de la tarea de comunicación. 53 CAPÍTULO 5. GUIA DE COMANDOS 1. Comando: 0x1A. 2. Tamaño: 0x02. 3. Trama: 0x00, 0x02. 54 Capı́tulo 6 Lista de Comandos Los comandos se clasifican en secciones: 1. Sección 0x10: Funciones de hardware y sistema. 2. Sección 0x20: Funciones de módulos parte I. 3. Sección 0x30: Funciones de módulos parte II. 4. Sección 0x50: Funciones de captura e información. 5. Sección 0x60: Funciones de red I2C. Para facilitar el ingreso de opciones numéricas se utiliza el formato ASCII en 6 bytes. Ejemplo, si se desea introducir el valor numérico 0,1234569 se debe redondear y construir una cadena de 6 bytes en ASCII de la siguiente manera: 0.1235. Para el caso de valores negativos, el signo − cuenta como 1 byte; ejemplo: -0.123. Los módulos que necesitan de tiempo de muestreo se utiliza 16 bits (2 bytes) para especificar este parámetro. Ejemplo, se desea un tiempo de muestreo de 500ms, la secuencia corresponde: 0xF4 0x01, se ingresa primero el byte LSB y después el byte MSB. 55 CAPÍTULO 6. LISTA DE COMANDOS 6.1. 56 Funciones de hardware y sistema Estos comandos permiten cambiar la configuración de hardware y las opciones de la unidad controladora. 6.1.1. Iniciar o detener máquina virtual Código de comando: 0x11 Tamaño de trama: 1 byte. Opciones de trama: 0: Detiene aplicación de la máquina virtual. Pone a cero todas las salidas DAC y PWM. 1: Inicia aplicación de la máquina virtual. Ejecuta una aplicación previamente creada. 2: Pausa aplicación de la máquina virtual. 6.1.2. Devuelve registro de estado Código de comando: 0x13 Tamaño de trama: 1 byte. Opciones de trama: 0 - 15: Número de registro. Registro de estado: Este registro mantiene el estado de operaciones del sistema, para diagnostico. Números de registro: 0: Estado de la ultima operación UART1 CAPÍTULO 6. LISTA DE COMANDOS 57 1: Estado de la ultima operación UART2 2: Registra de donde se tomó la configuración de módulos IO: 0: Inexistente. 1: Configuración por defecto. 2: Se leyó la EEPROM pero no se encontró una configuración para IO, el sistema se configuró por defecto. 3: Los módulos IO se configuraron de la EEPROM. 3: Detecto un error en lectura de la memoria EEPROM. 4: Estado de la ultima operación de bus. 5: Estado de la tarea de captura: 0: desactivada. 1: capturar/ando. 2: datos listos. 3: enviar/ando datos. 4: borrar/ando datos. 6: Error en BUS I2C numero de reintentos vencidos. 7: Error en BUS I2C intento de escritura en el puerto no existe. 8: Último comando sobre UART2. 9: Último comando sobre UART1. 6.1.3. Borra la memoria EEPROM Código de comando: 0x14 Tamaño de trama: 1 byte. CAPÍTULO 6. LISTA DE COMANDOS Opciones de trama: X: Cualquier valor para cumplir formato de comando. 6.1.4. Guarda la configuración de sistema en EEPROM Código de comando: 0x15 Tamaño de trama: 1 byte. Opciones de trama: X: Cualquier valor para cumplir formato de comando. 6.1.5. Recibe el archivo de aplicación Código de comando: 0x16 Tamaño de trama: Según tamaño de archivo netlist. Opciones de trama: N: Archivo netlist. 6.1.6. Recibe un archivo de configuración IO Código de comando: 0x17 Tamaño de trama: Según tamaño de archivo de configuración. Opciones de trama: N: Número de módulo IO (ver archivo IO CFG.H). F: Archivo de configuración. 58 CAPÍTULO 6. LISTA DE COMANDOS 6.1.7. 59 Reinicia el sistema Código de comando: 0x18 Tamaño de trama: 1 byte. Opciones de trama: X: Cualquier valor para cumplir formato de comando. 6.1.8. Asigna un valor a un elemento de salida (DAC o PWM) Código de comando: 0x19 Tamaño de trama: 7 bytes. Opciones de trama: N: Número de salida. ◦ 0x00: Salida DAC0. ◦ 0x01: Salida DAC1. ◦ 0x02: Salida PWM0. ◦ 0x03: Salida PWM1. ◦ 0x04: Salida PWM2. ◦ 0x05: Salida PWM3. A: Valor normalizado en ASCII (6 bytes). 6.1.9. Define un rango de medición a un canal ADC Código de comando: 0x1A Tamaño de trama: 2 bytes. Opciones de trama: CAPÍTULO 6. LISTA DE COMANDOS N: Número de canal. R: Número de rango. ◦ 0x00: ±10V . ◦ 0x01: ±5V . ◦ 0x02: ±2V . ◦ 0x03: ±1V . ◦ 0x04: ±0,5V . ◦ 0x05: ±200mV . ◦ 0x06: ±100mV . ◦ 0x07: ±50mV . ◦ 0x08: 0 − 10V . ◦ 0x09: 0 − 5V . ◦ 0x0A: 0 − 2V . ◦ 0x0B: 0 − 1V . ◦ 0x0C: 0 − 0,5V . ◦ 0x0D: 0 − 200mV . ◦ 0x0E: 0 − 100mV . ◦ 0x0F: 0 − 50mV . 6.1.10. Define un rango de medición a un canal DAC Código de comando: 0x1B Tamaño de trama: 2 bytes. Opciones de trama: N: Número de canal. R: Número de rango. 60 CAPÍTULO 6. LISTA DE COMANDOS ◦ 0x00: ±10V . ◦ 0x01: ±5V . ◦ 0x02: ±2V . ◦ 0x03: ±1V . ◦ 0x04: 0 − 10V . ◦ 0x05: 0 − 5V . ◦ 0x06: 0 − 2V . ◦ 0x07: 0 − 1V . 6.1.11. Lee un canal ADC Código de comando: 0x1C Tamaño de trama: 1 bytes. Opciones de trama: N: Número de canal. Este comando devuelve el valor normalizado de la lectura ADC (6 bytes). 6.2. Funciones de módulos parte I Estos comandos permiten cambiar la configuración de los módulos virtuales. 6.2.1. Cambiar la configuración de un filtro Código de comando: 0x21 Tamaño de trama: Variable. Opciones de trama: T: tipo de filtro: 61 CAPÍTULO 6. LISTA DE COMANDOS 62 ◦ 0: IIR2. ◦ 1: IIR4. ◦ 2: FIR. ◦ 3: NOTCH 60Hz. N: Número de bloque. FC: Frecuencia de corte en Hz, 6 bytes en ASCII (solo IIR2, IIR4 y FIR). BW: Ancho de banda en Hz, 6 bytes en ASCII (solo IIR2, IIR4). R: Radio de los polos conjugados, 6 bytes en ASCII (opcional: solo NOTCH). TF: Tipo de filtro: (Solo IIR2 y IIR4) ◦ 0: Butterworth paso bajo. ◦ 1: Butterworth paso alto. ◦ 2: Bessel paso bajo. ◦ 3: Bessel paso alto. ◦ 4: Butterworth pasa banda. ◦ 5: Butterworth rechaza banda. TF: Tipo de filtro: (Solo FIR). ◦ 0: De 1 a 16 etapas ◦ 1: 32 etapas. ◦ 2: 64 etapas. Los filtros NOTCH de 60Hz no requieren configuración previa a la utilización, este tipo de filtro se configura por defecto con r = 0,95. Los demás tipos de filtro necesitan configurarse antes de entrar en operación. 6.2.2. Configurar un módulo de función de transferencia Código de comando: 0x23 CAPÍTULO 6. LISTA DE COMANDOS 63 Tamaño de trama: Variable. Opciones de trama: N: Número de bloque. TL: Tiempo de muestreos en ms, byte LSB. TH: Tiempo de muestreos en ms, byte MSB. TL: Formato: ◦ 0: Polos y ceros. ◦ 1: Constantes. Formato de polos y cero: ◦ G: Ganancia en ASCII 6 bytes. ◦ P1: Polo 1, real y complejo, 12 bytes en ASCCI. ◦ P2: Polo 2, real y complejo, 12 bytes en ASCCI. ◦ Z1: Cero 1, real y complejo, 12 bytes en ASCCI. ◦ Z2: Cero 2, real y complejo, 12 bytes en ASCCI. Formato de constantes: ◦ B0: Constante B0. ◦ B1: Constante B1. ◦ A1: Constante A1. ◦ B2: Constante B2. ◦ A2: Constante A2. Las cadenas con números complejos se introducen como dos cadenas ASCII de 6 bytes, ejemplo: −0,5 + j0,5 se representa como -0.5000.5000. 6.2.3. Recibe coeficientes Kp, Ki, Kd, Ts para configurar PID Código de comando: 0x25 CAPÍTULO 6. LISTA DE COMANDOS 64 Tamaño de trama: 22 bytes. Opciones de trama: TF: Tipo de control PID: ◦ 0: PID estandar. ◦ 1: PI D. ◦ 2: I PD. N: Número de bloque. TL: Tiempo de muestreos en ms, byte LSB. TH: Tiempo de muestreos en ms, byte MSB. P: Constante proporcional ASCII 6 bytes. I: Constante integral ASCII 6 bytes. D: Constante derivativa ASCII 6 bytes. 6.2.4. Recibe parametros de configuración de oscilador senoidal Código de comando: 0x26 Tamaño de trama: 13 bytes. Opciones de trama: N: Número de bloque SOSC. X: Frecuencia, 6 bytes en ASCII. G: Amplitud, 6 bytes en ASCII. CAPÍTULO 6. LISTA DE COMANDOS 6.2.5. 65 Recibe parámetros de configuración de oscilador rectagular Código de comando: 0x27 Tamaño de trama: 19 bytes. Opciones de trama: N: Número de bloque ROSC. TL1: Tiempo 1 en ms, byte LSB. TH1: Tiempo 1 en ms, byte MSB. TL2: Tiempo 2 en ms, byte LSB. TH2: Tiempo 2 en ms, byte MSB. TL3: Tiempo 3 en ms, byte LSB. TH3: Tiempo 3 en ms, byte MSB. GP: Amplitud positiva, 6 bytes en ASCII. GN: Amplitud negativa, 6 bytes en ASCII. 6.2.6. Recibe parametros de configuración de oscilador triangular Código de comando: 0x28 Tamaño de trama: 17 bytes. Opciones de trama: N: Número de bloque TOSC. TL1: Tiempo 1 en ms, byte LSB. TH1: Tiempo 1 en ms, byte MSB. CAPÍTULO 6. LISTA DE COMANDOS 66 TL2: Tiempo 2 en ms, byte LSB. TH2: Tiempo 2 en ms, byte MSB. GP: Amplitud positiva, 6 bytes en ASCII. GN: Amplitud negativa, 6 bytes en ASCII. 6.2.7. Recibe parametros de configuración de oscilador triangular Código de comando: 0x29 Tamaño de trama: 17 bytes. Opciones de trama: N: Número de bloque VOSC. TL1: Tiempo máximo en ms, byte LSB. TH1: Tiempo máximo en ms, byte MSB. TL2: Tiempo mı́nimo en ms, byte LSB. TH2: Tiempo mı́nimo en ms, byte MSB. GP: Amplitud positiva, 6 bytes en ASCII. GN: Amplitud negativa, 6 bytes en ASCII. 6.2.8. Recibe parámetros de configuración de K Código de comando: 0x2B Tamaño de trama: Variable. Opciones de trama: N: Número de bloque. CAPÍTULO 6. LISTA DE COMANDOS 67 TL: Tiempo de muestreos en ms, byte LSB. TH: Tiempo de muestreos en ms, byte MSB. X: Tamaño del arreglo. K: Cadena de constantes en formato ASCII. El tamaño máximo del arreglo es de 4, este número se especifica en formato decimal ó hexadecimal. 6.3. Funciones de módulos parte II 6.3.1. Crear o destruir módulos virtuales Código de comando: 0x31 Tamaño de trama: Variable. Opciones de trama: N: Total de módulos. X: Archivo. 6.3.2. Ajusta ganancia de un módulo GAIN Código de comando: 0x32 Tamaño de trama: 7 bytes. Opciones de trama: N: Número de bloque. X: Ganancia, 6 bytes en ASCII. CAPÍTULO 6. LISTA DE COMANDOS 6.3.3. 68 Ajusta lı́mites de un módulo SAT Código de comando: 0x33 Tamaño de trama: 13 bytes. Opciones de trama: N: Número de bloque. X: Valor máximo, 6 bytes en ASCII. Y: Valor mı́nimo, 6 bytes en ASCII. 6.3.4. Ajusta lı́mites de un módulo NOISE Código de comando: 0x34 Tamaño de trama: 13 bytes. Opciones de trama: N: Número de bloque. X: Valor máximo, 6 bytes en ASCII. Y: Valor mı́nimo, 6 bytes en ASCII. 6.3.5. Funciones de captura e información 6.3.6. Recibir parametros de configuración de la tarea de captura Código de comando: 0x51 Tamaño de trama: Variable. Opciones de trama: CAPÍTULO 6. LISTA DE COMANDOS 69 SL: Tiempo de muestreo en ms, byte LSB. SH: Tiempo de muestreo en ms, byte MSB. SS: Tiempo total de captura en segundos. V: Variables, 3 bytes por variable: ◦ T: Valor tipo. ◦ N: Número de bloque. ◦ O: Número de salida. 6.3.7. Recibir parámetros de configuración de la tarea de captura Código de comando: 0x52 Tamaño de trama: 2 bytes. Opciones de trama: OP: Estado de la tarea de captura: ◦ 0: Desactivada. ◦ 1: Iniciar captura. ◦ 2: Datos listos. ◦ 1: Enviar datos. ◦ 2: Borrar datos. El registro de operación de la tarea de captura se puede consultar con el comando 0x53. Es recomendable consultar el estado del registro captura antes de iniciar o configurar una captura de datos. La tarea de captura es compartida entre las máquinas virtuales. El RTOS no permite que una vez iniciada la tarea de captura esta sea interrumpida por otra máquina virtual que no sea la que la inició; sin embargo, la tarea de captura tiene un timeout de 30 segundos si esta no recibe actividad. CAPÍTULO 6. LISTA DE COMANDOS 6.3.8. 70 Devolver valor de los registros de la tarea de captura Código de comando: 0x53 Tamaño de trama: 1 byte. Opciones de trama: 0 - 2: Número de registro. Índices de los registros de operación de la tarea de captura: 0: Máquina que tiene la tarea 1: Estado de la tarea de captura (Maq 0) 2: Estado de la tarea de captura (Maq 1) 6.3.9. Enviar valores de salida de los módulos virtuales Código de comando: 0x54 Tamaño de trama: Variable. Opciones de trama: OP: Variables, 3 bytes por variable: ◦ T: Valor tipo. ◦ N: Número de bloque. ◦ O: Número de salida. Esta función es útil para verificar en tiempo real el comportamiento de la planta y el control, una finalizada el comando la unidad enviará en el mismo orden la variables consultadas en formato normalizado (ASCII 6 bytes). CAPÍTULO 6. LISTA DE COMANDOS 6.3.10. 71 Guardar valor en un registro de propósito general Código de comando: 0x55 Tamaño de trama: 7 bytes. Opciones de trama: N: Número de registro. V: Valor, 6 bytes en ASCII. 6.3.11. Enviar información acerca porcentaje de uso de la CPU Código de comando: 0x56 Tamaño de trama: 1 byte. Opciones de trama: N: Cualquier valor para cumplir formato de comandos. Este comando envı́a el porcentaje de uso de la CPU donde 1.0 representa el 100 %. Capı́tulo 7 Cambiar la configuración de los periféricos Estos son los pasos a seguir para cambiar la configuración de un dispositivo IO, esta configuración se guardará en memoria externa EEPROM y se ejecutara una vez que se reinicia la unidad. Procedimiento: 1. Encender la unidad y esperar a que termine la secuencia de inicio. Si la configuración no es funcional, debe apagar la unidad, mantener presionado el botón ACC/CAL y luego encender la unidad. Soltar el botón de ACC/CAL hasta que el led de ON se encienda. Esto evitará que se cargue la configuración de la memoria EEPROM. 2. Conecte un cable serial directo, al puerto COM1 de la unidad. 3. Iniciar una sesión de usuario con la unidad y LookRS232, para ello configure el LookRS232 con los siguientes parámetros: Transfer speed: 9600 Data bits: 8 Stop bits: 2 72 CAPÍTULO 7. CAMBIAR LA CONFIGURACIÓN DE LOS PERIFÉRICOS 73 Parity control: None Flow control: None 4. Antes de enviar un comando, debe diseñar una configuración. Note que en el archivo IO CFG.H, cada parámetro esta asociado con un registro IO Config. Este indica el número de registro y número o rango de bits. Ejemplo: Se desea cambiar la configuración del ADC1 con los siguientes parámetros: Parametro Valor IO Config Valor en IO Config ADCx EN PERIPH 1 IO Config[0.0] 1d ADCx SAMPLING MODE 0 IO Config[0.1] 0d ADCx SAMPLES PCV 2 IO Config[0.7-2] 2d ADCx SAMPLING RATE 900 IO Config[1] 0x03h IO Config[2] 0x84h ADCx V REF POS CH AVDD IO Config[3.3-0] 3d ADCx V REF NEG CH AVSS IO Config[3.7-4] 2d ADCx RES BITS 0 IO Config[4.3-0] 0 ADCx DATA OUT SIGN INT IO Config[4.7-4] 1d El comando inicia con una petición a la unidad de configuración de dispositivo IO mediante el codigo 0x17h, luego con la cantidad de bytes a enviar (igual a total de bytes de la trama - 2), número de periférico a configurar y por último bytes de configuración. Con estos datos, la trama se compone de la siguiente manera: CAPÍTULO 7. CAMBIAR LA CONFIGURACIÓN DE LOS PERIFÉRICOS Byte Nombre Valor 1 Comando 0x17h 2 Tamaño 0x06h 3 Periférico 0x20h 4 IO Config[0] 0x05h 5 IO Config[1] 0x03h 6 IO Config[2] 0x84 7 IO Config[3] 0x23h 8 IO Config[4] 0x10h 74 5. Debe enviar los comandos en secuencia y no uno a uno; para ello, utilize la función GO del programa LookRS232. Cuando termine de enviar los comando la unidad envı́a el simbolo “S” el cual indica que la configuración se recibió con éxito. Si recibe el carácter “E”, significa que se produjo un error de comunicación y debe revisar que la trama esté correcta. Figura 7.1: Comando recibido. 6. Ahora hay que guardar la configuración enviando el comando 0x15h, con la siguiente estructura: CAPÍTULO 7. CAMBIAR LA CONFIGURACIÓN DE LOS PERIFÉRICOS Tabla 7.1: Números de dispositivo. Dispositivo Número 0x10h Puerto A 0x11h Puerto B 0x12h Puerto C 0x13h Puerto D 0x14h Puerto E 0x15h Puerto F 0x16h Puerto G 0x17h Entradas Analógicas 0x20h ADC 1 0x21h ADC 2 0x30h UART 1 0x31h UART 2 0x40h I2C 1 0x41h I2C 2 0x50h SPI 1 0x51h SPI 2 0x60h PWM 0x70h QEI 1 75 CAPÍTULO 7. CAMBIAR LA CONFIGURACIÓN DE LOS PERIFÉRICOS Byte Nombre Valor 1 Comando 0x15h 2 Tamaño 0x01h 3 Vacio 0x00h 76 7. Por último, debe reiniciar la unidad para que la configuración sea ejecutada, para ello se puede presionar el botón de RESET o enviar el comando 0x18h: Byte Nombre Valor 1 Comando 0x18h 2 Tamaño 0x01h 3 Vacio 0x00h Capı́tulo 8 Creación de módulos Esta sección explica cómo crear nuevas funciones o módulos virtuales. El proceso se realiza directamente en el compilador MPLAB C30 de Microchip, por lo que es necesario una recompilación del firmware y reprogramación del microcontrolador. Como ejemplo, se creará el módulo virtual NOISE, este módulo tendrá la función de generar una salida con valores aleatorios para simulación de ruido; el módulo virtual NOISE tendrá como parámetros el valor máximo y mı́nimo de salida. 8.1. Definiciones Cada módulo virtual se compone de los siguientes elementos: Estructura: Esta se define como un nuevo tipo dentro del programa, esta se crea como un a estructura (struct) que se compone de: Variables y constantes intermedias para el cálculo del módulo virtual. Registro de salida y puntero(s) de la(s) entrada(s). Punteros a los módulos anterior y pasado del mismo tipo. Todos los módulos del mismo tipo se enlazan uno con el otro. Ver figura 77 CAPÍTULO 8. CREACIÓN DE MÓDULOS 78 Valor tipo: Define el número valor tipo, el cual identifica el módulo virtual. Número base: Define la posición en la tabla de punteros a módulos PTR STRUCTS. Función NEW: Crea temporalmente en memoria dinámica el módulo virtual. Función DESTROY: Destruye el último módulo virtual. Función GETPTR: Devuelve un puntero de una estructura. Función de configuración: Configura el módulo de acuerdo a los parámetros. Función SAMPLE: Realiza el cálculo de una muestra según la función del módulo. Cada función debe ser global, el archivo APP FUNC.H contiene todos los encabezados establece una función como función global. 8.2. Estructura La estructura se crea con el comando typedef struct{} dentro del archivo SYS BLOCKS.H, ejemplo: typedef struct noise { Variables intermedias INT16S m; INT16S b; Puntero a una entrada ( solo en casos de módulos con entrada(s) ) INT16S * input Registro de salida ( solo en casos de módulos con salida(s) ) INT16S output; Puntero a la estructura NOISE anterior void * last; Puntero a la estructura NOISE siguiente void * next; CAPÍTULO 8. CREACIÓN DE MÓDULOS 79 } NOISE; Esto define un tipo de módulo NOISE con todas sus variables y parámetros, con ello, se simplifica la creación, ejecución y destrucción de módulos virtuales NOISE. 8.3. Valor tipo El valor tipo identifica el tipo de módulo virtual. Cuando se crea un nuevo módulo se debe especificar un valor tipo, este se asigna dentro del archivo SYS DEF.H: #define NOISE ID 82 Cuando se desee utilizar un módulo NOISE se debe usar el número 82. 8.4. Número base Este número identifica la posición dentro de la tabla PTR STRUCTS de la máquina virtual de la primera y última estructura NOISE. El archivo SYS DEF.H contiene todos los números base de cada módulo: #define NOISE MODULES BASE 14 Esto significa que en la posición 14 de la tabla PTR STRUCTS de la máquina virtual están los punteros de la primera y última estructura NOISE. Además, se debe crear un contador de estructuras NOISE, este contador se guarda como parámetro de la estructura VM de la máquina virtual: INT8U NOISEmodules cont; Cada vez que se crea o destruye una estructura NOISE el contador aumenta o disminuye, esta variable permite mantener una estadı́stica de cuantos módulos NOISE existen. El contador debe inicializarse a cero, la función Virtual Machine Init Components dentro del archivo VM FUNC.C inicializa todas las variables de la máquina virtual, debe añadirse la lı́nea: CAPÍTULO 8. CREACIÓN DE MÓDULOS 80 Machine->NOISEmodules cont = 0; 8.5. Función NEW Cada tipo de módulo debe tener un constructor de estructuras, esta función verifica si hay memoria suficiente para crear un módulo, en caso contrario el módulo no será creado. Cuando se crea un módulo este se enlaza al último módulo existente del mismo tipo. Si este es el primer módulo este se enlaza directamente a la tabla PTR STRUCTS de la máquina virtual. void NOISEnew( VM * Machine ) { NOISE * nuevo; NOISE * last = Machine->ptr structs[ NOISE MODULES BASE ][1]; nuevo = (NOISE *) malloc ( sizeof( NOISE ) ); if( nuevo != NULL ) { nuevo->next = NULL; Machine->NOISEmodules cont++; if( Machine->ptr structs[ NOISE MODULES BASE ][0] == NULL ) { Machine->ptr structs[ NOISE MODULES BASE ][0] = nuevo; nuevo->last = NULL; } else { last->next = nuevo; nuevo->last = last; } Machine->ptr structs[ NOISE MODULES BASE ][1] = nuevo; CAPÍTULO 8. CREACIÓN DE MÓDULOS 81 } } } Cada estructura se crea en la sección de memoria Y[13] del microcontrolador, ciertas funciones de la biblioteca DSP necesitan de memoria X, para reservar memoria X se debe utilizar las funciones de memoria dinámica del RTOS, se reservó una sección de memoria X para este propósito. Utilize la función: OSMemGet( filter coeff buf, &err); Para reservar memoria dinámica en la sección X, esta función devuelve un puntero a una sección de 20 bytes o según la definida por XMEM STACK SIZE en el archivo SYS CFG.H. Utilize: OSMemPut( filter coeff buf, puntero ); Para liberar una sección de memoria X. 8.6. Función DESTROY Esta función destruye un módulo virtual y devuelve la memoria utilizada. void NOISEdestroy( VM * Machine ) { NOISE * last = Machine->ptr structs[ NOISE MODULES BASE ][1]; if( last != NULL ) { Machine->ptr structs[ NOISE MODULES BASE ][1] = last->last; free( last ); Machine->NOISEmodules cont--; if( Machine->NOISEmodules cont == 0 ) CAPÍTULO 8. CREACIÓN DE MÓDULOS 82 Machine->ptr structs[ NOISE MODULES BASE ][0] = NULL; } } El módulo destruido es el último de la lista enlazada. 8.7. Función GETPTR Esta función devuelve el puntero de la estructura del módulo, se utiliza como parámetro el número de módulo; este número de módulo corresponde a la cantidad de saltos que se deben realizar para accesar al módulo dentro de la lista enlazada. El número 0 corresponde a la estructura directamente conectada a PTR STRUCTS. NOISE * NOISEgetptr( VM * Machine, INT8U element ) { INT8U i; NOISE * aux = Machine->ptr structs[ NOISE MODULES BASE ][0]; for( i = 0; i <element; i++ ) { if( aux->next != NULL ) aux = (NOISE*)aux->next; else return NULL; } return aux; } 8.8. Función de configuración Esta función permite configurar el módulo de acuerdo a los parámetros establecidos por el usuario. void NOISE Config( NOISE * NOISE struct, INT8U * max, INT8U * min ) CAPÍTULO 8. CREACIÓN DE MÓDULOS 83 { FP32 fmax, fmin; fmax = ascii2float( max, ASCII NUMBERS ); fmin = ascii2float( min, ASCII NUMBERS ); NOISE struct->m = float2fixed( (fmax - fmin)/ RAND MAX ); NOISE struct->b = float2fixed( fmin ); } La función recibe, el puntero a la estructura NOISE que se desea configurar, se puede utilizar externamente la función GETPTR para obtener este puntero, además se reciben dos punteros a cadenas de caracteres según el tamaño establecido por ASCII NUMBERS (6 bytes por defecto), cada cadena contiene el valor máximo y mı́nimo (normalizado) que debe generar la función NOISE. La función de configuración NOISE calcula los valores m y b, los cuales sirven para escalar el valor generado por rand()[14]. La función de configuración se ejecuta con un comando asociado, el archivo COMMAND.C define todos los comandos. case 0x34: NOISE Config( NOISEgetptr( Machine, *(ptr command)), (ptr command+1), (ptr command+7) ); break; 8.9. Función SAMPLE La función SAMPLE ejecuta el cálculo para obtener una muestra, este cálculo depende de cada módulo: void NOISE Sample( NOISE * NOISE struct ) { NOISE struct->output = CAPÍTULO 8. CREACIÓN DE MÓDULOS 84 fixed x fixed( rand(), NOISE struct->m ) + NOISE struct->b; } La función NOISE Sample calcula un valor aleatorio que se mantenga dentro del rango definido por el usuario, los valores m y b fueron previamente establecidos por NOISE Config. Cada función SAMPLE esta asociada con una función de ejecución de módulo, esta función es la que utiliza la máquina virtual para ejecutar la estructura de control configurada por el usuario, ver archivo APP EXE.C: void App Instr NOISE( VM * Machine ) { Machine->App PC++; NOISE Sample( (NOISE *)( *(Machine->App PC)) ); } Además se debe actualizar la tabla de funciones, esta es una tabla de punteros a las funciones de ejecución del módulo, esto permite que la selección de la función a ejecutar por parte de la máquina virtual se realize ordenadamente. La inicialización de la tabla se realiza en la rutina App Instr Init dentro del archivo APP EXE.C. App Func Ptrs[ NOISE ID ] = App Instr NOISE; Por último, se deben actualizar las siguientes funciones secundarias: App Get Block Struct Ptr, esta función devuelve el puntero de la estructura según el valor tipo y número de módulo. case NOISE ID: return (void*)NOISEgetptr( Machine, number ); break; CAPÍTULO 8. CREACIÓN DE MÓDULOS 85 App Assign Nets Out Ptrs, esta función devuelve un puntero al registro de salida de un módulo, si el módulo no tiene salidas se debe omitir esta actualización. case NOISE ID: return &( NOISEgetptr( Machine, s number )->output); break; App Assign Nets In Ptrs, esta función devuelve un puntero al puntero de entrada de un módulo, si el módulo no tiene entradas se debe omitir esta actualización. Ver la función en archivo NETLIST.C como ejemplo. App C D Modules, esta función crea o destruye módulos según el archivo de actualización de módulos que se carga con el comando 0x31, ver archivo COMMAND.C. case NOISE ID: m cont = *(file+j+1) - Machine->NOISEmodules cont; if( m cont >0 ) C Ptrs = NOISEnew; if( m cont <0 ) C Ptrs = NOISEdestroy; break; Esquemas 86 ESQUEMAS 87 ESQUEMAS 88 ESQUEMAS 89 ESQUEMAS 90 ESQUEMAS 91 ESQUEMAS 92 ESQUEMAS 93 ESQUEMAS 94 ESQUEMAS 95 ESQUEMAS 96 Bibliografı́a [1] Applied Industrial Control Solutions. Digital Filter Design Writing Difference Equations For Digital Filters [en lı́nea].[22 de Setiembre, 2007]. URL http://www.apicsllc.com/apics/Sr 3/Sr 3.htm. [2] Beis, Uwe Converting Analog into Digital (IIR) Filters [en lı́nea]. [10 de Enero, 2008]. URL http://www.beis.de/Elektronik/Filter/AnaDigFilt/AnaDigFilt.html [3] Brey, Barry B. Los Microprocesadores Intel, Arquitectura, programación e intergaz de los procesadores 8086/8088, 80186/80188, 80286, 80386, 80486, Pentium, Pentium Pro y Pentium II. Quinta Edición. Prentice Hall of India, 2001. [4] Cisco Networking Academy. Principios de Networking: Modelos de Networking [en lı́nea]. Junio, 2005, [5 de Noviembre, 2007]. URL http://cisco.netacad.net. [5] Dahmke, Mark. Microcomputer Operating Systems. Byte Books, 1982. [6] Deitel, P.J.; Deitel H.M. JAVA, How to Program. Seventh Edition. Prentice Hall, 2007. [7] Facultad de Ciencias de la Computación Grafos, Estructruras de Datos y Algoritmos [en lı́nea]. Febrero, 2008, [20 de Febrero, 2008]. URL http://www.cs.buap.mx/ titab/files/grafos1.pdf. [8] Kernighan Brian W; Ritchie Dennis M. El Lenguaje de Programación C. Segunda Edición. Prentice Hall, 1991. [9] Katsuhiko, Ogata. Sistemas de Control en Tiempo Discreto. Segunda Edición. Prentice Hall Hispanoamericana, S.A, 1996. 97 98 BIBLIOGRAFÍA [10] Labrosse, Jean J. Embedded Systems Building Blocks. Second Edition. Lawrence, KS: CMPBooks, 2002. [11] Labrosse, Jean J. MicroC/OS-II The Real-Time Kernel. Segunda Edición. Lawrence, KS: CMPBooks, 2002. [12] Microchip Technology Inc. MPLAB ICD2 In–Circuit Debugger User’s Guide. Microchip Technology Inc., 2005. [13] Microchip ce Technology Manual. [en Inc. lı́nea]. dsPIC33F [1 de Family Agosto, Referen- 2007]. URL http://www.microchip.com/stellent/idcplg?IdcService=SS GET PAGE&nodeId=2573. ® Language Tools Libraries. [en lı́nea]. [1 de Agosto, [14] Microchip Technology Inc. dsPIC 2007]. URL http://ww1.microchip.com/downloads/en/DeviceDoc/51456b.pdf. [15] Microchip Technology Inc. MPLAB ® C Compiler User’s Guide. [en lı́nea]. [1 de Agosto, 2007]. URL http://ww1.microchip.com/downloads/en/DeviceDoc/51284G.pdf. [16] Rorabaugh, C. Britton. Digital Filter Designer’s Handbook. McGraw Hill, 1993. [17] Proakis, John G; Manolakis Dimitris G. Digital Signal Processing, Principles, Algorithms and Applications. Fourth Edition. Prentice Hall of India, 2006. [18] Universidad Central de Chile. Sistemas operativos de tiempo real [en lı́nea]. [5 de Noviembre, 2007]. URL http://eiec.ucentral.cl/ftp/material/apuntes/iec51/Sistemas. [19] Tocci, Ronald J. Sistemas Digitales, Principios y Aplicaciones. Sexta Edición. Pearson Educación, 1996. [20] Wikimedia Foundation, Inc. Embedded system [en lı́nea]. Octubre, 2007, [3 de Noviembre, 2007]. URL http://en.wikipedia.org/wiki/Embedded system. [21] Wikimedia [en lı́nea]. Foundation, Noviembre, Inc. 2007, Sistemas [2 operativos de de Noviembre, http://es.wikipedia.org/wiki/Sistemas operativos de tiempo real. tiempo 2007]. real URL