STM32F4: Configuración y uso básico del ADC

Como continuación de los tutoriales relacionados con la placa de desarrollo STM32F411E-Discovery, en este post vamos a explicar las nociones básicas para el uso del ADC.
El ADC (Analog to Digital Converter) es un elemento que se utiliza en electrónica para convertir una señal analógica en una señal digital, es decir, es la comunicación entre Hardware y Software. Al permitir esta comunicación, el ADC se convierte en un elemento fundamental a la hora de poder utilizar las señales digitalmente.

En este tutorial aprenderemos el funcionamiento básico para realizar la lectura de un dato y de una señal, sin utilizar el DMA.

 

CONFIGURACIÓN INICIAL

El primer paso es utilizar CubeMX, al igual que en el resto de tutoriales. Para entender la configuración básica nos basamos primero en lo que nos cuentan los documentos relacionados con nuestra discovery (manual de usuario y manual de referencia) y con el ADC, y segundo en lo que nosotros buscamos obtener. Esto implica conocer los siguientes conceptos sobre la configuración:

  • Clock Prescaler: la frecuencia a la que se capturarán datos del ADC.
  • Scan Conversion Mode: este modo se activa cuando queremos usar varios canales del ADC.
  • Continuous Conversion Mode: al activarlo el ADC se pone a leer muestras de forma continua.
  • Discontinuous Conversion Mode: se utiliza para convertir un grupo cerrado de conversiones.
  • DMA Continuous Requests: se habilita cuando queremos utilizar el DMA.
  • End Of Conversion Selection: este flag se utiliza para determinar cuando se ha realizado una conversión.
  • Number of Conversion: determina el número de canales que van a realizar conversiones.

En este caso, el trigger externo no es necesario, por lo que se deja la opción de configuración mediante el software. Las opciones de Rank se dejan por defecto salvo que en los documentos anteriores nos indique lo contrario.

Por tanto, escogemos el pin PA1 como ADC1_IN1 y seguimos la configuración que puede verse en las imágenes. Tras lo cual, podemos pasar el código a Eclipse (el resto de pines que se ven marcados son los que se marcan al aceptar la configuración por defecto).

Configuración del ADC
Pin del ADC

Es importante tener en cuenta que aunque el modo continuo esté habilitado, si el modo End Of Conversion Selection está habilitado sólo se realizará una lectura.

 

LECTURA DE UN POTENCIÓMETRO

Conectamos un potenciómetro a la discovery, siendo la salida la conexión con el pin PA1 y los otros dos pines se conectan a VDD (alimentación) y GND (masa).

Entonces, dentro del main.c, tenemos que utilizar una función que permita empezar la conversión, otra que compruebe que el ADC está funcionando de forma correcta (utilizando la opción de polling) y otra que permita leer el valor del ADC. Se deja al lector la implementación de estas 3 funciones, las cuales pertenecen a la HAL – Hardware Abstraction Layer (es decir, aquellas funciones que permiten la interación entre Hardware y Software). Por ello, es conveniente revisar estas funciones, explicadas en este link. El valor deberá ser guardado en una variable.

Finalmente, compilamos y lanzamos el debugger. Al darle a empezar lo que tendremos será el valor que el ADC ha leído del potenciómetro una vez, el cual se encuentra entre 0 y 4096 (debido a los 2^12 bits que tiene el ADC). Para tener claro si el valor es leído correctamente, lo mejor es hacer 3 medidas: una con el potencióemtro en el mínimo (la variable tendría un valor cercano a 0), otra con el potenciómetro en el máximo (la variable tendría un valor cercano a 4096) y otra con el potenciómetro en el valor intermedio (la variable tendría un valor cercano a 2048).

Para leer la variable es necesario pausar la reproducción y poner el cursor encima de la variable en cuestión.

 

LECTURA DE UNA SINUSOIDE

El siguiente paso a dar es conseguir leer una sinusoide correctamente, es decir, teniendo en cuenta que la frecuencia de la señal obtenida es la misma que la de la sinusoide de entrada.

Conectamos el generador de funciones al pin PA1 y generamos una sinusoide de 1 KHz. El uso del osciloscopio para comprobaciones de entrada o salida es opcional y su uso se deja a elección del lector.

Las propiedades del ADC que tenemos que cambiar son las siguientes:

  • hadc1.Init.ContinuousConvMode = ENABLE; — Si lo teníamos DISABLE.
  • hadc1.Init.EOCSelection = DISABLE;

Esto se puede hacer directamente en el archivo adc.c, no es necesario ir a cubeMX a cambiar la configuración.

Sería necesario un array en el que guardar las muestras necesarias para la lectura de la sinusoide. Tras recoger las muestras, es necesario comprobar la señal que se está guardando a partir de estas muestras, lo cual se puede hacer utilizando cualquier herramienta que permita la representación de datos. En este caso, hemos utilizado MatLab, y lo que hemos obtenido es lo que se muestra en la imagen siguiente.

Sinusoide obtenida con los datos leídos del ADC

Podríamos pensar que ha funcionado correctamente al ver la imagen, pero si tenemos en cuenta que tenemos un array de 1000 elementos y una señal de entrada de 1 KHz, deberíamos estar haciendo 1 lectura cada milisegundo como máximo, y entonces podríamos ver un período de la señal. Si realizáramos lecturas más rápidas, veríamos menos de un período; y si son más lentas estaríamos perdiendo muestras y la señal no sería la misma. El problema es que no sabemos a qué velocidad se está realizando la captura y lectura de datos del ADC, pero por la imagen podemos deducir que lo que ocurre es el último caso. Las lecturas son más lentas, lo que provoca que estemos perdiendo muestras, y al perder muestras, para rellenar el array, necesitamos muestras de períodos siguientes, lo que hace que en su representación se observen varios períodos.

