OXÍMETRO DIGITAL
UNIVERSIDAD NACIONAL DE COLOMBIA.
ELECTRÓNICA DIGITAL II. SERGIO JULIÁN JIMÉNEZ. 1 CAMILO ANDRÉS RUIZ. 1 WISTON ANDRÉS ÑUSTES 1
Contents
|
[edit] Calificación
| Porcentaje | Presentación 20% | Informe 30% | Funcionamiento 50% |
|---|---|---|---|
| 1 Entrega 10% | 0.5 | 0.5 | 0.5 |
| 2 Entrega 30% | 1.7 | 1.7 | 1.7 |
| 3 Entrega 20% | 3 | 3.5 | 4 |
| 4 Entrega 40% | 5 | 5 | 5 |
[edit] OXÍMETRO DIGITAL
El dispositivo consiste en un medidor del nivel de saturación de oxígeno en la sangre. cuenta con una interfaz gráfica que muestra el valor en una pantalla LCD, 2 botones: uno para encender y apagar el sistema y otro para visualizar el menor dato que haya registrado el dispositivo y resetear la memoria(luego de tenerlo presionado por 3 segundos).
[edit] Teoría de Oximetría
Se busca calcular el nivel de saturación de oxígeno en la sangre SaO2 por medio de periféricos y visualizar el dato cada 5 segundos. La técnica para la toma de datos se basa en la absorbancia y transmitancia de luz que tiene el dedo en su extremo. Para esto, se hace incidir luz monocromática con ciertas longitudes de onda (660 nm y 940 nm) y frecuencias en el extremo del dedo de mano, donde la intensidad de luz que incide es diferente de la que sale por el otro lado del dedo, por lo que se habla de la transmitancia como la relación que existe entre la Intensidad de Luz Incidente (Io) y la intensidad de luz que sale del dedo (I): T=I/Io La transmitancia y la absorbancia son inversos, por lo que la absorbancia (A) se define en dB como: A=-log(I/Io) Para la medición se toman en cuenta la absorción de la hemoglobina oxigenada (O2Hb), que absorbe muy bien la luz infrarroja de 940 nm y la hemoglobina desoxigenada (RHb), que absorbe muy bien la luz roja de 660 nm. Es necesario relacionar los valores obtenidos para cada uno de los leds mediante el nivel de saturación funcional: SaO2func=O2 Hb*100%/( O2 Hb+RHb). Es de esperarse, que a medida que la luz viaja por el dedo haya una mayor atenuación de intensidad. En realidad esta disminución se modela mediante una relación exponencial de la siguiente manera: I=Io℮^(-ԑ(λ)*c*d) Donde ԑ(λ) es el coeficiente de extinción del dedo a la longitud de onda correspondiente, c es la concentración de la sangre (constante) y d es un patrón óptico.
[edit] Funcionamiento
Para la toma de datos se utilizará un sensor Nellcor, el cual cuenta con dos leds emisores (que haremos trabajar con las longitudes de ondas especificadas anteriormente) y un fotodiodo receptor. Para hacer una correcta medición, se hace necesario que los 2 diodos no trabajen a la vez, por lo que mediante la FPGA, generaremos señales cuadradas de operación para ambos diodos. El ciclo útil de las señales será muy reducido, con el fin de que en el intervalo inactivo de un Led, el otro se active y además de eso, se permita tener un tiempo en que ninguno de los dos encienda (para que no exista interferencia en las señales). En la figura se puede observar la disposición de los diodos, donde L1 es el led infrarrojo y L2 es el diodo rojo. Como vemos el dispositivo encierra al dedo en su totalidad, con el fin de que no se filtren señales externas que puedan alterar la medición.
Dado que es más sencillo trabajar con tensiones que con corrientes, implementamos un convertidor de corriente a voltaje, posteriormente hacemos un filtrado de la señal entre los 0.5 Hz y los 5 Hz mediante un filtro pasabandas y finalmente amplificamos la señal entre 0 y 5 V para introducirla a la tarjeta madre.
[edit] Especificaciones del Diseño
[edit] Físicas
Se espera que nuestro dispositivo tendra un tamaño de 15 cm * 10 cm * 5cm
[edit] Temporales
Después de encendido, el dispositivo arrojará el primer resultado en aproximadamente cinco(5) segundos, luego de esto se actualizara la medicion en ese mismo intervalo de tiempo.
[edit] Funcionales
Nuesto dispositivo contará con un sensor de oximetría que se pondrá en el dedo del paciente, este estará conectado a una unidad que se encargará de analizar y calcular el valor exacto del nivel de saturación, para luego ser mostrado en el LCD. Para hacer menos vulnerable la medición, se implementará un filtro pasabandas en la entrada del sensor, con el fin de que solamente pasen las señales deseadas.
Como se mencionó anteriormente, el oxímetro contara con 2 botones:
1. Botón 1: prende y apaga el sistema. Para encenderlo, basta oprimir el botón. Para apagarlo, debe pulsarse durante aproximadamente tres segundos.
2. Botón 2: muestra el menor dato que se haya visualizado en pantalla. Si se deja presionado por aproximadamente 5 segundos, dicho valor será reiniciado
[edit] Eléctricas
Nuestro dispositivo se alimentara por una fuente externa
[edit] Particionamiento
[edit] In/Out
[edit] Tareas
[edit] Hardware
1. Conversor análogo digital
2. Conversor corriente-voltaje
3. Toma de datos del sensor
4. Implementación de botones
5. Encendido y apagado del dispositivo
6. Muestra de valores en la pantalla
7. Filtros que eliminen el nivel DC (generado por el usuario en el grosor de su dedo)
8. Muestreo de la señal mediante un sample and hold
9. Obtención de datos del sensor
10. Almacenamiento en memoria del menor dato
11. Sistema temporizador para los leds (no pueden operar los dos a la vez)
12. Apagado del dispositivo
13. Almacenar y visualizar el dato
14. PWM que controle la intensidad de luz de los leds
[edit] Software
1. Procesamiento de la señal para el cálculo del nivel de saturación
2. Máquina de control que verifique concordancia en los datos. Si no hay concordancia, la máquina devuelve error.
[edit] Diagrama de Bloques
[edit] Memory Map
[edit] Periféricos
Para el desarrollo del oxímetro, preveemos la implementación de 5 periféricos que son: Convertidor análogo-digital, GPIO, Procesamiento de señal, PWM y una LCD. A continuación, explicaremos los registros que pertenecen a cada periféricos y posteriormente mostraremos el mapa de memoria:
1. CONVERSOR ANALÓGICO-DIGITAL: se le asignará la dirección de memoria 0xF0050000. Tenemos los siguientes registros:
STATUS(RO):
--ready: indica si terminó o no terminó, es una posible fuente de interrupciones ya que es un flag
CONTROL(WO):
--canalreg: indica cual canal se está ejecutando SALIDA(RO):
datoc: dato de salida del conversor
Hacemos las siguientes asignaciones en memoria:
| Dirección | Tipo | Nombre | |
|---|---|---|---|
| 0x000 | STATUS | ready | |
| 0x001 | DO | datoc | |
| 0x010 | CTRL | canalreg |
Este periférico ocupa 3 direcciones de memoria.
En el siguiente link se puede encontrar un video de funcionamiento del ADC:
http://www.youtube.com/watch?v=ZMT6lo-dztE
2. PROCESAMIENTO DE LA SEÑAL:en este periférico se recibe el valor entregado por el ADC y se realizan operaciones matemáticas para obtener el valor de saturación de oxígeno(SpO2). A este periférico le asignamos la dirección de memoria 0xF0030100. Este periférico debe tomar las señales del led rojo y del led infrarrojo provenientes del ADC (datored y datoifr) y realizar la siguiente función matemática:
"DATA_IN: " datos provenientes del conversor ADC
-[9:0]datored: valor de tension generado por el led rojo
-[9:0]datoifr: valor de tension generado por el led infrarrojo
STATUS(RO):
--ready: indica si se ha terminado de hacer el procesamiento de la señal
CONTROL(WO):
--enreg: señal de start que le dice cuando debe comenzar a procesar
SALIDA(RO):
--[31:0]quotient: dato de salida (porcentaje SpO2)
Asignando entonces estos registros en memoria:
| Dirección | Tipo | Nombre | |
|---|---|---|---|
| 0x000 | DI | [9:0] datored | |
| 0x001 | DI | [9:0] datoifr | |
| 0x010 | CTRL | enreg | |
| 0x011 | DO | [31:0] quotient | |
| 0x100 | STATUS | ready |
Este periférico ocupa 5 direcciones de memoria. A continuación vemos el diagrama de bloques, su diagrama de estados y una simulación del periférico:
En la simulación asumimos que los valores que envia el ADC a datored y datoifr son respectivamente 6 y 29, por lo que al implementar la función matemática presentada al inicio del procesamiento, debemos obtener un valor de 82, el cual vemos en quotient, que corresponde al valor del porcentaje de saturación.
3. PWM
STATUS(RO):
--enreg: registro de habilitación que indica cuando debe comenzar a encender los LEDs
SALIDA(RO):
--d1: señal del LED rojo --d2: señal del LED infrarrojo
Realizando la asignación de direcciones en memoria:
| Dirección | Nombre | Formato | |
|---|---|---|---|
| 0x00 | DO | [d1 , d2] | |
| 0x01 | STATUS | enreg |
Este periférico ocupa 2 direcciones de memoria. A continuación se encuentran el diagrama de bloques y el diagrama de estados del periférico:
4. PANTALLA LCD
DI(RO):
--MENSAJE_0 a MENSAJE_7: caracteres que entran a la pantalla
Asignando los registros en memoria:
| Dirección | Tipo | Nombre | |
|---|---|---|---|
| 0x0000 | DO | [0:31]msjlcd | |
| 0x0001 | DO | [32:63]msjlcd | |
| 0x0010 | DO | [64:95]msjlcd | |
| 0x0011 | DO | [96:127]msjlcd | |
| 0x0100 | DO | [128:159]msjlcd | |
| 0x0101 | DO | [160:191]msjlcd | |
| 0x0110 | DO | [192:223]msjlcd | |
| 0x0111 | DO | [224:255]msjlcd | |
| 0x01 | STATUS | enreg |
Este periférico ocupa ocho direcciones de memoria. puesto que cada direccion solo alcanza para 4 caracteres y usamos 32 caracteres en el lcd, este modulo constantemente esta poniendo en pantalla el contenido del la entrada "mensaje", estos registros son de solo escritura.
A continuación se muestra el módulo en funcionamiento, siendo éste probado en una FPGA NEXYS 2
En la siguiente imagen mostramos una prueba de funcionamiento del LCD en la tarjeta hija, conectada esta a su vez a la tarjeta madre:
El diagrama de bloques del periférico:
5. GPIO
En este módulo controlaremos los 2 botones del dispositivo, que se encargan del encendido y de la visualización del dato. A continuación se encuentran el diagrama de bloques y de estado del periférico:
STATUS(RO):
--led: registro que prende y apaga el led, indica si el oxímetro se encuentra encendido o apagado
DO(WO): -- bot1|deb1: si el botón o el debouncer se encuentran en uno, se toma que el botón sigue presionado -- bot2|deb2
| Dirección | Tipo | Nombre | |
|---|---|---|---|
| 0x00 | DO | [bot1 or deb1 ,bot2 or deb2 ] | |
| 0x01 | STATUS | led |
A continuación se presenta una simulación de la interrupción de la GPIO, que es el único de nuestros periféricos que realiza interrupciones. Para esto, tenemos gpio_intr[1:0], el cual es de dos bits para poder atender las interrupciones de cada uno de los botones del dispositivo. El botón 2 es para la posición 0 y el botón 1 es para la posición 1, es por esto que cuando tenemos un paso de 1 a 0 en el botón 1 se genera una interrupción. Se buscaba que al aplicar un reset al sistema, se generara una interrupción que encendiera un LED, posteriormente cuando se dejara de presionar el botón 1, el LED debería apagarse, tal como se puede ver en la simulación:
[edit] Diagrama de Flujo
[edit] Esquemático Y PCB
[edit] Análisis de Costos del Dispositivo


