INSTITUTO TECNOLÓGICO DE CULIACÁN
DEPARTAMENTO DE ING. ELÉCTRICA ELECTRÓNICA INFORME TÉCNICO DE RESIDENCIA PROFESIONAL Medición y adecuación de señales para aplicaciones de control
No. CONTROL
NOMBRE
CARRERA
10170860
Mijail Romero Delgado
Ing. Electrónica
Asesores: Interno:
DR. GUILLERMO JAVIER RUBIO ASTORGA.
Externo:
ING. SALVADOR BELTRÁN RIVERA.
Empresa: INSTITUTO TECNOLÓGICO DE CULIACÁN Culiacán Sinaloa a 27 de Enero del 2015
Capítulo 1. Justificación A
continuación
justificación
del
se
dará
desarrollo
a
conocer del
la
proyecto
“Medición y adecuación de señales para aplicaciones de control”.
1
Capítulo 1. Justificación A
continuación
justificación
del
se
dará
desarrollo
a
conocer del
la
proyecto
“Medición y adecuación de señales para aplicaciones de control”.
1
JUSTIFICACIÓN El Instituto Tecnológico de Culiacán es una empresa prestadora de servicios de educación y su misión es formar profesionistas de excelencia, que contribuyan al desarrollo de la comunidad a través de la creación y aplicación de tecnologías, tecnologías, ética de trabajo, creatividad y respeto a la naturaleza. Al ser una Institución educativa de calidad, cuenta con proyectos integrales para fortalecer la educación que se imparte en la Institución, tal es el caso del proyecto “Medición y adecuación de señales para aplicaciones de control” el cual pretende
que se encuentre una forma conveniente de medir señales eléctricas tanto de corriente como de voltaje, así como evaluar plataformas de bajo costo que puedan ser utilizadas para medir las señales eléctricas y sean capaces de realizar una acción de control. La medición de señales eléctricas en ingeniería siempre ha sido de suma importancia para conocer el comportamiento de las variables que se controlan en aplicaciones de control, por esto es importante desarrollar un prototipo que se encargue de ésta acción. Además, al encontrar una plataforma adecuada para medir señales eléctricas y realizar acciones de control se puede llegar a una reducción de costos significativa en el aprendizaje, además de disminuir el tiempo de búsqueda de los estudiantes para encontrar la plataforma adecuada para sus proyectos de control. Las características que menciona el fabricante acerca de su plataforma son para casos ideales, por lo que es necesario tener un registro de las dificultades que puede haber al utilizar la plataforma. Este tipo de proyectos que lleva a cabo el Instituto Tecnológico de Culiacán permiten establecerse como una de las instituciones de calidad educativa más importantes en el Estado de Sinaloa.
2
Capítulo 2. Objetivos A continuación se darán a conocer los objetivos del
proyecto
“Medición
y
adecuación
señales para aplicaciones de control”.
3
de
OBJETIVOS 2.1 Objetivo General. Desarrollar un prototipo para hacer la medición de señales eléctricas de corriente y voltaje para obtener su equivalente en RMS (Root Mean Square), aplicando técnicas de filtrado, además de analizar diferentes plataformas basadas en microcontrolador de bajo costo para desarrollo de aplicaciones de control.
2.2 Objetivos específicos.
Desarrollar un prototipo para medir señales eléctricas de corriente y voltaje.
Aplicar técnicas de filtrado y amplificación para obtener rangos de voltaje medibles por las plataformas basadas en microcontrolador.
Analizar las características de las plataformas basadas en microcontrolador para posteriormente comprobar su funcionamiento.
Verificar funcionamiento con Simulink de todas las plataformas basadas en microcontrolador.
4
Capítulo 3. Problemas a resolver A continuación se dará a conocer el problema a resolver del proyecto “Medición y adecuación de señales para aplicaciones de control”.
5
PROBLEMAS A RESOLVER Actualmente el Instituto Tecnológico de Culiacán tiene algunas deficiencias respecto a equipo de laboratorio para las materias de control, con este proyecto se podrá ampliar el equipo que los estudiantes podrán manipular. El proyecto “Medición y adecuación de señales para aplicaciones de control”
ayudará principalmente a los estudiantes de ingeniería y maestría del Instituto Tecnológico de Culiacán a realizar prácticas para ampliar sus conocimientos, haciendo más fácil el aprendizaje. La idea de medir señales eléctricas de corriente alterna es para poder analizar circuitos eléctricos que incluyan cargas de cualquier tipo y que los alumnos puedan aplicar conocimientos de control para corregir las variables que se pretenden manipular. Este trabajo también servirá para facilitar la selección de una plataforma adecuada para la implementación de proyectos de control en el Instituto, así como facilitar la utilización de los mismos.
6
Capítulo 4. Procedimiento y descripción de las actividades realizadas. A
continuación
se
dará
a
conocer
el
procedimiento y descripción de las actividades realizadas
en
el
proyecto
“Medición
adecuación de señales de control”.
7
y
PROCEDIMIENTO Y DESCRIPCIÓN DE LAS ACTIVIDADES ACTIVIDADES REALIZADAS REALIZADAS 4.1 Actividades realizadas. 4.1.1 Desarrollo de prototipo para medir señales eléctricas e léctricas de corriente y voltaje. En este proyecto se desarrolló un prototipo que puede medir señales eléctricas RMS (Root Mean Square) para aplicaciones de control de máquinas eléctricas. Este prototipo esta previsto para ser un módulo, que podrá ser conectado a otros dos módulos iguales para hacer mediciones de sistemas trifásicos, un módulo para cada fase. De igual manera podrá ser utilizado para medir monofásico de fase a neutro o de fase a fase.
4.1.2 Análisis de plataformas basadas en microcontrolador para aplicaciones de control. Se hizo un análisis de algunas plataformas utilizadas comúnmente en ingeniería para hacer proyectos de diversos tipos, encontrando su utilidad para aplicaciones de control, evaluando sus tipos de entradas y salidas, la cantidad de ellas, velocidad del controlador/procesador, su precio actual, entre otras características. Las plataformas que se analizaron fueron las siguientes:
Arduino MEGA 2560.
Arduino DUE.
Freescale FRDM-KL25Z.
ChipKIT Uno32
Raspberry Pi model B.
BeagleBone Black.
8
4.1.3 Verificación de funcionamiento en Simulink de las plataformas basadas en microcontrolador. Las plataformas basadas en microcontrolador van a ser utilizadas en conjunto con algún software en donde se puedan realizar algoritmos de control para sistemas externos y la mejor herramienta software para hacer esto, por su fácil manipulación y su amplia utilización alrededor del mundo en aplicaciones de control es Simulink que funciona sobre el entorno de programación Matlab. Por esto se verificará el funcionamiento de todas las plataformas con el software Simulink de ser posible.
4.2 Desarrollo de prototipo para medir señales eléctricas de corriente y voltaje. El principal objetivo del desarrollo de este prototipo es cumplir con ciertas características:
Medir voltajes entre 0 y 500 Volts RMS.
Medir corrientes entre 0 y 25 Amperes RMS.
Tener una entrada para conectar las terminales fase/neutro o fase/fase y una terminal para conectar la carga.
Tener una salida de voltaje voltaje RMS proporcional al voltaje de la la entrada.
Debe ser modular.
Estas características son para poder utilizar el prototipo en cualquiera de las situaciones que contemplen ese voltaje y corriente. El procedimiento a seguir para la realización del prototipo fue el siguiente:
Investigar qué sensores se utilizan utilizan para este tipo de de aplicaciones, cotizarlos y buscar proveedores. 9
Hacer la compra de los dos sensores.
Buscar una forma de adecuar las señales que otorgan los dos sensores.
Probar el prototipo en una tableta de pruebas.
Realizar el circuito impreso del prototipo procurando que sea modular.
Probar el prototipo en el circuito impreso para calibrarlo.
Comprobar linealidad de los sensores.
4.3 Análisis de plataformas basadas en microcontrolador para aplicaciones de control. En aplicaciones de control, las características más deseables de cualquier dispositivo son:
Modulación por Ancho de Pulso (PWM). La mayoría de las acciones de control se llevan a cabo con señales proporcionales como es el PWM.
Velocidad de procesamiento. Se necesita de velocidad de procesamiento para lograr tener un controlador lo suficientemente rápido para la aplicación que se desea.
Convertidor Analógico a Digital (ADC). Es muy importante que existan lazos de retroalimentación y la mejor manera leer las variables de retroalimentación es con un ADC, si el microcontrolador lo contiene, no habrá necesidad de adecuarle un ADC externo y así no habrá un costo extra.
Puertos de comunicación. De alguna manera el dispositivo debe ser capaz de enviar información; por ejemplo, a una computadora.
10
Todas estas características serán probadas en cada plataforma para verificar su buen funcionamiento, por lo que se debe encontrar la forma de programar cada plataforma y la forma en que se utilizan cada una de estas características antes mencionadas. Se analizará la máxima y mínima velocidad de operación de cada característica, la versatilidad que tiene con el usuario, la dificultad con la que se programa y su compatibilidad con el prototipo para medir señales eléctricas de corriente y voltaje.
4.4 Verificación de funcionamiento en Simulink de las plataformas basadas en microcontrolador. La mayoría de las plataformas utilizadas pueden ser usadas en conjunto con Simulink para la realización de proyectos y prácticas de control y así disminuir el tiempo de programación utilizando solamente diferentes librerías para las entradas y salidas, manteniendo el código del controlador igual. Simulink llama a estas librerías “Support Package” o paquetes de soporte para la
plataforma específica. De todas las plataformas utilizadas, solamente la ChipKIT Uno32 no tiene un paquete de soporte. Para verificar el funcionamiento se hicieron diferentes pruebas en dos modos de operación diferentes: External mode, y Deploy to hardware. Las pruebas que se realizaron son las siguientes:
Encontrar características de señales PWM.
Velocidad de procesamiento.
Encontrar características de lectura del ADC.
Encontrar características de los puertos de comunicación.
Las características que se intentaron encontrar fueron velocidad de operación, pines que se pueden controlar, tipo de comunicación entre otras cosas. 11
Capítulo 5. Resultados obtenidos. A continuación se describen los resultados obtenidos al finalizar el proyecto “Medición y
adecuación de señales para aplicaciones de control”.
12
RESULTADOS 5.1 Prototipo para medir señales eléctricas de corriente y voltaje. Los sensores utilizados para la medición son sensores de efecto Hall especiales, ya que tienen un lazo cerrado internamente que los hace responder con precisión y exactitud. Estos sensores solo se venden en tiendas en el extranjero, por lo que se cotizó en Newark con un costo de $74.87 dólares para el sensor de voltaje y de $27.04 dólares para el sensor de corriente.
5.1.1 Sensor de voltaje. El sensor de efecto Hall utilizado para medir voltaje es el LV25-P de LEM (Figura 1). El LV25-P es un sensor de voltaje de efecto Hall de lazo cerrado que trabaja con señales de C.D. y C.A. de hasta 500 Volts RMS. Este sensor tiene aislamiento galvánico entre el circuito primario (alto voltaje) y el secundario (electrónica) y un valor de conversión teórico de 2500:1000. Este necesita de una fuente de alimentación entre ±12V y ±15V. Además cuenta con una excelente precisión y muy buena linealidad. [1]
Figura 1. Sensor de efecto Hall para medir voltaje, LV25-P. El fabricante menciona que la conexión de este sensor se debe de hacer como se muestra en la Figura 2. [1]
13
Figura 2. Conexión del sensor LV25-P según el fabricante. Para obtener la óptima precisión del sensor debe de haber una corriente nominal en el primario (entre HT+ y HT-) de 10 mA, esto es con el voltaje nominal que se vaya a estar manejando. Por ejemplo, si el voltaje que se va a medir es de 250V nominal, R 1 debe ser R1 = 250V/10mA, que da como resultado una resistencia de 25KΩ. [1]
Para nuestro caso, se espera hacer mediciones trifásicas entre fase y neutro y entre fase y fase, suponiendo un voltaje nominal de 400 entre fase y fase, entonces R 1 = 400V/10mA = 40KΩ. El voltaje nominal es teórico, el voltaje de entrada puede ser desde 10 hasta 560 V RMS con este valor de R1. La resistencia RM es la resistencia de medición o de salida, R M puede ser de cualquier valor que se acomode más al proyecto, solo que la salida del sensor es de corriente que va desde 0 a 25mA para voltajes de 0 a 400 VRMS y se necesita la resistencia para obtener un equivalente en voltaje, así si la resistencia es de 100Ω se hará una conversión de 0 a 2.5V para
voltajes de 0 a 400 V RMS. Es importante saber que el sensor sirve prácticamente como un transformador de precisión, por lo que no hace conversiones de C.A. a C.D., por lo que se utilizó un rectificador de onda completa de precisión para poder medir la pequeña señal de voltaje que nos entrega el sensor. La Figura 3 muestra la configuración con amplificadores operacionales para lograr un rectificador de onda completa de precisión.
14
Figura 3. Rectificador de onda completa de precisión. El resultado que nos da el rectificador de onda completa de precisión nos servirá para obtener el promedio de esa señal haciéndola pasar por un filtro pasa bajas pasivo (Figura 4), este filtro debe tener una frecuencia de corte baja, menor a 5 Hz para lograr una señal de C.D. equivalente al promedio de la señal que entrega el rectificador.
Figura 4. Filtro pasa bajas pasivo (RC). Para lograr una frecuencia de corte menor a 5 Hz se utilizó una resistencia de 470Ω y un capacitor de 100µF, logrando una frecuencia de corte de
3.39Hz aproximadamente, esto es:
1 = 2 ∙ 1∙ ∙ = 2∙∙470Ω∙100 ≈3.39 Como la señal que se obtiene es un promedio en C.D. de la que entrega el sensor, lo que se obtiene es el valor RMS y no el valor “True RMS”. Por
último se le da una ganancia a la señal para calibrarla con respecto a los
15
niveles de voltaje que utilice el ADC con el que se medirá. Se supuso que el ADC aceptaba voltajes de entre 0 y 3.3V, por lo que se ajustó la ganancia para que al haber en la entrada entre 0 y 500 V RMS, a la salida hubiera entre 0 y 3.3V. El valor de ganancia se obtiene midiendo el valor RMS de la señal de entrada y midiendo la señal de salida en C.D., si a la entrada hay 127 V RMS, por ejemplo, el voltaje que debe resultar al calibrar es el siguiente:
) ∙ 127 = 0.8382 = 838.2 = (5003.3 El circuito utilizado para realizar la amplificación es el conocido Amplificador no inversor el cual se puede apreciar en la Figura 5.
= (1 + ) Figura 5. Configuración del amplificador no inversor. 5.1.2 Sensor de corriente. El sensor de efecto Hall utilizado para medir corriente es el CSNE151 de Honeywell (Figura 6). El CSNE151 es un sensor de efecto Hall de lazo cerrado que trabaja con señales de C.D. y C.A. de hasta 25 Amperes RMS. Este sensor tiene aislamiento galvánico entre el circuito primario (alto voltaje) y el secundario (electrónica) y un valor de conversión teórico de 1-23-4-5:1000. Este necesita de una fuente de alimentación entre ±12V y
16
±15V. Además cuenta con una excelente precisión y muy buena linealidad. [2]
Figura 6. Sensor de efecto Hall para medir corriente, CSNE151. El fabricante proporciona una tabla (Tabla 1) con las diferentes formas de conexión del sensor dependiendo de la escala que se vaya a utilizar. [3]
Tabla 1. Conexión del sensor CSNE151 según el fabricante. Inserción de Número de Corriente en el primario Corriente Resistencia Razón de nductancia en conversión Nominal (A) Máxima (A) nominal de del primario conversión el primario (mΩ) del primario salida (mA) (µH)
1
25
36
25
1/1000
0.3
0.023
2
12
18
24
2/1000
1.1
0.09
3
8
12
24
3/1000
2.5
0.21
4
6
9
24
4/1000
4.4
0.37
5
5
7
25
5/1000
6.3
0.58
Conexión recomendada
Debido a que la máxima medición de corriente debe de ser de hasta 25 amperes, se utilizó la primera configuración con una razón de conversión de 1/1000, así al haber 25 A RMS en la entrada, a la salida habrá 25 mA RMS. 17
Este sensor, al igual que el LV25-P, entrega una señal en alterna si la señal de entrada es alterna, por lo tanto, también necesita la misma configuración que el sensor de voltaje, así que se utilizó una resisten cia de 100 Ω para convertir la salida de corriente en voltaje. Teóricamente, con esta resistencia al haber entre -25 a 25 amperes en la entrada, a la salida habrá de -2.5 a 2.5V. También se le agregaron los mismos circuitos: el rectificador de onda completa de precisión, el filtro pasivo RC y el circuito de amplificación. La calibración se hizo de la misma manera que el sensor de voltaje, tomando en consideración que 25 A RMS corresponden a 3.3V de salida.
5.1.3 Realización de circuito impreso. El prototipo utiliza los sensores CSNE151 y LV25-P para corriente y voltaje respectivamente. La tarjeta es modular ya que pueden colocarse 3 de estos prototipos juntos e interconectarse solo con un cable de 3 pines (+12v, -12v y tierra), su dimensión es de 8 x 10 cm, la salida de los sensores esta calibrada a un valor mínimo de 0V y un máximo de 3.3V para medir de 0 a 500VRMS y de 0 a 25A RMS. El prototipo se muestra en la Figura 7, además muestra la posición de cada entrada y salida del dispositivo. Se trató de que la electrónica quedara separada de la fuente alterna, por esto en la parte superior del prototipo se encuentran las conexiones de corriente alterna y en la parte media e inferior se encuentran las conexiones de corriente directa.
18
Figura 7. Prototipo para medir señales eléctricas de corriente y voltaje. En la Figura 8 se ilustra el circuito impreso utilizado para el desarrollo del prototipo hecho en el software Eagle 5.9.0.
Figura 8. Circuito impreso del prototipo.
19
5.1.4 Comprobación de funcionalidad de los sensores. El método que se utilizó para medir la corriente fue utilizando dos multímetros, el módulo de medición y una resistencia variable. Se utilizó el arreglo de la Figura 9.
Figura 9. Circuito para comprobación de funcionalidad del sensor de corriente. Se fue disminuyendo la resistencia para aumentar la corriente RMS y así obtener a la salida del sensor un voltaje diferente, la relación de la corriente RMS con el voltaje de salida del sensor y el valor esperado del sensor se muestra en la Figura 10. El sensor fue calibrado para que entregue 0.132V para una corriente de 1A RMS, esperando que para 25ARMS el sensor entregue 3.3V. La gráfica de la Figura 10 nos permite observar que mientras el valor de corriente que se va a medir se aleja del valor al que se calibró el sensor (1ARMS), el error aumenta, este error aumenta un 2% aproximadamente por cada Ampere de diferencia.
20
Figura 10. Corriente RMS contra voltaje de salida (Sensor de corriente). Para el caso del sensor de voltaje se utilizó una fuente de AC variable, la cual arrojó la gráfica de la Figura 11.
Figura 11. Voltaje RMS contra voltaje de salida (Sensor de voltaje). El comportamiento de los dos sensores es casi lineal, por lo tanto pueden ser utilizados con una conversión directa en el microcontrolador, solo haciendo una multiplicación por un factor de 151.151 para el sensor de
21
voltaje y 0.132 para el sensor de corriente, sin aplicar ninguna fórmula de interpolación. Es notable que el sensor de voltaje es más lineal, pero esto se debe principalmente a que el sensor de corriente solamente se utilizó en un rango de 0 a 1.5ARMS porque no había equipo necesario para las pruebas, a diferencia del sensor de voltaje que se graficó casi todo el rango de operación. Es recomendable calibrar los sensores con el valor que se espera medir aproximadamente, ya que pueden existir errores porcentuales muy altos y se podrán disminuir considerablemente al calibrar nuevamente. Además, puede ser necesario cambiar la ganancia de la salida para algunas plataformas que utilizan un convertidor analógico a digital de diferente escala.
5.2 Análisis de plataformas basadas en microcontrolador para aplicaciones de control. 5.2.1 Arduino MEGA 2560. Arduino MEGA 2560 (Figura 12) es una tarjeta basada en microcontrolador con el CPU ATmega2560 de Atmel. Es una tarjeta con un microcontrolador de 8 bits, tiene 54 entradas/salidas digitales (de las cuales 15 pueden ser usadas como salidas PWM), 16 entradas analógicas de 10 bits, 4 UART (Universal Asynchronous Receiver/Transmitter), un reloj de 16MHz y una conexión USB por medio de un convertidor. Esta tarjeta funciona con voltajes de 5v. [4]
22
Figura 12. Tarjeta Arduino MEGA. Actualmente el precio de esta plataforma oscila entre los $300.00 y $350.00 pesos mexicanos. En la Figura 13 se muestra la composición de entradas y salidas de la tarjeta Arduino MEGA.
Figura 13. Entradas/salidas de Arduino MEGA. El ambiente de programación que se utilizó para esta plataforma es el IDE de Arduino v1.5.4. Este programa contiene un ambiente de programación, el compilador, un debuger, monitor serial y ejemplos.
23
5.2.1.1 Modulación por Ancho de Pulso.
Las características de la tarjeta mencionan que el Arduino MEGA tiene 15 salidas PWM, los pines asociados son: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 44, 45 y 46. Arduino MEGA tiene funciones predeterminadas para el uso de los módulos PWM, solamente se necesita escribir la función: [5] analogWrite(int pin, int value);
pin
Al pin que se le escribirá (2 … 13 o 44 … 46).
value El ciclo de trabajo del PWM entre 0 (siempre en bajo) y 255 (siempre en alto). El principal inconveniente de esta función es que no hay manera de modificar la frecuencia, ya que la librería que contiene esta función configura las salidas PWM para que trabajen a una frecuencia fija, de 490Hz para todos los pines, excepto para los pines 4 y 13 que tienen un frecuencia de 980Hz. Para poder modificar la frecuencia de los pines se deben cambiar los registros específicos que controlan el tiempo de esas señales. Estos PWM son controlados por Timers y el Arduino MEGA tiene 6 Timers (0 al 5). A continuación se nombran los Timers y los pines correspondientes al PWM que controlan: [5]
Timer 0. Controla los pines 4 y 13.
Timer 1. Controla los pines 11 y 12.
Timer 2. Controla los pines 9 y 10.
Timer 3. Controla los pines 2, 3 y 5.
Timer 4. Controla los pines 6, 7 y 8.
24
Timer 5. Controla los pines 44, 45 y 46.
Por lo tanto, cada Timer controla más de un solo pin, lo que limita mucho el uso de señales PWM. Además, el Timer 0 lo utiliza el compilador para hacer retardos en milisegundos, por lo que no se debería modificar si se usan este tipo de retardos. Los registros asociados a los Timer son llamados TCCRxA y TCCRxB (Timer/Counter Control Register A y B), donde x es el número del Timer. Estos registros contienen bits de control de los Timer, pero para modificar la frecuencia solo se utilizan los tres bits menos significativos, los cuales modifican el prescaler, a estos bits se les llama Clock Select (CS2, CS1 y CS0). Dependiendo de su valor, se modifica el prescaler. [6] Para el caso del Arduino MEGA, solo hay 8 diferentes frecuencias dependiendo del Prescaler que se le configure al Timer. Aun cuando se cambie la frecuencia del PWM, el ciclo de trabajo se mantiene igual. [7] El programa que se utilizó para probar el cambio de frecuencia fue el siguiente: void setup() { TCCR0B = (TCCR0B TCCR1B = (TCCR1B TCCR2B = (TCCR2B TCCR3B = (TCCR3B TCCR4B = (TCCR4B TCCR5B = (TCCR5B } void loop() { analogWrite(2, analogWrite(3, analogWrite(4, analogWrite(5,
& & & & & &
0xF8) 0xF8) 0xF8) 0xF8) 0xF8) 0xF8)
128); 128); 128); 128);
25
| | | | | |
0×01; 0×01; 0×01; 0×01; 0×01; 0×01;
analogWrite(6, 128); analogWrite(7, 128); analogWrite(8, 128); analogWrite(9, 128); analogWrite(10, 128); analogWrite(11, 128); analogWrite(12, 128); analogWrite(13, 128); analogWrite(44, 128); analogWrite(45, 128); analogWrite(46, 128); }
Con éste código se pudo verificar el cambio de frecuencias y se pudo obtener las frecuencias disponibles para cada entrada, como se muestra en la Tabla 2. [8]
Tabla 2. Frecuencia de la señal PWM dependiendo del Prescaler y pin.
Prescaler 0 1 2 3 4 5 6 7
Frecuencia en pines: 2, 3, 5, 6, 7, 8, 11, 12, 44, 45 y 46 0.000 Hz 31,250.000 Hz 3,906.250 Hz 488.281 Hz 122.070 Hz 30.518 Hz 0.000 Hz 0.000 Hz
Frecuencia en pines: 9 y 10 0.000 Hz 31,250.000 Hz 3,906.250 Hz 976.563 Hz 488.281 Hz 244.141 Hz 122.070 Hz 30.518 Hz
Frecuencia en pines: 4 y 13 0.000 Hz 62,500.000 Hz 7,812.500 Hz 976.563 Hz 244.141 Hz 61.035 Hz 0.000 Hz 0.000 Hz
Para cambiar la frecuencia solamente se modifica el valor que se le asigna a los registros, se hizo la prueba con los 8 valores de prescaler. En general, Arduino MEGA puede lograr hasta 10 frecuencias PWM con diferentes prescaler de los Timer. Es una desventaja que haya tan pocas frecuencias configurables, pero esto sucede debido a la baja velocidad del procesador y el uso de registros de tan solo 8 bits.
26
5.2.1.2 Velocidad de procesamiento.
Al utilizar un procesador de 8 bits para aplicaciones que utilizan número enteros de 32 bits o número flotante, todos los procesos son lentos y tienden a causar retrasos en las respuestas. Cada instrucción básica en este microcontrolador tarda 2 ciclos de reloj para ejecutarse en teoría y el reloj es de 16MHz, por lo que se logra ejecutar una instrucción cada 125 nanosegundos. Para probar la velocidad de procesamiento se realizará una prueba sencilla, se hará una suma, resta, multiplicación y división de una variable flotante a otra variable flotante y se medirá el tiempo que tarda en realizar esta acción. Para medir el tiempo que transcurre entre operaciones se utilizó el código siguiente: float A = 123456789; float B = 987654321; float C = 0; void setup() { pinMode(2, OUTPUT); } void loop() { C = A + B; C = A - B; C = A * B; C = A / B; digitalWrite(2, !digitalRead(2)); }
El resultado se obtuvo al medir el tiempo con el osciloscopio, esta plataforma duró 41.308 microsegundos (24.208kHz) en ejecutar este código.
27
5.2.1.3 Convertidor Analógico a Digital.
El microcontrolador de esta plataforma tiene integrado un ADC de 16 canales, por lo que es posible conectarle hasta 16 sensores analógicos. El ADC tiene una resolución de 10 bits (1024 valores diferentes) y es muy fácil de utilizar con el compilador. Los valores de voltaje que el convertidor acepta son de 0 a 5 Volts, por lo que los cambios de voltaje que puede detectar son de 4.883mV. La función que hace lectura del ADC en el ambiente de Arduino es la siguiente: int analogRead(int pin);
pin Puede ser cualquier pin de entrada analógica (A0 … A15). Esta función entrega un valor entero de 32 bits que va desde 0 a 1023, dependiendo de la lectura que se haya hecho del pin especificado del ADC. Para comprobar la velocidad a la que hace lecturas el ADC, se utilizó el programa que se describe a continuación: int A = 0; void setup() { pinMode(2, OUTPUT); } void loop() { A = analogRead(A0); digitalWrite(2, !digitalRead(2)); }
Este programa solamente lee la entrada analógica en un ciclo infinito, la lectura es la que causa el retraso, así podemos calcular un aproximado de lo que dura en hacer una lectura por el ADC el Arduino MEGA.
28
El resultado fue de 128.152 microsegundos (7.803kHz) para la lectura del ADC, es normal que la lectura no sea tan rápida debido a que el ADC utiliza un reloj diferente al de todo el sistema. 5.2.1.4 Puertos de comunicación.
El Arduino MEGA cuenta con una conexión USB para comunicación utilizando un convertidor UART a USB el cual sirve como programador y para enviar y recibir información tales como comandos, instrucciones o lecturas de entradas. También cuenta con otros tres puertos UART y dos puertos I 2C para comunicación con otros dispositivos. Como el método más sencillo para comunicar con una computadora actualmente es por medio del cable USB, se utilizó el puerto USB que tiene integrado la tarjeta para realizar la comunicación, este utiliza un cable tipo A macho en una punta y tipo B macho en la otra. Este puerto UART esta compartido con los pines 0 y 1 de la tarjeta. Los puertos están dispuestos de la siguiente manera en la plataforma: UART0 Pin 1 para Tx y 0 para Rx.
UART1 Pin 18 para Tx y 19 para Rx.
UART2 Pin 16 para Tx y 17 para Rx.
UART3 Pin 14 para Tx y 15 para Rx.
Según el datasheet de este microcontrolador, al haber comunicaciones más rápidas que 1,000,000 baudios para un oscilador de 16MHz, existe mucho porcentaje de error en la transferencia, por lo tanto, se recomienda utilizar la velocidad de transferencia de 1Mbps. Antes de utilizar el puerto serial se debe de inicializar con algún Baud Rate, este se inicializa utilizando la función: 29
Serial.begin(int BaudRate);
BaudRate Es la velocidad de transmisión, o bits por segundo. Así se declara el objeto Serial con una velocidad de BaudRate bits por segundo. Cada puerto serial tiene predeterminado una función que sirve en caso de interrupción por llegada de dato serial al puerto, para el puerto USB se llama a la función serialEvent( ). Dentro de esta función es común utilizar el método available( ) del objeto Serial, así se asegura de que al entrar al evento ejecute el código, solamente cuando haya al menos un dato disponible en el buffer de lectura del puerto. Para capturar el dato serial que llegó al puerto en una estructura FIFO (First In, First Out) se utiliza la función: char Serial.read( );
El dato que entrega es tipo carácter, equivalente a un byte. Para enviar un dato serial se utiliza la función: Serial.write(char C);
C Es el dato que se va a enviar en tipo carácter o byte. El código utilizado para probar el puerto serial es el que se muestra a continuación: byte A = 0x00; void setup() { Serial.begin(1000000); } void loop() { } 30
void serialEvent() { while (Serial.available()) { A = (byte)Serial.read(); Serial.write(A); } }
El resultado fue satisfactorio, comprobando que solo se necesitan estas funciones para hacer captura y envío de información hacia algún ordenador. Además se comprueba que Arduino MEGA soporta velocidades de transmisión de hasta 1Mpbs
5.2.2 Arduino DUE. Arduino DUE (Figura 14) es una tarjeta basada en microcontrolador con el CPU SAM3X8E ARM Cortex-M3 de Atmel. Es una tarjeta con un microcontrolador de 32 bits, tiene 54 entradas/salidas digitales (de las cuales 12 pueden ser usadas como salidas PWM), 12 entradas analógicas, 4 UARTs, un reloj de 84MHz, un USB OTG, 2 DAC, entre otras características. Esta tarjeta funciona con voltajes de 3.3v, a diferencia de las otras versiones de Arduino que trabajaban con 5v. [10]
Figura 14. Tarjeta Arduino DUE. Esta plataforma cuesta alrededor de $800.00 pesos mexicanos. En la Figura 15 se muestra la composición de entradas y salidas de la tarjeta Arduino DUE.
31
Figura 15. Entradas/salidas de Arduino DUE. Las pruebas que se realizaron a esta plataforma se hicieron en el IDE de Arduino v1.5.4. 5.2.2.1 Modulación por Ancho de Pulso.
Arduino DUE tiene 12 salidas PWM para ser utilizadas fácilmente con una función del IDE de Arduino, aunque no es posible modificar la frecuencia de operación con esta instrucción, por lo que se necesita de alguna librería que sirva para configurar las salidas PWM específicas del microcontrolador. Esta función es: [5] analogWrite(int pin, int value);
pin Al pin que s e le escribirá (2 … 13 o 44 … 46).
32
value
El ciclo de trabajo del PWM entre 0 (siempre en bajo) y 255 (siempre en alto).
Al igual que el Arduino MEGA, esta función solo modifica el ciclo de trabajo de la señal PWM, pero no cambia la frecuencia. Por lo tanto, también se deben modificar los registros para cambiar estas variables. El Arduino DUE puede utilizar una resolución de hasta 16 bits con la función: [9] analogWriteResolution (int Resolution)
Resolution Bits de resolución del ciclo de trabajo (1 a 16). El microcontrolador SAM3X8E soporta un total de 8 salidas PWM (las otras 4 que menciona Arduino las realiza por software), pero de estas solamente 4 pueden ser utilizadas sin afectar otros periféricos de la tarjeta. Los pines de la tarjeta que pueden ser utilizados como PWM son el 6, 7, 8 y 9. Las 4 señales PWM trabajan con ciclos de trabajo de 8 bits de 0 a 255 (0% a 100%) y la frecuencia sí es modificable. La solución que se encontró para modificar la frecuencia fue una librería de Randomvibe en la web dentro de los foros de Arduino llamada “pwm01.h” en la que contempla 4 funciones. [11] 1) void pwm_set_resolution( int Res);
Con ésta función se i ndica qué resolución “res” en número de bits que utilizará el PWM, pero en realidad el PWM solo trabaja entre valores de 0 a 255 (8 bits), por lo que solo realizará un corrimiento de bits para cambiar de un valor de bits más alto a uno más bajo, o agregará ceros si la resolución seleccionada es más pequeña que 8.
33
2) void pwm_setup(uint32_t pwm_pin, uint32_t pwm_freq, int iclock);
La función pwm_setup sirve para configurar la señal PWM, donde pwm_pin es el pin donde estará la señal PWM (solo pueden ser los pines 6 al 9). La entrada pwm_freq es la frecuencia a la que queremos que trabaje esa señal PWM y puede variar entre 5.007Hz hasta 328.125kHz, mientras más alta sea la frecuencia los cambios de frecuencia son menos precisos, además, si el valor de frecuencia no se puede mostrar, por sí sola la función genera el PWM con el valor de frecuencia más cercano. La entrada iclock de la función puede tomar valores de 1 o 2, esta indica qué reloj se va a utilizar para esa señal. Los 4 PWM dependen de uno de dos relojes, ya sea todos de uno mismo, o dos de uno y dos de otro o uno de uno y tres de otro, así si se configura el PWM del pin 6 con la frecuencia de 1kHz con el reloj 1 y posteriormente se usa la misma función para el PWM del pin 7 con la frecuencia de 1.2kHz en el reloj 1, tanto el PWM del pin 6 como el 7 cambiarán su frecuencia a 1.2kHz. Si se utilizara diferente reloj para cada uno sí podrían trabajar a diferente frecuencia. 3) void
pwm_write_duty(uint32_t
pwm_pin,
uint32_t
pwm_duty);
Esta función sirve para escribir el valor de ciclo de trabajo según la resolución que se haya escogido en la función pwm_resolution (el valor predeterminado es de 8 bits) desde 0% hasta 100% con 256 escalones de aproximadamente 0.39%. El valor pwm_pin es el pin
34
del 6 al 9 para hacer referencia y pwm_duty es el valor de ciclo de trabajo que se le quiere asignar de 0 a 255. 4) void pwm_stop(uint32_t pwm_pin);
La función pwm_stop sirve para desactivar la salida de PWM abruptamente, intenta que el pin se convierta en una salida digital normal y le coloca un valor de 0. El inconveniente es que al forzar la salida a cambiar de PWM a salida digital, hay un impulso indeseable. Para evitar este problema, primero se debe usar la función pwm_write_duty, poner un ciclo de trabajo de 0 y después mandar a detener la señal PWM. Las frecuencias que se pueden lograr con esta librería se pueden calcular con la siguiente fórmula:
= á +1 La frecuencia máxima es de 328,125Hz y el contador puede ser cualquier valor entre 0 y 65,535 (2 16). Si se utiliza un valor de frecuencia menor de 5 Hz, el PWM no funciona. El código utilizado para probar las señales PWM es el mostrado a continuación: #include "pwm01.h" uint16_t i = 10; void setup() { pwm_set_resolution(8); pwm_setup(6, 10, 1); pwm_write_duty(6, 128); pwm_setup(7, 10, 1); pwm_write_duty(7, 128); pwm_setup(8, 10, 2); pwm_write_duty(8, 128); 35
pwm_setup(9, 10, 2); pwm_write_duty(9, 128); } void loop() { if (i < 65535) { i++; pwm_setup(6, i, 1); pwm_write_duty(6, 128); pwm_setup(8, i, 2); pwm_write_duty(8, 128); delay(1); } else { pwm_write_duty(6, 0); pwm_stop(6); pwm_write_duty(7, 0); pwm_stop(7); pwm_write_duty(8, 0); pwm_stop(8); pwm_write_duty(9, 0); pwm_stop(9); delay(1000); } }
El código inicializa los 4 PWM con un ciclo de trabajo de 50%. Posteriormente en un ciclo se cambia la frecuencia desde 10 hasta 2 12, hasta que llega al máximo valor, para posteriormente detenerlos. El resultado fue lo esperado, los cuatro pines cambiaron su frecuencia y se detuvieron correctamente. Solo hay que considerar que al utilizar la función pwm_setup( ) a algún pin, inmediatamente se debe utilizar la función pwm_write_duty( ) para que la señal no deje de reproducirse. Después de los valores de frecuencia arriba de 20KHz, los escalones de frecuencia son demasiado altos.
36
5.2.2.2 Velocidad de procesamiento.
La tarjeta Arduino DUE tiene un reloj de 84MHz y su ciclo de trabajo es de aproximadamente 23.8 nanosegundos, que es más de 5 veces que la plataforma Arduino MEGA. Otra característica notoria en comparación con el Arduino MEGA, es que maneja datos de 32 bits, por lo que operaciones entre enteros de 32 bits se realizan rápidamente. Además, el microcontrolador incluye un multiplicador de 32 bits x 32 bits, lo que permite que las operaciones de multiplicación y división entre números enteros sean más rápidas. Para probar la velocidad de procesamiento se realizó el mismo procedimiento que las demás plataformas. El código que se utilizó es el siguiente: float A = 123456789; float B = 987654321; float C = 0; boolean i = 0; void setup() { pinMode(2, OUTPUT); } void loop() { C = A + B; C = A - B; C = A * B; C = A / B; i = !i; digitalWrite(2, i); }
El resultado se obtuvo al medir el tiempo con el osciloscopio, esta plataforma duró 5.75 microsegundos (173.91kHz) en ejecutar este código, lo que quiere decir que es hasta 7 veces más rápido que Arduino MEGA.
37
5.2.2.3 Convertidor Analógico a Digital.
La tarjeta Arduino DUE contiene hasta 12 entradas con convertidor analógico a digital (A0 … A11), estas entradas tienen una resolución de 12
bits (4096 valores diferentes). Acepta valores analógicos entre 0 y 3.3V, lo que significa que tiene escalones de voltaje de 805µV aproximadamente y no es posible modificar la referencia de los valores de entrada analógicos. Este microcontrolador también tiene 2 convertidores de digital a analógico (DAC) pero son muy problemáticos, principalmente porque tienen un offset en la salida de aproximadamente 2 volts, por lo que la salida varia de 2 a 3.3V, provocando que se tenga que colocar un circuito externo que elimine el offset y amplifique la señal. Este DAC tiene una resolución de 12 bits. Para hacer lecturas del ADC se utiliza la función: int analogRead(int pin);
pin Puede ser cualquier pin de entrada analógica (A0 … A11). Esta función entrega un valor entero de 32 bits que va desde 0 a 1023, dependiendo de la lectura que se haya hecho del pin especificado del ADC. Como Arduino DUE soporta lecturas de 12 bits del ADC y la función analogRead( ) entrega lecturas de 10 bits, existe una función especial para modificar la resolución de la lectura analógica, esta función es: int analogReadResolution (int bits);
bits Determina la resolución en bits de el valor que retorna la función analogRead( ) Para comprobar la velocidad a la que hace lecturas el ADC, se utilizó el programa que se visualiza a continuación:
38
int A = 0; void setup() { pinMode(2, OUTPUT); analogReadResolution (12); } void loop() { A = analogRead(A0); digitalWrite(2, !digitalRead(2)); }
Este programa solamente lee la entrada analógica en un ciclo infinito, la lectura es la que causa el retraso, así podemos calcular un aproximado de lo que dura en hacer una lectura por el ADC el Arduino DUE. El resultado fue de 44.408 microsegundos (22.518kHz) para la lectura del ADC, esto es 1865 ciclos de instrucción. Es normal que la lectura no sea tan rápida debido a que el ADC utiliza un reloj diferente al de todo el sistema. 5.2.2.4 Puertos de comunicación.
La tarjeta Arduino DUE soporta: un puerto para comunicación USB 2.0 (puerto nativo), cinco UART (cuatro normales y uno con convertidor a USB para programar), dos I2C y un CAN. El puerto más veloz para comunicación con la computadora es el puerto nativo USB, ya que contiene hardware específico con una estructura FIFO de 4 kilobytes y acceso directo a la memoria del microcontrolador. Además, el puerto nativo ya cuenta con una entrada micro USB tipo hembra en la tarjeta. La velocidad de transmisión depende en su mayoría de la computadora que recibe la información y normalmente es de 1Mbps. Para utilizar el puerto nativo USB las funciones varían un poco. Para inicializar el puerto serie USB nativo se utiliza: SerialUSB.begin(int BaudRate);
39
BaudRate Es la velocidad de transmisión, o bits por segundo. Así se declara el objeto SerialUSB con una velocidad de BaudRate bits por segundo. Este puerto no tiene una interrupción por haber llegado información al puerto USB, por lo que es necesario realizar una función que puede ser llamada serialEventUSB( ), en la cual se utiliza el método available( ) del objeto SerialUSB, así se asegura que al entrar a la función sólo se ejecute el código cuando haya un dato disponible en el buffer de la estructura FIFO. Para capturar el dato serial que llegó al puerto se utiliza la función: char SerialUSB.read read( ( );
El dato que entrega es tipo carácter, equivalente a un byte. Normalmente se utiliza esta función para recibir información debido a que es la más rápida de interpretar. Para enviar un dato serial se utiliza la función: SerialUSB.write write( (char char C); C);
C Es el dato que se va a enviar en tipo carácter o byte. El código utilizado para probar el puerto serial es el que se muestra a continuación: byte A = 0x67; byte A void setup() { begin(1000000); (1000000); SerialUSB.begin } void loop() { // código para la aplicación serialEventUSB(); } void serialEventUSB() void serialEventUSB() {
40
while (SerialUSB.available while ( available()) ()) { A = (byte (byte) )SerialUSB.read read(); (); write(A); (A); SerialUSB.write } }
El resultado fue satisfactorio, comprobando que solo se necesitan estas funciones para hacer captura y envío de información hacia algún ordenador. Como utiliza un protocolo USB y lo convierte a datos seriales, no es necesario utilizar una velocidad de transmisión específica, en realidad, el controlador hace que la tarjeta se ajuste a la velocidad que esta capturando la computadora, por lo que aunque se configure el puerto serial del Arduino a 1Mbps y la computadora a 9600bps, podrán comunicarse.
5.2.3 Freescale FRDM-KL25Z. La tarjeta FRDM-KL25Z (Figura 16) es una plataforma de desarrollo de ultra bajo costo para la serie Kinetis L de Freescale construida con un procesador ARM Cortex-M0. Contiene un microcontrolador de 32 bits, tiene 53 Entradas/salidas digitales (de las cuales 24 pueden ser usadas como salidas PWM). Contiene solo 6 entradas analógicas de 16 bits cada una, 3 UARTs, un reloj de 48MHz, un puerto USB OTG, un DAC, entre otras características. Esta tarjeta funciona con voltajes de 3.3v. [12]
Figura 16. Tarjeta FRDM-KL25Z.
41
En la Figura 17 se muestra la composición de entradas y salidas de la tarjeta FRDM-KL25Z.
Figura 17. Entradas/salidas de la tarjeta FRDM-KL25Z. El ambiente de programación utilizado para probar esta tarjeta fue MBED, que es un compilador en línea. Esta plataforma de programación es más parecida a un lenguaje orientado a objetos, por lo que en ocasiones se declaran objetos de clases específicas que se encuentran en las librerías. Ninguna de las librerías que se utilizan se hicieron por terceros, todas vienen contenidas en la página de MBED. [13] El precio de esta tarjeta es de aproximadamente $400.00 pesos mexicanos. 5.2.3.1 Modulación por Ancho de Pulso.
La tarjeta FRDM-KL25Z tiene hasta 24 salidas PWM que se comparten con otros periféricos, se puede modificar el ciclo de trabajo entre 0 y 1 (0% a
42
100%) y se puede modificar el periodo de la señal PWM en microsegundos (valor entero), en milisegundos (valor entero) y en segundos (valor flotante). Los pines que controlan el PWM se muestran en la figura 12 de color morado. De todos ellos, solamente 11 pines son solamente para PWM y entrada/salida digital. Las librerías de MBED para configurar y modificar las señales PWM son métodos para la clase “PwmOut” de objetos PWM, por lo que se necesita
declarar cada pin PWM como un objeto de la siguiente manera: PwmOut Nombre_Señal(PinName pin);
pin El pin que será la salida PWM. Nombre_Señal Allí se escribe el nombre de la señal PWM. Esta clase de objetos tiene ocho métodos que pueden ser usados para modificar parámetros de la señal PWM: 1) void write(float value); Coloca el ciclo de trabajo de la salida, especificado como un porcentaje de 0 a 1 (0% a 100%). 2) float read( ); Regresa la configuración del ciclo de trabajo de la salida, especificado como un porcentaje de 0 a 1 (0% a 100%). 3) void period(float seconds); Coloca el periodo de la señal PWM, especificado en segundos (float), manteniendo el ciclo de trabajo. 4) void period_ms(int miliseconds); Coloca el periodo de la señal PWM, especificado en milisegundos (int), manteniendo el ciclo de trabajo.
43
5) void period_us(int microseconds); Coloca el periodo de la señal PWM, especificado en microsegundos (int), manteniendo el ciclo de trabajo. 6) void pulsewidth(float seconds); Coloca el ancho de pulso del PWM, especificado en segundos (float), manteniendo el periodo. 7) void pulsewidth_ms(int miliseconds); Coloca el ancho de pulso del PWM, especificado en milisegundos (int), manteniendo el periodo. 8) void pulsewidth_us(int microseconds); Coloca el ancho de pulso del PWM, especificado en microsegundos (int), manteniendo el periodo. La configuración de las señales PWM a nivel hardware no es posible utilizando este método de programación (MBED), por esto se hace uso solo de las librerías disponibles. Para todo lo relacionado a las señales PWM se debe utilizar esta librería de la clase PwmOut. Para probar esta librería se utilizó el siguiente programa: #include "mbed.h" PwmOut PWM_D4(PTD4); PwmOut PWM_A12(PTA12); PwmOut PWM_A4(PTA4); float i = 0; int main() { PWM_D4.write(0.5); PWM_A12.write(0.5); PWM_A4.write(0.5); while(1) { wait(1); i = i + 0.001; if (i < 1) { PWM_D4.period(1); PWM_D4.write(0.5); PWM_A12.period(1 - i);
44
PWM_A12.write(0.5); PWM_A4.period(i); PWM_A4.write(0.5); } else i = 0; } }
El programa primeramente configura como salida PWM a los pines PTD4, PTA12 y PTA4, les indica que el ciclo de trabajo es de 50% y después se queda ejecutando un ciclo infinito, el cual cada segundo cambiará el periodo de la señal PWM, con diferentes funciones para cada pin. Con este programa se pudo comprobar el funcionamiento de los módulos PWM, además que se encontró que la frecuencia de operación máxima de las señales PWM es de 62.5kHz (16 µSeg), pero el ciclo de trabajo solo tiene una resolución de 1 bit, por lo que empíricamente se encontró una frecuencia estable, estando aproximadamente a los 20kHz. Al modificar la frecuencia de las salidas PWM se modifica algún registro de un Timer, el cual hace que las demás salidas PWM sufran algunos problemas. Como recomendación deberían de utilizar la misma frecuencia para todas las salidas PWM y debería de ser entre el rango de 1Hz a 20kHz. 5.2.3.2 Velocidad de procesamiento.
La tarjeta FRDM-KL25Z usa un reloj de 48 MHz y cada ciclo de instrucción en el microcontrolador es de 41.7 nanosegundos. Esta tarjeta maneja datos de 32 bits enteros al igual que Arduino DUE. También cuenta con un multiplicador integrado a su CPU, por lo que los cálculos entre números enteros son más rápidos.
45
El programa para evaluar su velocidad es similar a los utilizados en plataformas anteriores, solo con algunas diferencias de código debidas a que se utiliza un compilador diferente. El programa es el siguiente: #include "mbed.h" DigitalOut Salida(PTD4); float A = 123456789; float B = 987654321; float C = 0; int main() { while(1) { C = A + B; C = A - B; C = A * B; C = A / B; Salida = !Salida; } }
El tiempo que tardó en ejecutar las cuatro operaciones entre números flotantes fue de 3.4175 microsegundos (293.61kHz). Este resultado era de esperarse debido al multiplicador integrado que contiene esta plataforma y el procesador de 32 bits. 5.2.3.3 Convertidor Analógico a Digital.
El convertidor analógico a digital de la tarjeta FRDM-KL25Z tiene una resolución de 16 bits (65536 valores diferentes) y rangos de voltaje de 0 a 3.3V, lo que resulta en escalones de 50.35µV. Lamentablemente solo cuenta con 6 entradas analógicas lo que limita a la tarjeta a manejar pocos sensores por sí sola. También cuenta con un convertidor digital a analógico (DAC) de 12 bits en caso de ser necesario en el pin PTE30. Para hacer lectura de los puertos analógicos en MBED se necesita crear un objeto de la clase AnalogIn de la siguiente manera:
46
AnalogIn Nombre_Señal(PinName pin);
pin El pin que será la entrada analógica (A0 … A5). Nombre_Señal Allí se escribe el nombre de la señal del ADC. Esta clase de objetos tiene dos métodos que pueden ser usados para hacer lectura de la entrada analógica: 1) float read( ); Lee el voltaje de entrada, representado como un flotante en el rango de 0 a 1. 2) unsigned short read_u16( ); Lee el voltaje de entrada, representado como un entero de 16 bits sin signo (unsigned short) en el rango de 0x0000 a 0xFFFF. Para probar la velocidad que puede alcanzar el ADC que tiene integrado la tarjeta, se utilizó el programa siguiente: #include "mbed.h" AnalogIn AnalogInput(A0); DigitalOut Salida(PTD4); int A = 0; int main() { while(1) { A = AnalogInput.read(); Salida = !Salida; } }
El tiempo que transcurrió para tomar una lectura del ADC en la entrada analógica A0 fue de aproximadamente 36.248 microsegundos (27.588kHz). 5.2.3.4 Puertos de comunicación.
La tarjeta FRDM-KL25Z soporta comunicación USB por medio de un convertidor UART a USB, un puerto USB OTG, tiene tres módulos UART y
47
dos módulos I2C. El programa MBED soporta todos estos protocolos de comunicación. La tarjeta contiene dos puertos mini-USB, según la Figura 11, el de la parte inferior es el que se usa como “OpenSDA” (Open-standard Serial and
Debug Adapter) que es para programar la tarjeta y el de la parte superior es el utilizado para comunicación serial con el exterior como USB OTG. Este segundo puede ser usado como CDC (Communications Device Class) para hacer transferencia rápida de información. El puerto más veloz de la tarjeta FRDM-KL25Z es el USB OTG, ya que puede ser utilizado como CDC. Para utilizar esta característica se debe utilizar la librería “USBSerial.h” que proporciona MBED, con esta librería se
pueden crear objetos de la clase USBSerial que sirven para utilizar la comunicación serial por USB, emulando un puerto serie llamado “Mbed Virtual Serial Port (COM?)”. Para poder detectar este dispositivo se necesita
un driver que proporciona MBED con extensión .inf de la página http://developer.mbed.org/handbook/USBSerial,
se
selecciona
el
link
“archive”. En esa misma página aparecen los pasos a seguir para instalar el
driver. Este tipo de comunicación no soporta interrupción por llegada de dato al puerto USB, por lo que hay que declarar una función que pregunte si hay información disponible en el puerto con el método available( ). Para hacer lectura de un byte se utiliza el método getc( ) y para escribir un byte se utiliza putc( ). El puerto USB puede soportar comunicaciones a una velocidad mayor que 1Mbps, pero debido al retraso en la captura de información de las computadoras, se utiliza el 1Mbps como valor máximo de velocidad de transmisión. Para probar la comunicación a esta velocidad se utilizó el siguiente programa hecho en MBED: 48
#include "mbed.h" #include "USBSerial.h" void SerialEventUSB(); USBSerial SerialUSB; int main(void) { while(1) { SerialEventUSB(); } } void SerialEventUSB() { if(SerialUSB.available()){ SerialUSB.putc(SerialUSB.getc()); } }
Se pudo comprobar que con estas pocas instrucciones se puede hacer uso eficazmente del módulo USB OTG que tiene la plataforma FRDM-KL25Z. Al ser un USB integrado al microcontrolador, la velocidad de transmisión es prácticamente irrelevante, la tarjeta y la computadora pueden tener diferentes velocidades de transmisión y aún así habrá comunicación.
5.2.4 ChipKIT Uno32 La tarjeta ChipKIT Uno32 (Figura 18) está basada en el hardware de Arduino, pero con un microcontrontrolador de Microchip PIC32.
Figura 18. Tarjeta ChipKIT Uno32.
49
ChipKIT
Uno32
contiene
un
microcontrolador
de
Microchip
PIC32MX320F128H, utiliza un reloj de 80MHz, 42 entradas/salidas digitales, 12 entradas analógicas, 5 salidas PWM, comunicación USB como Arduino, entre otras características. Esta plataforma trabaja con voltajes de 3.3V. [14] El ambiente de programación es compatible con Arduino, es decir, los programas hechos en Arduino son fácilmente transportados a ChipKIT Uno32. El software utilizado para la programación de esta plataforma es llamado MP-IDE v0023 y utiliza las mismas librerías predeterminadas de Arduino, adecuadas a las plataformas de ChipKIT. En la Figura 19 se muestra la composición de entradas y salidas de la tarjeta ChipKIT Uno32.
Figura 19. Entradas/salidas de la tarjeta ChipKIT Uno32. El precio aproximado de esta plataforma en México es de $800.00 pesos.
50
5.2.4.1 Modulación por Ancho de Pulso.
Esta plataforma puede generar hasta 5 señales PWM. Las librerías del compilador permiten utilizar las 5 salidas con una frecuencia de aproximadamente 500Hz sin posibilidad de modificar la frecuencia y un ciclo de trabajo de 0 a 255 (0% a 100%). [14] Si se utilizan directamente las direcciones de memoria que controlan las señales PWM, se puede modificar tanto la frecuencia como el ciclo de trabajo en diferentes proporciones. Estas características de las señales PWM no pueden ser alcanzadas con solamente utilizar la función analogWrite( ), al igual que en las plataformas Arduino, por lo que es necesario modificar directamente los registros asociados a las señales PWM. Los registros asociados a las señales PWM son registros llamados Output Compare (OC, comparador de salida) y dependen de algún temporizador que se le configure. Lo primero que se debe realizar para generar señales PWM es configurar el Timer asociado a estas salidas, se puede escoger cualquier Timer del 2 al 5 (existen 5 Timer, del 1 al 5), el Timer 1 no se utiliza normalmente porque es el encargado de hacer interrupciones cada milisegundo para los retrasos (delay). [15] El código siguiente incluye la configuración del Timer2: T2CONCLR = T2_ON; T2CON = T2_PS_1_8; TMR2 = 0; PR2 = 4096; T2CONSET = T2_ON;
En este código primero se modifica el registro TxCON (x es el número del Timer), colocando en él, el valor de Tx_ON, que es para habilitar el registro que detiene al Timer. A continuación se coloca el prescaler que queremos 51
del Timer, la frecuencia base es 80MHz y si utilizamos un prescaler de 8 la nueva frecuencia será 10MHz, el prescaler es como un divisor de frecuencia y sus valores pueden ser 1, 2, 4, 8, 16, 32, 64, 128 y 256. Para colocar el prescaler deseado solo se cambia el valor al que se iguala TxCON usando Tx_PS_1_P, donde P es el valor del prescaler. La siguiente instrucción reinicia el contador del Timer, poniéndolo a 0. Después se le da un valor al registro PRx entre 0 y 65535, que se utiliza para colocar el periodo de la señal PWM, dependiendo de este valor y la frecuencia del Timer, se puede conocer la frecuencia que tendrá la señal PWM, para este caso, con un prescaler de 8 logramos una frecuencia de 10MHz, y con un PRx de 4096 se logra una frecuencia de (80MHz*P)/PRx = 2.44kHz. Como se puede observar, la resolución del ciclo de trabajo para esta configuración es de 12 bits (4096 valores diferentes). Por último solo se vuelve a activar el Timer utilizando el registro TxCONSET y asignándole el valor de Tx_ON. A continuación se debe habilitar el OC, existen 5 de estos (1 al 5) y pueden ser utilizados con el Timer que se desee. Ahora se describirá el código que se debe implementar para habilitar el OC1: OC1R = 2048; OC1RS = 2048; OC1CON = OC_TIMER2_SRC | OC_PWM_FAULT_PIN_DISABLE; OC1CONSET = OC_ON;
La primera instrucción es para cargar el valor inicial dentro del registro (OCxR) del ciclo de trabajo. La segunda instrucción carga al registro OCxRS el valor que tomará OCxR cuando termine un periodo de la señal PWM. La tercer instrucción modifica el registro OCxCON e indica qué Timer se utilizará para ese OC y deshabilita la opción “Protección por Falla” (Fault
Protection) debido a que no es necesaria para la mayoría de las aplicaciones. En la última instrucción solamente se habilita el OC.
52
Las señales PWM en este microcontrolador funcionan de la siguiente manera: el OC pone en alto el pin cuando el Timer se reinicia, ahora el Timer cuenta hacia arriba desde 0. El OC pone en bajo el pin cuando el valor en el Timer concuerda con el valor en el registro OCxR, el Timer sigue contando hasta que el contador concuerda con el valor del registro del periodo (PRx). Ahora el Timer se reinicia y todo comienza de nuevo. Para poder modificar el ciclo de trabajo solamente se debe modificar el registro OCxRS y para cambiar la frecuencia de operación, se debe volver a configurar el Timer con los registros TxCON y PRx. Los registros que se utilizaron necesitan estar definidos para poderse utilizar y estos se encuentran en dos librerías: outcompare.h y timer.h, estas se encuentran al hacer una búsqueda de archivos dentro de la carpeta del programa “C:\ …\mpide-0023-windows-20140821\hardware\pic32 ”, estas se
hacen una copia y se guardan junto con el archivo .pde que genera MP-IDE del sketch que estemos haciendo, posteriormente en el programa se incluyen estas librerías. [15] El programa utilizado para probar las señales PWM es el siguiente: #include #include void setup() { T2CONCLR = T2_ON; T2CON = T2_PS_1_8; TMR2 = 0; PR2 = 4096; T2CONSET = T2_ON; OC1R = 682; OC2R = 1365; OC3R = 2048; OC4R = 2730; OC5R = 3413; OC1RS = 682; OC2RS = 1365; OC3RS = 2048; OC4RS = 2730; OC5RS = 3413; OC1CON = OC_TIMER2_SRC | OC_PWM_FAULT_PIN_DISABLE; OC2CON = OC_TIMER2_SRC | OC_PWM_FAULT_PIN_DISABLE; OC3CON = OC_TIMER2_SRC | OC_PWM_FAULT_PIN_DISABLE; OC4CON = OC_TIMER2_SRC | OC_PWM_FAULT_PIN_DISABLE;
53
OC5CON = OC_TIMER2_SRC | OC_PWM_FAULT_PIN_DISABLE; OC1CONSET = OC_ON; OC2CONSET = OC_ON; OC3CONSET = OC_ON; OC4CONSET = OC_ON; OC5CONSET = OC_ON; } void loop() { if (OC1RS == 257) OC1RS = 0; OC1RS++; delay(10); }
Este programa fue cambiando de parámetros para comprobar el funcionamiento de las 5 señales PWM. Se consideró que es mejor utilizar funciones para cambiar los parámetros debido a la complejidad del manejo de registros, aunque no fueron realizadas para este trabajo. Se puede lograr hasta una frecuencia de 312.5kHz con 8 bits de resolución para el ciclo de trabajo y una resolución máxima de 16 bits para una frecuencia máxima de 1.22kHz. La frecuencia mínima alcanzable con 16 bits de resolución es 4.77Hz. Se pueden generar en total 5 modulos PWM con diferentes frecuencias de operación cada uno y con diferente resolución del ciclo de trabajo. En esta plataforma se tiene un control más preciso de las señales PWM, a diferencia de las anteriores plataformas. 5.2.4.2 Velocidad de procesamiento.
La tarjeta ChipKIT Uno32 utiliza un reloj de 80MHz y el ciclo de trabajo de cada instrucción en el microcontrolador es de 25 nanosegundos. Además el microcontrolador PIC32 que tiene la tarjeta es de 32 bits, lo que acelera procesos al utilizar tipos de datos de 32 bits. Este microcontrolador tiene integrado en el CPU un multiplicador de 32x16 bits, así puede lograr multiplicaciones de números enteros de 32x32 bits en 54
tan solo 3 ciclos de reloj y divisiones de 32x32 bits en 33 ciclos de reloj. Esta característica acelera mucho el cálculo para acciones de control. Para probar su velocidad se utiliza también un programa similar a los utilizados en las otras plataformas, éste se muestra a continuación: float A = 123456789; float B = 987654321; float C = 0; void setup() { pinMode(2, OUTPUT); } void loop() { C = A + B; C = A - B; C = A * B; C = A / B; digitalWrite(2, !digitalRead(2)); }
Al comprobar con el osciloscopio la velocidad con la que realiza estas cuatro operaciones con números flotantes, se pudo encontrar que las operaciones se realizan en aproximadamente 4.46 microsegundos (224.19kHz). 5.2.4.3 Convertidor Analógico a Digital.
Esta tarjeta contiene 12 entradas analógicas (A0 … A11) con una
resolución de 10 bits cada una. Las entradas analógicas aceptan voltajes de 0 a 3.3V, por lo que cada escalón de voltaje es de 3.22mV aproximadamente. El procedimiento para medir la velocidad de operación del módulo convertidor de analógico a digital es el mismo que los anteriores, se medirá el tiempo que tarda el microcontrolador en entregar un resultado de la lectura analógica con un osciloscopio. El programa de prueba es el siguiente: 55
int A = 0; void setup() { pinMode(2, OUTPUT); } void loop() { A = analogRead(A0); digitalWrite(2, !digitalRead(2)); }
El tiempo que transcurrió entre cada lectura fue de aproximadamente 7.636 microsegundos (130.96kHz). 5.2.4.4 Puertos de comunicación.
Es posible comunicar el ChipKIT Uno32 por las siguientes vías: dos puertos UART (uno normal y uno con convertidor a USB), un puerto SPI y dos puertos I2C. El puerto de programación es el UART1 (pines 0 y 1) que se comparten con el adaptador integrado que convierte a USB, así si no se utiliza el puerto USB, puede hacerse comunicación con dispositivos externos. El puerto UART2 está en los pines 39 y 40. La forma más sencilla de comunicar esta plataforma es por el puerto USB que se integra en la tarjeta. Antes de utilizar el puerto serial se debe de inicializar con algún Baud Rate, este se inicializa utilizando la función: Serial.begin(int BaudRate);
BaudRate Es la velocidad de transmisión, o bits por segundo. Así se declara el objeto Serial con una velocidad de BaudRate bits por segundo.
56
Para capturar el dato serial que llegó al puerto en una estructura FIFO (First In, First Out) se utiliza la función: char Serial.read( );
El dato que entrega es tipo carácter, equivalente a un byte. Para enviar un dato serial se utiliza la función: Serial.write(char C);
C Es el dato que se va a enviar en tipo carácter o byte. Cuando hay información disponible, al utilizar la función Serial.available( ), mandará un 1 solamente cuando haya información disponible en la estrutura FIFO de la entrada Rx del puerto Serial. El código utilizado para probar el puerto serial es el que se muestra a continuación: byte A = 0x00; void setup() { Serial.begin(1000000); } void loop() { // Aqui se escribe el código del controlador serialEvent(); } void serialEvent() { while (Serial.available()) { A = (byte)Serial.read(); Serial.write(A); } }
Se comprobó que ChipKIT Uno32 no puede realizar comunicación directamente del puerto Mini-USB que está integrado en la tarjeta, por lo
57
que necesita un adaptador externo que convierta la información del puerto serial a USB. Se utilizó un convertidor FTDI para probar la comunicación. Este adaptador no debe estar conectado al momento de la programación, ya que imposibilita programar la tarjeta. El resultado en general fue satisfactorio, comprobando que solo se necesitan estas funciones para hacer captura y envío de información hacia algún ordenador. La velocidad de transmisión en la PC debe concordar exactamente con la que se programa a la tarjeta, de lo contrario no existirá comunicación.
5.2.5 Raspberry Pi model B. Raspberry Pi modelo B (Figura 20) es una tarjeta de desarrollo de bajo costo para estimular la enseñanza de ciencias de la computación en las escuelas.
Figura 20. Tarjeta Raspberry PI Modelo B. La tarjeta contiene un procesador central ARM1176JZF-S a 700 MHz, un procesador gráfico VideoCore IV y 512 MiB de memoria RAM. El diseño no incluye un disco duro ni unidad de estado sólido, ya que usa una tarjeta SD 58
para el almacenamiento permanente. También cuenta con comunicación 10/100 Ethernet vía hub USB integrado. [16] El precio de esta plataforma en México varía entre los $800.00 y $1,000.00 pesos. Esta tarjeta trabaja en Linux, por lo que siempre está abierto el sistema operativo mientras la tarjeta está encendida. La Raspberry PI tiene un puerto HDMI para visualizar el ambiente Linux en un monitor, salida RCA de video y un conector de audio de 3.5 mm. La fuente de alimentación es por el puerto micro USB y debe de ser de 5V y 700mA. Este puerto no debe ser usado para conectar un host, ya que solo funciona para alimentar el dispositivo. La Figura 21 muestra las entradas/salidas del GPIO Header de la Raspberry PI modelo B.
Figura 21. Entradas/salidas del GPIO de la Raspberry PI modelo B.
59
El ambiente de programación que comúnmente se utiliza es Phyton, pero es muy complicado utilizarlo. Las pruebas que se realizaron a esta tarjeta se hicieron directamente en Simulink, por lo que no existen resultados acerca de esta tarjeta en esta sección. 5.2.5.1 Modulación por Ancho de Pulso.
La tarjeta Raspberry PI modelo B por sí sola no soporta ningún puerto PWM, por lo que solo se pueden generar por software, esto hace que todos los procesos sean más lentos y haya retrasos en los cálculos, además de que la resolución del ciclo de trabajo es pequeña con frecuencias muy bajas (1kHz o menos). 5.2.5.2 Velocidad de procesamiento.
Raspberry PI modelo B utiliza un reloj de 700MHz para todos los procesos referentes al sistema operativo Linux. Lamentablemente Raspberry PI dedica la mayoría de su tiempo en el sistema operativo y no en programas externos, por lo que resulta un cómputo relativamente lento. 5.2.5.3 Convertidor Analógico a Digital.
Esta tarjeta tampoco maneja convertidor analógico a digital, por lo que comúnmente se utiliza un circuito integrado que haga esta función externamente y que se comunique por algún protocolo serial. El circuito que normalmente se utiliza para esta función es el MCP3008 que es un ADC de 10 bits de resolución que se comunica por el puerto SPI. 5.2.5.4 Puertos de comunicación.
La Raspberry PI puede comunicarse por medio de un puerto UART con la computadora y también por el cable Ethernet 10/100 (RJ-45); además, entre sus GPIO un puerto I2C y un puerto SPI. 60
5.2.6 BeagleBone Black. La BeagleBone Black (Figura 22) es una tarjeta de desarrollo que trabaja en ambiente Linux con el procesador Sitara ARM Cortex-A8 a 1GHz. Esta tarjeta puede trabajar en diferentes sistemas operativos tales como Linux, Android y Ubuntu. [17]
Figura 22. Tarjeta BeagleBone Black. La tarjeta contiene un conector Ethernet 10/100, un puerto USB tipo cliente, un puerto para una memoria MicroSD, un puerto MicroHDMI, un puerto USB host, cinco UART, un puerto SPI, dos puertos I 2C, hasta ocho salidas PWM, hasta 69 entradas/salidas digitales compartidas y siete entradas analógicas. [17] Esta tarjeta no necesita de una memoria MicroSD para funcionar ya que contiene una memoria flash eMMC de 4 GigaBytes donde almacena el sistema operativo y puede ser utilizada como disco duro de estado sólido. En la Figura 23 se muestran las entradas/salidas de los headers P9 y P8 de la tarjeta BeagleBone Black.
61
Figura 23. Entradas/salidas de la tarjeta BeagleBone Black. El software de programación de ésta plataforma es un software llamado Cloud9-IDE. Este software puede utilizarse mientras esté conectada la tarjeta por el puerto USB y los drivers hayan sido instalados, escribiendo en cualquier explorador la dirección “http://192.168.7.2:3000/”. Este software
utiliza unos JavaScript llamados BoneScript (haciendo referencia a la tarjeta). El precio de esta tarjeta es de aproximadamente $1,100.00 pesos mexicanos, esta es la tarjeta más cara por sí sola, tiene las mejores prestaciones, aunque es difícil de utilizarla. 5.2.6.1 Modulación por Ancho de Pulso.
BeagleBone Black cuenta con 14 salidas analógicas (PWM), de las cuales solamente 8 son solo entrada o salida y se encuentran en los pines 13, 22, 34, 36, 45 y 46 del header P8 y los pines 14 y 16 del header P9. Cloud9 utiliza una función para modificar la señal PWM de estos pines, ésta función es capaz de modificar tanto el ciclo de trabajo como la frecuencia. A continuación se describe la función: [18] 62
analogWrite(string
‘pin’,
float Duty,
int Freq,
void callback); ‘pin’
Es el pin con salida analógica entre apostrofes (p. ej. ‘P9_14’).
Duty
Ciclo de trabajo de la señal PWM de 0 a 1.
Freq
Frecuencia de la señal PWM, 2000Hz es el valor predeterminado.
Callback Al terminar un período de la señal PWM, se llamará a esta función. La función en Callback no es necesaria de utilizar, por lo que se puede simplemente no escribir y no se utiliza. Esta y todas las funciones utilizan el un “Bonescript” por lo que deben declararse objetos que lo requieren para
poder hacer uso de las funciones en Cloud9. El código para probar las señales PWM de la plataforma BeagleBone Black fue el siguiente: var b = require('bonescript'); var PWM1 = 'P9_14'; b.pinMode(PWM1, b.ANALOG_OUTPUT); var value = 0.9; b.analogWrite(PWM1, value, 150000);
El resultado al hacer algunas pruebas con diferentes frecuencias arrojó que la frecuencia máxima esta por arriba de 10MHz. El ciclo de trabajo es modificable de 0 a 100% a pesar de ser una frecuencia muy alta. 5.2.6.2 Velocidad de procesamiento.
En comparación con las demás plataformas, esta cuenta con el reloj más veloz, de 1GHz, pero trabaja en un sistema operativo y la mayoría del
63
tiempo le da prioridad al sistema operativo y utilizando interrupciones hace los procesos de programas corriendo en el dispositivo, tal como lo hace una computadora. La prueba que se va a realizar para medir la velocidad de procesamiento es la misma, aunque como la plataforma es diferente, el programa varía un poco. El programa utilizado es el siguiente: var b = require(‘bonescript’ ); var A = 123456789; var B = 987654321; var C = 0; b.pinMode(‘P9_11’ , b.OUTPUT); C = A + B; C = A - B; C = A * B; C = A / B; b.digitalWrite(‘P9_11’, !b.digitalRead(‘P9_11’ ));
Al ejecutar este código se pudo determinar que esta plataforma logra ejecutar estas cuatro instrucciones dentro de Cloud9 en aproximadamente 2.23 milisegundos (448 Hz). En realidad estos códigos se ejecutan tan lento debido a que estos procesos se ejecutan cuando el procesador se desocupa e intenta darle importancia a ejecutar ese código. 5.2.6.3 Convertidor Analógico a Digital.
La tarjeta BeagleBone Black tiene 7 canales del convertidor analógico a digital situados en los pines 33, 35, 36, 37, 38, 39 y 40. La resolución del ADC es de 12 bits (4096 valores) y acepta voltajes entre 0 y 1.8V, lo que significa que puede detectar cambios de 439.45µV. [19] El código para probar esta característica fue el que se describe a continuación: var b = require('bonescript'); var Analogica = "P9_36"; 64
var Salida = "P9_14"; var state = b.LOW; b.pinMode(Salida, b.OUTPUT); loop(); function loop() { var value = b.analogRead(Analogica); if(state == b.LOW) state = b.HIGH; else state = b.LOW; b.digitalWrite(Salida, state); setTimeout(loop); }
El resultado fue de 6.66 milisegundos, lo que corresponde a una frecuencia de 150Hz. Esta respuesta es demasiado lenta para procesos que necesitan una respuesta rápida a cambios bruscos de sistemas de control. 5.2.6.4 Puertos de comunicación.
BeagleBone Black tiene algunos puertos para comunicarse con algún dispositivo externo: 5 puertos UART, 2 puertos I 2C, 1 puerto SPI, 1 puerto USB host, 1 puerto USB cliente y 1 puerto Ethernet 10/100 (RJ45). La programación se hace por medio del puerto USB cliente o del puerto Ethernet. Cloud9 no puede configurar el puerto serial de una manera sencilla, en realidad es muy complicado. La comunicación no será posible con esta plataforma usando el IDE propuesto pero se utilizará al comprobar su funcionamiento en Simulink.
5.3 Verificación de funcionamiento en Simulink de las plataformas basadas en microcontrolador. Se utilizó la versión R2014b de Matlab y Simulink de 64 bits para hacer todas las pruebas de las tarjetas.
65
Los dos modos de operación que se analizaron son: External Mode y Deploy to hardware. [20] External Mode
Es una ejecución en tiempo real en donde se interactúa con el hardware. Los procesos son ejecutados por la plataforma externa, mientras hay una comunicación constante con el ordenador, enviando la información que se espera observar con los bloques “Scope” de Simulink. Deploy to hardware
En este modo de operación se le carga el programa hecho en Simulink al hardware externo, por lo que no existe interacción con la computadora a menos que se le indique en el programa que envíe información por algún puerto y realizar otro programa en Simulink que capture esa información y la grafique.
5.3.1 Arduino MEGA 2560. La librería de Simulink para Arduino MEGA se llama “Support Package for Arduino Hardware” y soporta placas Arduino como: Arduino UNO, MEGA y
Nano, entre otros. Los bloques que soporta se muestran en la Figura 24.
Figura 24. Bloques disponibles de Simulink para Arduino MEGA. 66
Es importante hacer notar que Simulink soporta entradas analógicas, escritura continua a servomotor, entradas y salidas digitales, salida PWM, transmisión y recepción de datos seriales, lectura y escritura estándar de servomotor. Haciendo referencia a las características que se evaluaron de las tarjetas, se hizo la prueba solo de la salida PWM, la velocidad en que ejecuta código (suma, resta, multiplicación y división), la lectura del puerto analógico y la transmisión/recepción de datos seriales. Para la comunicación en External mode, se utilizó la taza de transferencia más rápida para las plataformas Arduino, de 500kbps. En la Figura 25 se ilustra el código utilizado para probar las señales PWM.
Figura 25. Prueba de PWM en Arduino MEGA. El bloque de PWM indica que la señal que se genera es de aproximadamente 490Hz con un ciclo de trabajo de 0 a 255 (0 a 100%) y los pines que se pueden seleccionar van del 2 al 13 para el caso del Arduino MEGA. Al comprobar el funcionamiento se verificó que la señal PWM es de 490Hz, el mismo valor que tiene predeterminado Arduino para salidas PWM para los pines 2, 3, 5, 6, 7, 8, 9, 10, 11 y 12. Los pines 4 y 13 tienen una 67
frecuencia de 976.8 Hz. La principal desventaja de este bloque es que es imposible modificar la frecuencia de operación. En este caso los dos modos de operación funcionan de la misma manera, por lo que no es necesario comprobarlos individualmente. Se realizó la prueba de velocidad del procesador, utilizando el programa en Simulink de la Figura 26.
Figura 26. Prueba de velocidad del procesador en Arduino MEGA Los resultados fueron los siguientes:
External mode: 12.2 milisegundos (81.97Hz).
Deploy to hardware: 29 microsegundos (34.38kHz).
El modo Deploy to hardware es el que genera la señal más rápidamente, debido a que no pierde tiempo haciendo comunicación con la PC. La velocidad que puede lograrse con este modo de operación es con bloques que se supone se ejecutan cada microsegundo. La prueba del convertidor analógico a digital se realizó con el modelo de Simulink de la Figura 27.
68
Figura 27. Prueba del ADC del Arduino MEGA. Los tiempos de ejecución en los dos modos de operación al hacer la medición con el osciloscopio en el pin 2 de la tarjeta fueron los siguientes:
External mode: aproximadamente 12.3 milisegundos (81.3Hz).
Deploy to hardware: 140.5 microsegundos (7.12kHz)
El resultado más favorable fue con Deploy to hardware. Para el caso de la comunicación serial, en External mode existe comunicación constante, por lo tanto solo se probó la comunicación cuando se utiliza el modo Deploy to hardware. Para probar la comunicación serial del Arduino MEGA se creó un código para cargar al microcontrolador, el cual se puede observar en la Figura 28.
69
Figura 28. Prueba de comunicación serial en Simulink con Arduino MEGA. Este programa genera una señal senoidal digital de 1Hz, la cual tiene un offset de 127, amplitud de 127 y se redondea para obtener valores enteros entre 0 y 255, estos valores son enviados por el puerto serial 0 (el puerto USB integrado a la tarjeta) a 500kbps (velocidad máxima en Simulink para Arduino), para que la PC los reciba y simplemente los reenvie, para poder ser capturados por el mismo Arduino MEGA de vuelta y sea modificado el valor del ciclo de trabajo de la señal PWM del pin 5 de la tarjeta. En la Figura 29 se muestra el código en Simulink para comprobar la comunicación con el ordenador.
Figura 29. Programa en Simulink para la PC para probar la comunicación serial con Arduino MEGA. Este código solo sirve para probar el envío y recepción de información por el puerto serial. El puerto seleccionado es el COM port que detecta la computadora, en este caso el COM9, no se debe confundir con el puerto de la tarjeta. Se configura para que trabaje con las mismas características que el puerto serie de Arduino. Además, por el Scope se puede observar la onda senoidal que se está generando. El resultado de la comunicación fue satisfactorio. Se logró hacer comunicación a 500Mbps.
70
5.3.2 Arduino DUE. Arduino DUE utiliza exactamente las mismas librerías que Arduino MEGA, ya que los dos Support Package de las diferentes plataformas se unen y generan una sola, por lo tanto los programas son iguales, lo único que se mostrará son los resultados de las pruebas. Las señales PWM funcionaron a 1kHz cada una. Esta frecuencia de operación no se menciona en la librería, ya que esta menciona que es de 490Hz. El ciclo de trabajo se puede modificar dese 0 a 255 (0 a 100%). Al probar la velocidad de procesamiento se encontraron diferentes velocidades para cada modo de operación:
External mode: 12.159 milisegundos (82.24Hz).
Deploy to hardware: 9.22 microsegundos (108.46kHz).
El resultado fue tal como se esperaba, al igual que la plataforma Arduino MEGA, al utilizar Deploy to hardware, el proceso es más veloz. En comparación con Arduino MEGA, las operaciones en External mode tienen prácticamente la misma velocidad. Al utilizar Deploy to hardware es hasta 3 veces más rápido en esta plataforma. Cuando se comprobó el convertidor analógico a digital se obtuvieron los siguientes tiempos de operación:
External mode: 12.2 milisegundos (81.97Hz).
Deploy to hardware: 12.6 microsegundos (79.365kHz).
Para el caso de la comunicación serial, también fue satisfactoria al igual que con el Arduino MEGA.
71
También se puede notar el inconveniente de no poder utilizar el puerto USB que incluye la tarjeta, debido a problemas de la comunicación. Esta es una desventaja porque la comunicación es más lenta por los puertos UART. Otra consideración del uso de este puerto es que no se puede utilizar directamente el convertidor a USB que tiene integrado, el mismo que se utiliza para programar, sino que debe utilizarse un convertidor externo.
5.3.3 FRDM-KL25Z. La librería de Simulink que contiene los bloques correspondientes a la plataforma FRDM-KL25Z se llama “Embedded Coder Support Package For Freescale FRDM-KL25Z Board”, ésta librería contiene los bloques que se muestran en la Figura 30.
Figura 30. Bloques disponibles para la tarjeta FRDM-KL25Z en Simulink. Es notable que esta plataforma no contiene el bloque de salidas PWM, a pesar de que el microcontrolador que contiene si las soporta. Debido a este problema, las señales PWM solamente se podrán generar por software con bloques de Simulink.
72
Esta plataforma no soporta el modo de operación externo, por lo que las pruebas que se realizaron solamente son para el caso de Deploy to hardware. El código en Simulink para probar las salidas PWM es el de la Figura 31. Se utiliza un valor de frecuencia y ciclo de trabajo diferente para cada señal, para comprobar si se pueden generar diferentes frecuencias y probar su implementación.
Figura 31. Prueba de salidas PWM en Simulink con la tarjeta FRDM-KL25Z. Las salidas PWM que se generaron por software sí pueden mantener su frecuencia y ciclo de trabajo, cuando se trata de frecuencias menores a 100Hz. A pesar de este resultado positivo, una señal generada por software siempre hará que cualquier proceso sea más lento. La siguiente prueba es la velocidad de procesamiento, para lo cual se utilizó el programa de la Figura 32.
73
Figura 32. Prueba de velocidad de procesamiento en Simulink con la tarjeta FRDM-KL25Z. Se puede notar que el código es muy similar a los utilizados para las plataformas Arduino, solamente cambia la salida digital, la cual es de otra plataforma. La velocidad resultante fue de 33.01 microsegundos (30.29kHz) para Deploy to hardware. La medición del tiempo de ejecución del ADC se realizó con el programa de la Figura 33.
Figura 33. Prueba del ADC en Simulink con la tarjeta FRDM-KL25Z. Este proceso se logró ejecutar en 74.66 microsegundos (13.39kHz).
74
Por último con el programa de la Figura 34, se probó la comunicación por puerto serial. El código es sencillo, por un lado se genera una señal senoidal discreta, la cual se redondea para obtener valores entre 0 y 255, este dato se convierte en tipo entero de 8 bits sin signo para posteriormente enviarlo por el puerto serie de la plataforma. La otra sección de código recibe un dato entero de 8 bits sin signo por el puerto serial y le aplica una ganancia de 8 para tener un mayor rango de operación de la salida analógica, si este valor no ha cambiado, se sigue enviando el último valor leído a la salida analógica, de lo contrario se actualiza el valor de la salida.
Figura 34. Prueba del puerto serie en Simulink con la tarjeta FRDM-KL25Z. Estas operaciones sirvieron simplemente para comprobar el funcionamiento de los bloques de envío y recepción de información por el puerto UART, los cuales fueron funcionales completamente.
5.3.4 Raspberry PI modelo B. Simulink tiene una librería e specífica para esta plataforma llamada “Support Package for Raspberry Pi”, la cual contiene todos los bloques relacionados a esta plataforma. En la Figura 35 se muestran los bloques de la librería.
75
Figura 35. Bloques disponibles de Simulink para Raspberry PI. Estos bloques son para diferentes aplicaciones relacionadas, entre otras cosas, al procesamiento de señales de voz e imágenes, en este caso solo se utilizarán los bloques GPIO Read, GPIO Write, UDP Receive y UDP Send. Para poder intercomunicar eficazmente la Raspberry Pi con la computadora directamente se deben deshabilitar las redes inhalambricas y conectar por medio de un cable Ethernet directamente la computador a con la tarjeta. Como esta plataforma no tiene salidas analógicas PWM, se tienen que producir señales PWM por software, en la Figura 36 se ilustra un programa en Simulink que genera una señal PWM por software para la Raspberry PI.
76
Figura 36. Prueba de PWM en Simulink con Raspberry PI. Se probaron diferentes frecuencias, resultando que esta plataforma soporta frecuencias de hasta máximo 1kHz para señales PWM. A pesar de esto sigue siendo un inconveniente que no existan módulos PWM por hardware por que estas señales PWM pueden ralentizar los procesos, además de que la frecuencia de operación del PWM oscila demasiado. En la Figura 37 se muestra el código utilizado en Simulink para hacer la prueba de velocidad del procesador.
Figura 37. Prueba de velocidad del procesador en Simulink con Raspberry PI.
77
Los resultados fueron los siguientes:
External mode: 328 microsegundos (3.05kHz).
Deploy to hardware: 47 microsegundos (47kHz).
Estos valores son una aproximación, ya que varía continuamente la medición. Esta plataforma dedica un instante de tiempo cada milisegundo a realizar tareas correspondientes al sistema operativo, haciendo que el proceso no se ejecute por al menos 20 microsegundos. Este tiempo no es posible omitirlo, por lo que siempre existirá. Esta plataforma no contiene ningún módulo ADC, por lo que no se puede hacer ninguna prueba sobre esta característica. Para el caso de los puertos de comunicación, Simulink provee soporte para comunicación por UDP, a diferencia de las otras plataformas que soportan comunicación serial, esta plataforma solo puede enviar información por la red con las librerías que tiene. Para lograr la comunicación se utilizó el programa de la Figura 38.
Figura 38. Prueba de comunicación UDP en Simulink con Raspberry PI. La comunicación se logró satisfactoriamente utilizando el programa propuesto. Las únicas consideraciones que se deben hacer es que en el bloque UDP Send del programa para la tarjeta se debe utilizar la IP de la
78
computadora, con el puerto IP remoto 25000 y en el bloque UDP receive se utiliza el puerto IP local 25001. En la PC, el programa que se utiliza es el mostrado en la Figura 39. En este programa, el IP remoto del UDP send debe ser 25001, la IP que se debe colocar es la de la Raspberry PI y el IP local del UDP receive debe ser 25000.
Figura 39. Programa en Simulink para prueba de comunicación por UDP. La comunicación es satisfactoria en los dos sentidos tanto para envío como para recepción de información. Lamentablemente la velocidad máxima de transmisión es de aproximadamente 1kBps.
5.3.5 BeagleBone Black. Las librerías de Simulink para utilizar BeagleBone Black se llaman “Embedded Coder Support Package for BeagleBone Black Hardware”, la
cual contiene los bloques que se muestran en la Figura 40. Este dispositivo solamente funciona con la versión 2014b de Matlab, versiones anteriores no la soportan. Es importante resaltar que esta plataforma soporta salidas PWM, entradas analógicas y la comunicación por UDP, en comparación a otras tarjetas que no soportan algunas de estas características.
79
Figura 40. Bloques de BeagleBone Black soportados por Simulink. Se realizó la prueba de las salidas PWM, con el programa de la Figura 41. Se encontró que esta plataforma puede utilizar todas las señales PWM al mismo tiempo con diferentes frecuencias desde 0 hasta 1MHz con precisión, sin disminuir la resolución del ciclo de trabajo.
Figura 41. Prueba de salidas PWM en Simulink para BeagleBone Black. Un problema que la librería no menciona, es que no se puede utilizar más que solamente 3 señales PWM a la vez, ya que algunas dependen del mismo reloj y si se utilizan al mismo tiempo, aunque se configure la misma frecuencia, ninguna de las dos salidas funcionan. Como opinión personal creo más conveniente utilizar solo las salidas que se muestran en la Figura 80
41. Para probar la velocidad de procesamiento se utilizó el modelo de la Figura 42.
Figura 42. Prueba velocidad de procesamiento en Simulink para BeagleBone Black. El resultado fue de 32.9 microsegundos (30.4kHz). Esta plataforma no se pudo comunicar con el modo de operación externo, por lo que solamente se utilizó el modo Deploy to hardware. Se pudo notar en la onda cuadrada que en algunas ocasiones, el procesador se detenía para realizar algunas tareas y retrasaba la respuesta, comúnmente este error sucedía cada milisegundo. Además, cada segundo el proceso se detenía alrededor de 45 milisegundos. La prueba del ADC se realizó con el programa de la Figura 43.
Figura 43. Prueba ADC en Simulink para BeagleBone Black. 81
La velocidad de operación para la lectura de datos analógicos fue de aproximadamente 1.13 milisegundos (884.98Hz), lo cual es muy lento en comparación a otras plataformas. La prueba de la comunicación se realizó por medio del puerto UDP, el programa se muestra en la Figura 44.
Figura 44. Prueba de comunicación por UDP en Simulink para BeagleBone Black. Con este código junto con el código para la PC utilizado para la Raspberry PI, se pudo comprobar que se puede intercambiar eficazmente información con la plataforma.
5.4 Comparación de plataformas. En la Tabla 3 se muestra toda la información recabada de las seis plataformas evaluadas para la comparación de las mismas. Se remarca de color gris la plataforma que es más adecuada para cada función. Es importante notar que todas las características que se evalúan son importantes en las aplicaciones de control y en algunas aplicaciones son necesarias. La comparación es objetiva y tratando de obtener el mejor resultado posible, utilizar alguna plataforma será decisión de quien realice el proyecto de control, basándose en la información que se proporciona.
82
Tabla 3. Características de las seis plataformas. A
Z
M
D
L
3
E U ni
g
F
c
s h
R
k
p
D A
le b
pi
d A
B e
M r
o
n
K
u d
r TI
o u
e yr
U K
ni
P n
2
o r
I o
5
E
Entradas/salidas digitales
2
G
a a
C
R
e B
al B
54
54
53
42
17
69
8 bits
32 bits
32 bits
32 bits
32 bits
32 bits
Dificultad de programación (1 a 5)
1
2
3
2
5
5
Voltaje de operación
5 Volts
3.3 Volts
3.3 Volts
3.3 Volts
3.3 Volts
3.3 Volts
Precio aproximado
$350.00
$800.00
$400.00
$800.00
$900.00
$1,100.00
Velocidad del reloj
16 MHz
84 MHz
48 MHz
80 MHz
700 MHz
1 GHz
Velocidad de procesamiento +/-/x/÷ Simulink: Deploy to hardware Simulink: External mode Cantidad de salidas PWM
41.3 µSeg 29 µSeg 12.2 mSeg
5.75 µSeg 9.22 µSeg 12.159 mSeg
3.418 µSeg 33.01 µSeg
4.46 µSeg
---
---
---
15
4
24
5
---
Si
Si
No
---
No
8 bits
8 bits
Aprox. 16 bits
8 bits
---
16 bits
62.5 kHz
328.125 kHz
20 kHz
312.5 kHz
---
1 MHz
30.52 Hz
5.007 Hz
< 1 Hz
4.77 Hz
---
< 1 Hz
10
65,535
65,535
500,000
---
>500,000
16
12
6
12
---
7
Resolución ADC
10 bits
12 bits
16 bits
10 bits
---
12 bits
Velocidad para leer ADC Simulink: Deploy to hardware Simulink: External mode Salidas analógicas (DAC)
128.15 µSeg 140.5 µSeg 12.3 mSeg
44.408 µSeg 12.6 µSeg 12.2 mSeg
36.248 µSeg 74.66 µSeg
7.636 µSeg
---
---
---
---
---
---
---
No
2 (12 bits)
1 (12 bits)
No
No
No
Bus de datos
PWM en Simulink Resolución ciclo de trabajo PWM Frecuencia máxima PWM Frecuencia mínima PWM Cantidad aprox. de frecuencias PWM Entradas analógicas
83
---
47 µSeg 328 µSeg
2.23 mSeg 32.9 µSeg --14, 3 en Simulink Si (Frec. Modif.)
6.66 mSeg 1.13 mSeg
Continuación Tabla 3. A
Z
M
D
L
3
E U o
g
F
c
s h
R
k
p
D A
le b
pi
d A
B e
M r
o
n r
K
u d
r TI
ni u
e y
U K
ni
P n
2
o r
I o
5
E
Puertos UART
2
G
a a
C
R
e B
al B
4
4
3
2
1
5
1
1
1
1
No
Es UDP/USB
1 Mbps
1 Mbps
1 Mbps
1 Mbps
115.2 kbps
---
USB CDC
No
Si
Si
No
No
No
Comunicación UDP
No
No
No
No
Si
Si
UART en Simulink
Si
Si
Si
---
No
No
UDP en Simulink
No
No
No
---
Si
Si
Convertidor UART/USB Velocidad máxima UART
La plataforma que tiene mejor precio es la FRDM-KL25Z de Freescale, debido a la gran cantidad de características que tiene para tan bajo precio de venta. Respecto a salidas PWM, la plataforma BeagleBone Black tiene las mejores características, al tener un gran rango de frecuencias disponibles, una resolución del ciclo de trabajo muy alta, aunque es muy deficiente en lo que respecta a tareas que requieran tiempo del procesador. La velocidad de procesamiento es mejor en la plataforma Arduino DUE, ya que es más versátil, es veloz para más aplicaciones no solo con estas operaciones básicas y trabaja a una muy buena velocidad en conjunto con Simulink. Para el caso de las entradas analógicas (ADC), la plataforma FRDM-KL25Z es la que cumple con las mejores características, al ser rápida en las lecturas y tener una alta resolución y poder detectar cambios muy pequeños de voltaje, a pesar de la poca cantidad de entradas analógicas, ya que normalmente no se utilizan tantos sensores analógicos en control. 84
Arduino DUE es la plataforma que trabaja mejor con los puertos de comunicación, en gran parte por que contiene muchos puertos UART, se puede configurar el USB nativo como CDC para enviar información a una taza de transmisión muy alta, además de que existe menos probabilidad de error de esta manera. La plataforma que mejor funciona dentro de Simulink es Arduino DUE nuevamente, ya que es más veloz que las demás plataformas Arduino y con las ventajas que dan en soporte a estas plataformas.
85
Capítulo 6. Conclusiones y recomendaciones. A continuación se describen las conclusiones y recomendaciones acerca del proyecto “Medición
y adecuación de señales para aplicaciones de control”.
86
CONCLUSIONES Y RECOMENDACIONES Se logró desarrollar un prototipo funcional para medir corriente y voltaje con las características propuestas. El prototipo es modular, por lo que se puede utilizar en conjunto con otros módulos y medir las tres componentes trifásicas. Este módulo puede ser utilizado también para medir la potencia, realizando una simple multiplicación de las señales eléctricas. Se concluye que todas las plataformas que se evaluaron sirven para aplicaciones de control, a excepción de la tarjeta Raspberry PI, debido a que carece de señales PWM y entradas analógicas, además de un precio muy alto a pesar de no contener estas características. Las plataformas que se analizaron pueden ser utilizadas en diferentes situaciones, por lo que se recomienda utilizar la tarjeta Arduino MEGA para situaciones que no necesiten mucha velocidad y procesos sencillos. La tarjeta Arduino DUE es la más recomendable en la mayoría de las situaciones, ya sea al vincularlo con Simulink o al programar la plataforma de manera independiente para una aplicación específica, esto por tener un precio medio y un gran número de ventajas, además de su facilidad de programación. En el caso de la plataforma FRDM-KL25Z se podría utilizar en casos que necesiten una gran precisión de lecturas analógicas, como también en aplicaciones de ahorro de energía. La plataforma ChipKIT Uno32 puede ser utilizada solamente sin Simulink, lo que la excluye a solo ser usada en proyectos que demanden una velocidad de operación rápida y que utilice señales PWM con mayor precisión. BeagleBone Black es buena para aplicaciones donde la precisión de las señales PWM es esencial, además de que puede ser utilizada en red con otros dispositivos y computadoras, pueden lograrse aplicaciones que involucren alguna cámara u
87
otro dispositivo USB. Esta plataforma puede tener más aplicaciones si se pudiera investigar más a fondo acerca de los microcontroladores embebidos PRU (Programmable Real-Time Unit), debido a que son muy veloces pero manejan lenguaje ensamblador y son muy complicados de programar.
88
Capítulo 7. Competencias desarrolladas y/o aplicadas. A continuación se describen las competencias desarrolladas y/o aplicadas en el proyecto “Medición
y
adecuación
de
señales
aplicaciones de control”.
89
para
COMPETENCIAS DESARROLLADAS Y/O APLICADAS Las competencias que se desarrollaron fueron las siguientes:
Comprender la importancia de la medición de variables eléctricas en aplicaciones de control.
Capacidad de investigación.
Utilizar herramientas de programación para realizar pruebas a plataformas propuestas.
Capacidad para organizar y planificar el tiempo.
Desarrollar un prototipo para medición de señales eléctricas.
Analizar objetivamente diferentes plataformas basadas en microcontrolador.
Capacidad de abstracción, análisis y síntesis.
Habilidad para buscar, procesar y analizar información procedente de fuentes diversas.
Capacidad para formular y gestionar proyectos.
Conocer el funcionamiento de señales moduladas por ancho de pulso.
Establecer comunicación entre computadora y alguna plataforma.
Realizar mediciones eléctricas para pruebas y calibración de dispositivos.
Capacidad para generar códigos en Simulink para ser utilizados
plataformas.
Capacidad para realizar reportes escritos y orales.
90
REFERENCIAS BIBLIOGRÁFICAS Y VIRTUALES [1] Hoja de datos del sensor de voltaje LV25-P, para mediciones electrónicas DC, AC y señales pulsantes. LEM. http://www.lem.com/docs/products/lv%2025-p.pdf [2] Hoja de datos del sensor de corriente CSNE151 de Honeywell. http://www.farnell.com/datasheets/315717.pdf [3] Hoja de datos del sensor de corriente LA25-NP, para mediciones electrónicas DC, AC y señales pulsantes. LEM. http://www.lem.com/docs/products/la%2025-np.pdf [4] Hoja de datos del microcontrolador ATmega2560/V de ATMEL. http://www.atmel.com/images/doc2549.pdf [5] Descripción de la función analogWrite de Arduino. Foros de Arduino. http://arduino.cc/en/Reference/AnalogWrite [6] Adjusting PWM frequencies. Foros de Arduino. http://playground.arduino.cc/Main/TimerPWMCheatsheet [7] Ken Shirrif & Paul Badger. Secrets of Arduino PWM. Foros de Arduino. http://arduino.cc/en/pmwiki.php?n=Tutorial/SecretsOfArduinoPWM [8] Sobi. Arduino MEGA: PWM pin and frequency timer control. http://sobisource.com/arduino-mega-pwm-pin-and-frequency-timer-control/ [9] Descripción de la función analogReadResolution de Arduino. Foros de Arduino. http://arduino.cc/en/Reference/AnalogReadResolution [10] Hoja de datos del microcontrolador SAM3X8E de ATMEL. http://www.atmel.com/images/doc11057.pdf [11] Randomvibe. Librería pwm01.h para Arduino DUE. https://github.com/it-workshop/pwm01.h_by_randomvibe 91