Una forma de intentar corregir este aspecto es aumentar la frecuencia de muestreo. Si no conseguimos una buena representación ni cuando la aumentamos, esto quiere decir que la limitación se encuentra en el tiempo que tarda el microcontrolador en procesar las instrucciones, y ahí poco podemos mejorar.

 

CONCLUSION

En este tutorial hemos aprendido a configurar un ADC y a realizar lecturas del mismo, tanto individuales como continuas. Pero los resultados muestran que esta forma de obtener datos solo es útil si buscamos obtener datos independientes o de forma continuada pero lenta.

Para mejorar este comportamiento tenemos dos opciones: utilizar interrupciones o utilizar el DMA. Ambas formas son explicadas en los siguientes tutoriales.

 

Nota: La imagen de la portada ha sido obtenida de THine Electronics

Demotherm. Pruebas del robot en entorno real de trabajo

Finalizados los desarrollos software en el laboratorio B105, era momento de volver a la universidad de Oviedo para realizar pequeñas reparaciones en la parte mecánica del robot.

Estas modificaciones mecánicas fueron rápidas ya que básicamente consistieron en cambiar piezas ya desarrolladas por otras modificadas que cumplían mejor con su misión.

Cuando el robot estuvo a punto tanto en la parte mecánica como electrónica, era momento de visitar las instalaciones de Therman, la empresa responsable del proyecto Demotherm. El objetivo de esta visita era el enfrentar el robot a un escenario real de trabajo y comprobar si la parte mecánica y electrónica cumplían con las especificaciones con las que se definió el proyecto.

El robot de demolición de refractario para ciclones cumplió holgadamente sus expectativas y fue capaz de agarrarse a las paredes del ciclón con sus orugas y realizar desplazamientos verticales. Una vez realizadas estas pruebas de comunicación, control, fuerza y movimientos en un ciclón de ensayo sólo nos queda probar la bomba de agua. 

Demotherm: Robotic application of refractory material

The B105 Electronic Systems Lab. as a representative of Technical University of Madrid (UPM) participates with THERMAN and the University of Oviedo (Uniovi) in this innovative research project. To develop it we have the support of the Industrial Technological Center (CDTI) and the Ministry of Economy and Competitiveness, and is co-financed by the European Regional Development Fund (FEDER).

The project aims to achieve an automotive and remote control robot capable of working in hostile environments oriented to the repair of cyclones and cimneys reinforced with refractory material.

This solution represents a revolution in the process and provides economic, strategic, enviromental and safety and occupational health improvements.

Out participation in this project is the development of all the sensorization, actuation and control part of the automobile robot.

therman-feder-banner3

 

Estadísticas Futbolín 2012/2013

Estadísticas de juego del futbolín B105 para la Temporada que va desde Septiembre 2012 hasta Agosto 2013

Leyenda:

Los más jugones de la temporada: Gente que prefiere pasar su vida jugando al futbolín en el labo porque no tienen vida social (o eso o es que son unos viciosos…).

Los más killers: Los más peligrosos para jugar contra ellos si las condiciones de contorno no son muy favorables (vamos que si tienes un compañero que es un paquete mejor di que te duele una muela y no juegues).

Los más arrastrados: Esos jugadores que sabes que si te tocan de compañeros tienes muchas posibilidades de limpiar el suelo por solidaridad, o si eres uno de ellos, sabes que algo mal has hecho en la vida que te toca llevar esa cruz.

Índice sangriento: Existe una posibilidad entre nosecuantas de que te haga pasar ese jugador (siempre y cuando no mientan las estadísticas -no te puedes fiar-), es persona recomendable para tenerla de compañero pero no de oponente.

Índice desangrado: Eso no es un compañero, es llevar casi todas las papeletas de la tómbola para que, como poco, pierdas tu partido. Hay que tener ganas (o tener un poco espíritu de mártir) para jugar con ellos, es una forma de hacer penitencia o de no jugar mucho seguido al futbolín.

Resultados: Pues eso, es lo que hay, ni más ni menos. La verdad pura y dura. ¿Se gana más en el Atleti? ¿Se gana más en el Madrid? ¿Está manipulado el terreno de juego? ¿Por qué hay gente que siempre quiere jugar con uno de los equipos en concreto?

Equipos preferidos: Aquí estamos con el tema de los amores, los caprichos o la más absoluta falta de dignidad… O juego siempre contigo porque eres mi amiguito o porque creo que es más difícil pasar y más fácil hacer pasar a alguien. La humanidad en su peor expresión.

Top pesados: Esos partidos que se hacen eternos, que deseas morirte porque estás jugando a más de 30 grados en el labo y tu compañero (o el equipo contrario) no logran dar pie con bola, ni a favor ni en contra, no se mete un gol ni por equivocación… Pero, a veces, se da el caso extraordinario de que todos juegan muy bien y resulta muy entretenido de ver (de jugar no, que es muy cansado).

Pruebas de detección de vehículos en la A-1 para el proyecto Easysafe

El paso día 26 fuimos a realizar pruebas para el proyecto Easysafe. La hubicación de las pruebas la autovía A-1 en el kilómetro 111. En él se realizaros varios test enfocados a la detección de vehículos, personas y fauna en la carretera. Esto se realizó por medio de varios tipos de acelerómetros y un magnetómetro sitiados fuera del asfalto. Como se puede apreciar en las fotografías, los sensores fueron colocados en el quitamiedos, a una distancia bastante lejana de loos vehículos y aun así las medidas han sido satisfactorias. A partir de ahora, el trabajo se centrará en el algoritmo para discriminar el tipo de vehículo, animales y personas.

easysafe