Este informe consiste en la descripción del proyecto final realizado para la asignatura de Microcontroladores para Aplicaciones y Sistemas Biomédicos del grado de Ingeniería Biomédica de la Universitat de Barcelona.
El trabajo realizado ha sido desarrollar un proyecto de programación de un potenciostato para la realización de voltametrías cíclicas y cronoamperometrías a una muestra de ferrocianuro potásico (K4[Fe(CN)6]) en cloruro de potasio (KCl) a diferentes concentraciones.
El proyecto se ha desarrollado mediante la programación de la placa de evaluación STM32 Nucleo-F401RE de STMicroelectronics. Basado en el entorno STM32CubeIDE, ha sido realizado en pareja, siguiendo un flujo de trabajo o workflow en equipo. La herramienta utilizada ha sido Git, un Sistema de Control de Versiones open source. Los archivos y el proyecto en sí ha sido alojados en GitHub mediante el uso de Git.
Este proyecto ha sido desarrollado durante la primavera de 2020, durante la pandemia de Sars-Cov-2. Por lo tanto, ciertos aspectos del proyecto han estado limitados por la imposibilidad de desarrollar trabajo presencial, tal y como se indica más adelante.
Un potenciostato es un dispositivo electrónico requerido para controlar una cela de tres electrodos para realizar experimentos electroquímicos. Estos tres electrodos son el electrodo de referencia REF, el electrodo de trabajo WE y el electrodo auxiliar AUX (o counter-electrode). Las dos funciones principales de un potenciostato son:
Controlar la diferencia de potencial entre los electrodos de referencia y de trabajo sin polarizar el electrodo de referencia (impidiendo que pase corriente y evitando así su degradación).
Medir la intensidad de corriente que circula entre los electrodos de trabajo y auxiliar (corriente de la celda).
El potenciostato utilizado en este proyecto está formado por un front-end que ha sido específicamente diseñado para la asignatura y un back-end que consiste en la Evaluation Board (EVB) NUCLEO-F401RE.
La Voltamperometría Cíclica (CV), más conocida como voltametría cíclica, es un tipo de medida electroquímica potenciodinámica que se utiliza generalmente para estudiar las propiedades electroquímicas de un analito en una solución o de una molécula absorbida sobre un electrodo. El funcionamiento básico de la voltametría cíclica consiste en aplicar un potencial variable en una celda electroquímica y medir la corriente que la celda proporciona. El potencial entre el electrodo de trabajo y el de referencia varía en el tiempo hasta alcanzar un valor máximo y luego se repite el mismo proceso de manera inversa, hasta alcanzar el valor de potencial inicial. Este proceso se llama barrido triangular de potencial y se repite durante un número establecido de ciclos. La corriente medida en la celda es representada en función de la tensión aplicada, en forma de voltamograma cíclico.
La Cronoamperometría (CA) es una técnica electroquímica que se utiliza para estudiar la cinética de reacciones químicas y procesos de difusión y absorción características de las especies biológicas en una celda electroquímica. Este proceso consiste en proporcionar una señal escalón en el electrodo de trabajo y medir la corriente proveniente de la muestra. La corriente de la celda, medida en función del tiempo, fluctúa de acuerdo con la difusión de un analito desde la solución, cuantificando así la concentración del analito de interés. La cronoamperometría puede, por lo tanto, usarse para medir la dependencia entre la corriente y el tiempo actual para el proceso de difusión controlada que ocurre en un electrodo, que varia con la concentración de analito. Una de sus ventajas es que es una técnica sensible que no requiere el etiquetado del analito o biorreceptor.
Es un método ampliamente utilizado en electroquímica, debido a su relativa facilidad de implementación y análisis, que se aplica en muchos estudios de forma independiente o junto con otras técnicas electroquímicas, como CV.
La herramienta utilizada para desarrollar el proyecto ha sido Git, un software de control de versiones (VCS) que permite administrar los cambios de diferentes ficheros y desarrollar trabajos en equipo coordinando la modificación de archivos compartidos. El proyecto final se ha colgado en la plataforma GitHub, que permite guardar el histórico de proyectos utilizando el sistema de control de versiones Git. De esta forma, se han podido guardar las versiones de este proyecto tanto en un repositorio local como público.
El flujo de trabajo o workflow utilizado en el proyecto se ha basado en la creación de diferentes ramas, cada una dedicada para una función del potenciostato diferente:
.ioc
y se ha inicializado el código.setup
y loop
, y modificación de la función main
.Todo el vuelco de ramas finalizadas a la rama develop se han hecho mediante Pull requests, donde se ha puesto siempre como revisor al otro miembro del equipo con tal de asegurar que se estaba de acuerdo con los cambios propuestos.
Estos desarrollos se han dividido entre los miembros del trabajo equitativamente. Debido a la pandemia de Sars-Cov-2, todas las reuniones, tanto con el equipo como el supervisor, se han desarrollado de manera no presencial. La estructura del código así como las variables y funciones a utilizar han sido decididas por el equipo mediante sesiones virtuales. La corrección de los últimos comportamientos no deseados ha sido realizada mediante el uso de Skype y su funcionalidad de compartir pantalla. Finalmente, se han resuelto dudas del proyecto con el supervisor mediante varias reuniones virtuales, a través de Skype Empresarial.
Se trata de un proyecto muy completo, con gestión de un DAC, de ADCs, de timers, de un módulo de alimentación, de un relé, con comunicación I2C y comunicación UART, así como la gestión de las dos medidas electroquímicas. Las diferentes funcionalidades han sido desarrolladas en funciones implementadas en distintos archivos de código .c con sus respectivas cabeceras. Estas funciones son llamadas cuando son necesarias. El programa principal ha sido desarrollado en un archivo aparte, llamado stm32main.c
, en la que se han creado las funciones setup
y loop
para imitar el funcionamiento de Arduino y evitar ir modificando el archivo main.c
.
A continuación, detallaremos el uso de cada una de las funcionalidades y presentaremos los diagramas de flujo de las funcionalidades más complejas, incluyendo la dinámica principal del programa.
Se trata de la unidad de gestión de potencia y se encarga de alimentar el front-end. Es deshabilitado por defecto para evitar el consumo de corriente del front-end antes de que la EVB negocie el consumo máximo con el controlador USB del ordenador. Cuando el microcontrolador esté alimentado, se habilita la PMU. Esto se realiza llevando en alto el pin EN
, que ha sido configurado como salida digital, nada más se inicie el programa en el microcontrolador.
La gestión de la PMU se ha realizado mediante el uso de una función, que es llamada en el setup
. En esta función se implementa la función HAL_GPIO_WritePin
.
El potenciostato integra un relé, que se encarga de abrir y cerrar el circuito entre el front-end y el sensor electroquímico. Por defecto, el relé debe de estar abierto para que estos dos módulos no estén conectados eléctricamente. Al realizar una medición, se debe cerrar el relé y cuando esta acaba, debe volver a abrirse. Esto se realiza mediante el pin RELAY
, que también ha sido configurado como salida digital.
Le gestión del relé no se realiza mediante un archivo con una función aparte. Se implementa directamente mediante la función HAL_GPIO_WritePin
dentro de las funciones que gestionan la CV y la CA.
Una vez escogidos los parámetros de la medida electroquímica, la tensión VCELL debe ser fijada en la celda. Esto se realiza mediante el uso de un Conversor Analógico Digital (DAC), que puede generar una tensión de salida de 0 a 4 V. A la salida del DAC se ha añadido una etapa para obtener una señal bipolar de -4 a 4 V para poder polarizar la celda con tensión positivas y negativas. La correspondencia que se ha usado entre la tensión de la celda deseada VCELL y la tensión de salida del DAC VDAC es la siguiente:
Para esta aplicación, el DAC usado es el MCP4725, de Microchip. El microcontrolador se comunica con el DAC a través de comunicación I2C. Sus especificaciones se encuentran en la siguiente hoja de datos.
La gestión del DAC ha sido desarrollada en un archivo aparte dac.c
, junto con su cabecera dac.h
. En este archivo se ha implementado una función. Esta integra:
Esta aplicación requiere del uso de un Conversor Analógico Digital (ADC) para conocer la tensión de polarización de la celda real, porque pese a que la controlemos, no la podemos dar por conocida. La correspondencia entre la tensión de entrada del ADC VADC y la tensión de la celda VCELL es la siguiente:
La corriente que pasa a través de la celda también se lee a través del ADC, con la correspondencia siguiente:
Las dos tensiones VADC usadas para obtener el valor de VCELL y ICELL provienen de los pines VREF
y ICELL
, que han sido configurados como entradas analógicas. Su gestión ha sido implementada en un archivo con cabecera aparte. En el archivo adc.c
se han implementado dos funciones, una para la adquisición de la señal proveniente de VREF
y la otra para la proveniente de ICELL
. Estas son llamadas des de las funciones CV y CA en su debido momento. Como el microcontrolador solo tiene un ADC, se ha utilizado el modo escaneo para leer la señal analógica de dos pines diferentes de manera no simultánea. Para la adquisición de las señales analógicas, se han usado las funciones HAL_ADC_Start
, HAL_ADC_PollForConversion
y HAL_ADC_GetValue
.
Los parámetros para realizar las medidas electroquímicas se indican a través de una aplicación para el ordenador, como es explicado en detalle más adelante. La comunicación entre el microcontrolador y el ordenador, el host, se realiza mediante comunicación serie asíncrona con configuración 115200 8N1. La comunicación es codificada mediante el uso del protocolo COBS (Consistent Overhead Byte Stuffing), por su sencillez y bajo overhead, utilizando el carácter 0x00
como term char. Cuando el microcontrolador reciba la instrucción de iniciar una medida electroquímica, esta debe iniciarse inmediatamente. Existen tres instrucciones que se presentan en la siguiente tabla.
Valor | Instrucción | Descripción |
---|---|---|
0x01 | START_CV_MEAS | Pasa los parámetros de una voltametría cíclica y la inicia. |
0x02 | START_CA_MEAS | Pasa los parámetros de una cronoamperometría y la inicia. |
0x03 | STOP_MEAS | Detiene la medición en curso. |
La comunicación se ha gestionado a través de otro archivo .c y su cabecera, llamados masb_comm_s.c
y masb_comm_s.h
.
Se ha utilizado un timer del microcontrolador para controlar con exactitud el tiempo pasado entre muestra y muestra. En un archivo timers.c
se han implementado dos funciones, una para el periodo de muestreo de la CV y otro para la CA. El timer es preconfigurado mediante STM32MX y en las funciones se cambia el periodo del timer para ponerlo en función del tiempo enviado por el host. Además, en ese archivo se implementa la interrupción del timer, que cambia el estado a TRUE
de una variable de bandera llamada wait
. Cuando se realiza este cambio, las funciones CV y CA realizaran los pasos y medidas pertinentes, que se indican en los diagramas de flujo que verán más adelante.
Finalmente, la siguiente tabla muestra un resumen de la configuración de los pines usados para el proyecto.
Pin | Alias | Tipo | Descripción |
---|---|---|---|
PA0 | VREF | Entrada analógica | Tensión absoluta del Reference Electrode (RE) VREF utilizada para la medición de VCELL. |
PA1 | ICELL | Entrada analógica | Tensión de salida del TIA utilizada para la medición de ICELL. |
PB8 | SCK | I2C (SCK) | Señal SCK del I2C. Con el bus I2C se controla el DAC del front-end. |
PB9 | SDA | I2C (SDA) | Señal SDA del I2C. Con el bus I2C se controla el DAC del front-end. |
PA5 | EN | Salida digital | Señal de (des)habilitación de la PMU.0 : PMU deshabilitada. 1 : PMU habilitada. |
PB5 | RELAY | Salida digital | Señal de control del relé.0 : Relé abierto. 1 : Relé cerrado. |
PA2 | USART2_TX | USART | Señal de comunicación serie asíncrona para la comunicación con el host. |
En este apartado se presenten los diagramas de flujo del funcionamiento principal de la aplicación y de las dos funcionalidades que realizan las medidas de CV y CA.
En estos últimos diagramas se mencionan Vcell y Vcell (real). El real hace referencia a la tensión obtenida con el ADC, es decir, a la tensión real que se aplica a la celda. Por otro lado, Vcell se refiere a la tensión que se fija con el DAC.
Debido a la Sars-Cov-2, el potenciostato programado no ha podido ser probado en el laboratorio, con muestras reales. Aun así, sí se ha podido probar la validez del código desarrollado, gracias a la utilización de la aplicación de escritorio viSens-S. Esta ha sido desarrollada por el supervisor (y cliente).
Esta aplicación permite elegir los datos de las medidas electroquímicas y transmitir los datos desde el ordenador al microcontrolador, mediante comunicación serie asíncrona (UART). Luego, grafica los datos enviados por el microcontrolador después de haber realizado la medida y también los lista en una tabla.
Su funcionamiento es explicado en el siguiente vídeo.
Como se ha indicado anteriormente, debido a la pandemia provocada por el Sars-Cov-2, el código creado para el funcionamiento del potenciostato no se ha podido poner a prueba en el laboratorio. De todos modos, se han podido hacer pruebas mediante la aplicación viSens-S, utilizando nuestra STM32 Nucleo-F401RE de STMicroelectronics con un potenciómetro. Se ha hecho un divisor de tensión, conectando el variable terminal en las entradas analógicas definidas. A continuación, se puede ver una imagen de la conexión.
Se tiene que tener en cuenta que para poder realizar el test, se ha comentado el código relativo al DAC, puesto que, como no teníamos el componente físico, el microcontrolador se quedaría congelado y el programa no funcionaría.
Las siguientes imágenes muestran los datos obtenidos con el potenciómetro conectado al microcontrolador a través de la aplicación viSens-S. Estos tests han servido para verificar el funcionamiento del código implementado para las dos técnicas comentadas (voltametría cíclica y cronoamperometría) y la conexión entre el host (microcontrolador) y la aplicación de escritorio (viSens-S).
Se ha desarrollado la programación de un potenciostato para la realización de voltametrías cíclicas y cronoamperometrías. El proyecto se ha basado en la programación del microcontrolador de la placa de evaluación STM32 Nucleo-F401RE de STMicroelectronics, mediante el uso del entorno STM32CubeIde. Se ha hecho uso de la herramienta Git y de la plataforma GitHub para la coordinación del trabajo, que ha sido desarrollado en equipo.
En este proyecto se han usado muchos conocimientos básicos para la programación de microcontroladores, que han sido adquiridos a lo largo de la asignatura. Se ha hecho uso de periféricos como los timers con sus interrupciones, de GPIOs, de comunicación serie síncrona (I2C) y asíncrona (UART), de DACs y ADCs. También se ha visto un protocolo de codificación de los datos.
Este proyecto concluye la asignatura de Microcontroladores para Aplicaciones y Sistemas Biomédicos, combinando los aspectos aprendidos a lo largo del semestre. En un semestre, la asignatura nos ha permitido introducirnos en el extenso mundo de la programación de microcontroladores de manera muy práctica, sin olvidar los aspectos teóricos fundamentales y ha despertado en las autoras de este proyecto un profundo interés por seguir aprendiendo las entrañas de estos diminutos sistemas inteligentes como son los microcontroladores y todo el campo que les rodea.