Università degli studi di Roma LA SAPIENZA Corso di ingegneria informatica e automatica Misure e strumentazione Automatica Studio e realizzazione di un pulsossimetro Di Alessandro Giuseppi Fabrizio Gennari All’attenzione del Docente: Prof. Francesco La Gala Sommario Obiettivo e svolgimento....................................................................................................................................................... 3 La Pulsossimetria ................................................................................................................................................................... 3 Il calcolo di πππ2................................................................................................................................................................... 5 Coefficienti di assorbività molare........................................................................................................................................ 7 Problematiche nello studio del segnale ............................................................................................................................. 7 Limiti del modello proposto ................................................................................................................................................. 9 Pulsossimetro ottico a trasmissione ................................................................................................................................... 10 Schemi elettrici.................................................................................................................................................................... 11 Il sensore .............................................................................................................................................................................. 12 Il front end ........................................................................................................................................................................... 14 Microcontrollore ................................................................................................................................................................. 16 Firmware .............................................................................................................................................................................. 21 Analisi dei dati raccolti ....................................................................................................................................................... 22 Calibrazione e testing ........................................................................................................................................................ 26 Video del funzionamento .................................................................................................................................................. 28 Conclusioni .......................................................................................................................................................................... 29 Bibliografia........................................................................................................................................................................... 29 Software utilizzati ................................................................................................................................................................. 29 Autori ................................................................................................................................................................................... 30 2 Obiettivo e svolgimento Il progetto inizierà con un’introduzione alla pulsossimetria, analizzando alcune delle tecniche più utilizzate nelle apparecchiature moderne. Nella seconda parte si analizzeranno le vari fasi della realizzazione di un pulsossimetro, sia per quanto riguarda gli aspetti elettronici che per quelli software. Durante tutta la realizzazione gli autori hanno lavorato in gruppo, proponendo entrambi aspetti, problematiche e soluzioni in un clima di reciproco confronto, approfondendo tal volta aspetti in maniera autonoma per poi sottoporli all’altro e insieme sintetizzarne le conclusioni. La Pulsossimetria La pulsossimetria è una metodica diagnostica che permette di misurare la percentuale di emoglobina legata all’ossigeno nel sangue di un paziente, in modo non invasivo. In particolare si vuole misurare la saturazione percentuale di ossigeno, definita come πΊπ πΆπ = π―ππΆπ π―ππΆπ + π―π Questo indice è di particolare importanza nei pazienti con problemi respiratori o sottoposti ad interventi chirurgici, poiché un deficit di ossigeno nel sangue può portare a danni irreparabili a tessuti e organi e, in alcuni casi, alla morte. Per la natura dell’indice è importante per i medici poter valutare la saturazione di ossigeno in tempo reale, piuttosto che affidarsi a più accurate misurazioni in laboratorio ad intervalli di alcune ore. È inoltre importante che la misurazione non sia invasiva, poiché il paziente potrebbe trovarsi in situazioni critiche (neonato in incubatrice, paziente in ipossia o sotto anestesia) quindi è da escludere il prelievo di un campione di sangue. Per realizzare uno strumento in grado di soddisfare questi requisiti si è dunque pensato di utilizzare le proprietà ottiche della luce, L’emoglobina legata all’ossigeno, π―ππΆπ o ossiemoglobina, e l’emoglobina non legata, π―π o deossiemoglobina, hanno due diversi spetti di assorbimento, ovvero assorbono, al variare della lunghezza d’onda, diverse quantità di luce. Valutando l’assorbimento della luce a due differenti lunghezze d’onda si può misurare il rapporto dellle due emoglobine senza sapere con esattezza la quantità di sangue analizzato. È possibile realizzare due tipologie di pulsossimetri ottici, basati rispettivamente sulla riflessione e sulla trasmissione della luce. 3 Nel primo caso un sensore luminoso è posto vicino a due Led che emettono alternativamente luce rossa e infrarossa, così da poter misurare la quantità di luce riflessa alle due lunghezze d’onda, mentre nel secondo caso uno o due sensori sono posti dall’altra parte del dito (o orecchio) rispetto ai Led. La prima soluzione ha il vantaggio di poter essere applicata su qualsiasi parte del copro, anche in zone di particolare interesse come la zona toracica prossima al cuore, al contrario della soluzione a trasmissione che richiede di essere applicata su un’appendice il più sottile possibile, tuttavia la quantità di luce riflessa è molto inferiore a quella trasmessa, e quindi è necessario impiegare un sensore dotato di una risoluzione ed una sensibilità maggiori rispetto al secondo caso. Siccome, tranne in pazienti critici l’ossigenazione periferica non è sensibilmente diversa da quella centrale, per il resto della trattazione ci limiteremo all’analisi di un pulsossimetro a trasmissione, tuttavia , con le dovute differenze nelle leggi fisiche applicate, l’analisi è valida anche per un pulsossimetro a riflessione. In entrambi i casi esposti in precedenza si sono utilizzate due Led che emettono luce rossa (π~660ππ) ed infrarossa (π~940). Questa scelta è dovuta sia all’alta capacità di attraversare i tessuti organici della luce a lunghezza d’onda superiore ai 600nm sia al comportamento della luce attraverso l’emoglobina a quelle lunghezze d’onda. Nella figura si evidenza il comportamento dell’assorbività molare (o coefficiente di estinzione molare, ovvero l’assorbanza specifica a concentrazione molare unitaria attraverso una cella lunga 1 cm) di Hb e HbO 2 P. isosbestico Si può notare come il comportamento delle due emoglobine è particolarmente diverso alle due lunghezze d’onda scelte per l’analisi. In particolare a lunghezze d’onda attorno ai 660nm l’emoglobina ossigenata assorbe una quantità di luce rossa maggiore dell’Hb, mentre la situazione si inverte per lunghezze attorno ai 940nm. 4 Alcuni pulsossimetri utilizzano al posto della lunghezza d’onda a 940nm la lunghezza prossima all’infrarosso di 805nm, corrispondente al punto isosbestico (l’intersezione tra i due grafici) presente in figura. Se questa scelta da una parte rende più semplice dal punto di vista computazionale (la quantità di luce assorbita dalle due emoglobine è la stessa), la misura richiede l’impiego di una lunghezza d’onda non facilmente ottenibile e non penetrante come quella a 940nm. Il calcolo di πππ2 Fino ad ora si è considerata solo l’emoglobina ai fini dell’assorbimento della luce. Durante l’attraversamento del dito da parte del fascio luminoso, tuttavia, intervengono altri elementi e l’assorbimento della luce si discosta molto dall’assorbimento che si avrebbe se la luce passasse esclusivamente attraverso il sangue. In figura con T è indicata la componente della luce assorbita dai tessuti (ossa ,pelle, unghie),con V quella relativa al sangue venoso e con A la parte relativa al sangue arterioso. Se si assume che l’incremento dell’assorbimento di luce sia dovuto esclusivamente al battito cardiaco, e relativa pulsazione del sangue arterioso, possiamo distinguere nell’attenuazione rilevata un valore costante DC, dovuto all’assorbimento del sangue venoso e dei tessuti, e una parte variabile AC legata alla pulsazione del sangue arterioso. Siccome le altre componenti del sangue (quali il plasma ed i globuli bianchi) non influiscono sensibilmente con l’assorbimento luminoso si può dunque studiare la SpO2 a partire dal segnale pulsante così ottenuto considerando solo l’emoglobina, nelle sue due forme, come unico componente del sangue per il calcolo. 5 Consideriamo un fascio luminoso a lunghezza d’onda π1 che attraversa un’arteria di larghezza L. Ii1 I1 L Sia ππ1 l’ illuminanza del fascio di luce emesso e π1 l’illuminanza del fascio di luce trasmesso attraverso l’arteria. Per la legge di Beer-Lambert si ha: πΌ1 = πΌπ1 10−( πΌπ1 πΆπ+ πΌπ1 πΆπ )πΏ Con πΌπ1 e πΌπ1 i coefficienti di assorbività molare di ossiemoglobina e deossiemoglobina, e πΆπ eπΆπ le rispettive concentrazioni molari. Nella stessa situazione, con un fascio di luce con lunghezza d’onda π2 si ha: πΌ2 = πΌπ2 10−( πΌπ2 πΆπ + πΌπ2 πΆπ )πΏ Posto π = log10 ( πΌ1 ⁄πΌπ1 ) log10 ((πΌ1π΄πΆ + πΌ1π·πΆ )⁄πΌπ1 ) = = log10 ( πΌ2 ⁄πΌπ2 ) log10 ( (πΌ2π΄πΆ + πΌ2π·πΆ )⁄πΌπ2 ) πΌπ1 πΆπ + πΌπ1 πΆπ = πΌπ2 πΆπ + πΌπ2 πΆπ Si può ricavare: πππ2 = πΆπ πΌπ2 π − πΌπ1 = πΆπ + πΆπ (πΌπ2 − πΌπ2 )π − ( πΌπ1 − πΌπ1 ) Noti i vari coefficienti πΌ, ottenuti tramite analisi in laboratorio su campioni di sangue, l’intero problema si riduce quindi al calcolo di R. 6 Coefficienti di assorbività molare Alleghiamo nella tabella i valori per il coefficiente di estinzione (in πΏ β ππ−! β ππ−1 ) calcolati in laboratorio. W.G.Zijistra,A. Buursma, “Absorption spectra of human fetal and adult oxyhemoglobin and de-oxyhemoglobin’’ Clin.Chem.,vol 37[1] Problematiche nello studio del segnale Il segnale che analizzeremo avrà la forma dell’onda sfigmica 7 Sarà quindi periodico e non costante. Per determinare il valore delle luci assorbita da inserire nel rapporto per il calcolo di πππ2 abbiamo due scelte: ο· Considerare due valori esattamente in fase tra i due segnali ο· Considerare un valore ‘’medio’’ La prima soluzione, benché formalmente più corretta è di difficile realizzazione pratica anche nel caso in cui i due segnali venissero generati e analizzati perfettamente in parallelo. La seconda opzione risulta realizzabile se si considera la tensione efficace della componente AC del segnale studiato. Questo tuttavia rende non più adeguatamente accurata la relazione proposta in precedenza, poiché escluderebbe totalmente la parte DC. Grazie a studi su pazienti volontari è stata stimata una relazione empirica tramite interpolazione lineare tra il rapporto delle sole componenti AC dei due segnali. π ′ = πΌ1π΄πΆ πΌ2π΄πΆ Dove in questo caso la lunghezza d’onda 1 è 660nm e la lunghezza d’onda 2 è 940nm. La relazione trovata, prendendo in esame solo pazienti aventi un ππ π2 superiore al 90% è la seguente: πππ2 = −0.342 ∗ π ′ + 1.167[2] Per quanto riguarda l’analisi della frequenza cardiaca si incontra un ulteriore problema: la presenza dell’incisura dicrota, corrispondente al secondo picco in figura, dovuto alla natura elastica del sistema arterioso, che trasmette un’onda generata dal battito del cuore indipendentemente dal flusso sanguigno. Se si procedesse ad uno studio sui massimi relativi del segnale si rischierebbe di dimezzare il periodo del battito. Per ovviare a questo problema, essendo il segnale periodico e sufficientemente simile ad una sinusoide si passerà all’analisi in frequenza dello stesso, e si assumerà come sua frequenza la frequenza della pulsazione caratteristica. 8 Limiti del modello proposto L’equazione per il calcolo di πππ2 risulta essere semplificata rispetto ad un’analisi più analitica del fenomeno. Si è supposto di poter escludere la componente continua del segnale in maniera perfetta, si è considerato il sangue venoso come non pulsante o comunque ininfluente al calcolo della componente variabile dell’assorbimento (limite presente in un gran numero di strumenti professionali, poiché ininfluente per pazienti privi di patologie particolari) e si sono trascurate tutte le assorbitività molari dei componenti secondari del sangue. Ai fini della misura si è ritenuto che tali semplificazioni rientrassero nella tollerabilità dell’analisi, in strumenti dedicati a pazienti con patologie o condizioni particolari tali semplificazioni potrebbero non essere tollerabili. Passiamo ora allo studio dello strumento vero e proprio. 9 Pulsossimetro ottico a trasmissione Schema a blocchi Alleghiamo di seguito uno schema di massima del pulsossimetro. Per evitare fenomeni di interferenza tra i due fasci di luce si è deciso di utilizzare una soluzione in multiplexing. Tramite il MUX I/O del microcontrollore si accenderanno in modo alternato i due led, ed un unico fotodiodo rileverà la luce dall’altra parte del tessuto in esame. Il segnale passa poi per un blocco di Front-end in cui viene amplificato e filtrato, per raggiungere il convertitore A/D del controllore, il quale invia all’interfaccia seriale del computer, tramite il proprio UART ed un convertitore max 232, i campioni raccolti. Sul pc sarà utilizzato un software per mostrare i segnali da studiare e saranno svolte le operazioni finali per il calcolo del πππ2. Si è preferito l’uso di un pc per permettere un’analisi più approfondita dei segnali grazie agli strumenti ad alto livello disponibili sulla piattaforma. Uno strumento totalmente autonomo dal computer è possibile previa modifica del firmware del pic ed eventuale impiego di alcuni OpAmp, tuttavia, per questa soluzione, è necessaria una qualità costruttiva e un’attenzione al rumore maggiori rispetto a quanto è normalmente possibile con strumentazioni puramente amatoriali. 10 Schemi elettrici 11 Il sensore Il sensore è stato implementato nel seguente modo: Un led IR e un led Red operanti rispettivamente ad una lunghezza d’onda di 940 e 660 nm montati sul lato opposto rispetto ad un fotodiodo dotato di una larghezza di banda che comprenda l’intervallo 660-940 nm. L’utilizzo del fotodiodo è stato deciso rispetto altre due alternative (foto resistenza o fototransistor) in quanto ha una risposta temporale più veloce e una larghezza di banda migliore (più stretta) eliminando così componenti indesiderate. I componenti utilizzati saranno: - led IR tipo LD271; - led Red tipo LX5093XRC; - fotodiodo tipo BPW20RF; Si riportano di seguito le risposte in frequenza dei tre componenti: led IR tipo LD271 12 - led Red tipo LX5093XRC - fotodiodo tipo BPW20RF Si noti che la risposta in frequenza del fotodiodo a 660 nm è più bassa di circa un 35% rispetto a quella a 940 nm. Questo fenomeno potrà essere compensato via hardware o via software. 13 Il front end La funzione del blocco “front-end” è quella di polarizzare correttamente il fotodiodo e di trasformare la variazione in corrente ΔId in una tensione ΔV. Questo è ottenuto tramite un transimpedance amplifier. Considerando che l’A/D utilizzato accetterà tensioni comprese tra 0 e 5 V, il front-end dovrà amplificare il segnale ΔV proveniente dal transimpedance amplifier. A tale segnale andrà sommata una tensione costante di 2,6 V (piedistallo) per due motivi: 1) centrare il segnale in uscita al centro della dinamica dell’A/D (0-5 V); 2) permettere agli operazionali di lavorare a una tensione di alimentazione singola (+9V) invece che duale (+9 V e -9V) Così facendo lo zero sarà traslato in 2,6. La scelta di 2,6V invece dell’esatta metà del range in input dell’A/D (2,5 V) è stata dettata semplicemente da ragioni di reperibilità del diodo Zener. Il blocco front-end può essere suddiviso in cinque differenti sotto blocchi, come riportato nella figura seguente. Questa divisione sarà utile per andare a definire i singoli guadagni. Per semplicità si trascureranno i circuiti di filtraggio i quali verranno trattati più avanti. 2,4π √2 Il segnale Ac in uscita dal FrontEnd sarà quindi su un piedistallo di 2,6Vdc e potrà assumere come massimo valore di picco Vp=2,4V (per Vp >2,4V andrebbe oltre il fondo scala dell’A/D). Il suo valore efficace, che d’ora in poi indicheremo con V, sarà V3=V2=2,4/√2 =1,68V. Si noti che l’uscita di Amp3 è messa in corto circuito con l’ingresso invertente (-) questo fa in modo che si abbia un guadagno K3 unitario. Amp3 è quindi un buffer, o inseguitore di tensione. Imponiamo ora i guadagni K2=K1=48 e il valore di attenuazione dell’attenuatore variabile ATT a K a=1/2 . In questo modo si ottiene Va=0,35V, V1=70mV, V=1,45mV. Vediamo nel dettaglio quanto appena detto. 14 Il transimpedance amplifier deve trasformare una variazione di corrente in una variazione di tensione. La costante k che legherà le due grandezze sarà dunque un valore di resistenza. Questo è valido ovviamente nel caso più semplice in cui in ingresso ci sia una corrente continua (il condensatore C3 si comporta come circuito aperto). Nel caso più generale si dovrà tener conto anche dell’impedenza del condensatore quindi il rapporto tra le due grandezze sarà: ΔV= ΔI[1/R1 + (1/jωC3)- 1]-1= ΔI[1/R1 + jωC3]-1= ΔI[(1 + R1 jωC3)/ R1]-1= [R1/(1 + R1 jωC3)] ΔI Tracciando i diagrammi di Bode di R1/(1 + R1 jωC3) è facile osservare che come pulsazione di attraversamento si ha ωattr.= (R1C3)-1. Considerando che R1=K=V/Id=1,5Mβ¦ e che si è deciso di tagliare la banda attorno ai 20Hz ricaviamo C3=4’700pF. Alleghiamo di seguito il diagramma di Bode nella configurazione scelta. Ragionamenti analoghi valgono anche per gli amplificatori dei blocchi 2 e 3. Passiamo ora alla implementazione circuitale dei singoli blocchi, riferendoci allo schema elettrico. Il circuito di referenza che genera la tensione Vref di 2,6Vdc è realizzato dal diodo zener D1 imponendo una corrente di zener Iz=10mA otteniamo R4=(Vb-Vz)/Iz=(9-2,6)/10mA =640 ohm (680ohm) dove Vb è la tensione di alimentazione (batteria 9Vdc). I due circuiti integrati IC1 e IC2 sono di tipo LM324 il quale contiene al suo interno quattro operazionali. 15 Il TIA (TransImpedance amplfier) è rappresentato nello schema da IC2 (pin 3,2,1) in cui la resistenza di 1,5Mohm prima calcolata ne definisce il guadagno mentre i due condensatori C1 e C2 sopprimono disturbi ad alta frequenza. La rete resistiva R2,R3 stabilisce una polarizzazione di circa 0,4Vdc necessaria all’operazionale per operare correttamente. I due AMP1 e AMP2 sono due amplificatori realizzati rispettivamente da IC1(pin 1,3,2) e IC1(pin 6,5,7) aventi lo stesso guadagno K1=K2 = 1+R7/R6=48 per K1 e 1+R10/R9 per K2 , AMP3 è realizzato da IC1(pin 9,10,8) e il suo guadagno K3 è unitario (Buffer). Nel circuito i condensatori C4, C5, C6 hanno funzioni di filtraggio della tensione di alimentazione. Tra AMP1 e AMP2 troviamo l’attenuatore ATT che è realizzato con un trimmer da 10 Kohm e permette di attenuare il segnale da 0 a 1. Microcontrollore La frequenza del segnale proveniente dal front-end varia tra 0,5 Hz e 3.5 Hz, corrispondenti rispettivamente a 30 e 210 battiti per minuto, con una tensione massima di 5 V. Considerando un passo di discretizzazione intorno ai 5 mV (peso dell’ LSB) con un fondo scala di 5 V otteniamo: 1 2π *5 = 5 ∗ 10−3 π = [3 ∗ πππ2 (10)] con [] := intero superior da cui n = 10 bit Si decide di campionare il segnale a una fs (frequenza di campionamento) compresa tra 900 e 1100 campioni/s. Questa scelta permetterà una ricostruzione fedele del segnale campionato, essendo ben maggiore della frequenza minima di campionamento. Si ricorda che, per il teorema del campionamento, sarebbe sufficiente una frequenza doppia rispetto alla banda del segnale in ingresso, che nel nostro caso corrisponderebbe a 3,5 Hz, non considerando le armoniche di ordine superiore in quanto tagliate dai filtri del front-end. Stabilita la frequenza di campionamento passiamo a calcolare la velocità di trasferimento dei dati seriali dal microcontrollore al PC. Si stabilisce che il protocollo di scambio dati tra microcontrollore e computer è di tipo RS232 asincrono con le seguenti caratteristiche: 16 - 1 start bit - 8 bit di dato - No parity - 1 stop bit Segue dunque che per ogni byte da trasmettere verranno impiegati 10 bit. Sotto queste condizioni andiamo a definire la baude rate. Il microcontrollore dovrà trasmettere 2 byte ogni millisecondo in quanto l’A/D converte a 10 bit. Tenendo presente che ad ogni byte vanno aggiunti lo start e lo stop bit si trasmetteranno 20 bit ogni millisecondo. Le velocità standard maggiormente utilizzate dal protocollo RS232 sono 4800 bit/s, 9600 bit/s, 19200 bit/s, 38400 bit/s et cetera. Dovendo trasmettere in un millisecondo 20 bit il bit time sarà 1/20 ms ovvero 50 µs. Alla velocità di 38400 bit/s si otterrà un bit time di 1/38400 s ovvero 26 µs. Il totale dei due byte (20 bit) richiederà 520 µs, evitando così la perdita di dati. Si assumerà quindi la velocità di trasferimento dati di 38400 bit/s. I requisiti minimi del microcontrollore dovranno essere: - A/D di 10 bit con tempi di conversione inferiore al millisecondo; - porta UART a 38400 bit/s; - tre porte di I/O per gestire il led IR, red e led di stato. Dopo un’analisi costo\prestazione dei vari modelli di microcontrollore è stato scelto il componente della MicroChip 16F876A le cui caratteristiche principali sono riassunte nella tabella seguente. 17 I dati provenienti dall’A/D (10 bit) saranno trasmessi al computer secondo il seguente protocollo: L’Host (computer) invia tramite seriale il carattere Ascii ‘i’ per avviare una campagna di acquisizione accendendo il led Ir, e ‘r’ per avviare l’acquisizione dal led Red. I dati saranno codificati nel seguente modo: LeastSignificantByte indici pari (0 , 2, 4, ecc.); MostSignificantByte indici dispari (1,3,5 ecc.). L’A/D per ogni campagna (Ir e Red) di acquisizione effettuerà 16382 conversioni ed il micro invierà al computer 16382 x 2 = 32768 Byte Il tempo di acquisizione per ogni campagna sarà di circa 16 sec (ogni acquisizione dura poco meno di 1 ms) Nello schema elettrico viene riportato lo schema del Micro Controller e dell’interfaccia MAX232 ricavati dai rispettivi data sheeet. Nonostante il PIC16f876A possa lavorare ad una frequenza di 20MHz, per le nostre esigenze lo utilizzeremo con una frequenza di clock di 8MHz, Tc =0,125uS. 18 Associazione pin 16F876A alla relativa funzione : Pin 1 ----ο MasterClear & Vpp (per programmazione chip) Pin 2----ο An0 ingresso A/D (proveniente dal FrontEnd) Pin 8----ο Vss (massa alimentazione 5Vdc proveniente da USB computer) Pin 9----ο Osc1 (quarzo 8 MHz) Pin 10--ο Osc2 (quarzo 8 MHz) Pin 17--ο TX (uscita seriale trasmettitore) Pin 18--ο RX (ingresso seriale Ricevitore) Pin 19--ο Vss (massa alimentazione 5Vdc proveniente da USB computer) Pin 20--ο Vdd ( alimentazione +5Vdc proveniente da USB computer) Pin 21--ο RB0 ( porta I/O uscita stato acquisizione comanda led) Pin 22--ο RB1 ( porta I/O uscita comando eccitazione led Ir) Pin 23--ο RB2 ( porta I/O uscita comando eccitazione led Red) Pin 27--ο PGC ( porta per programmazione micro) Pin 28--ο PGD ( porta per programmazione micro) Tutti i restanti pin non sono usati. Descrizione Connettori In/Out J1---ο Connettore per programmazione connesso a MPLAB ICD3 Programmer J2---ο Connettore USB per alimentazione +5Vdc proveniente dal computer J3---ο Connettore per collegamento a porta RS232 del computer Tp1ο Connettore ingresso A/D proveniente dal FrontEnd Tp2ο Connettore collegamento diodi Ir e Red 19 Il componente MAX232 è stato utilizzato secondo quanto previsto dal produttore 20 Firmware Compatibilmente al protocollo di trasferimento descritto analizziamo il firmware del PIC. Il firmware è stato scritto utilizzando l’ambiente di sviluppo MPLAB e il modulo HI-TECH che permette di scrivere il codice in C. #include<htc.h> #include<pic.h> #define _XTAL_FREQ 8000000 #include "uart.h" #define Acquire RB0 #define Ir RB1 #define Red RB2 void main() {int i=0; unsigned char a; TRISB = 0x00;//inizializzazione PIC TRISC = 0x00; UART_Init_38400(); ADC_Init(); do { if(UART_Data_Ready()) a = UART_Read();//legge l'istruzione inviata dal pc. 'i' attiva l'infrarosso, 'r' il rosso if(a== 'i') {Acquire=1;//accende il led di stato Ir=1;//accende il led IR ADC_Read(0);//avvia la lettura dell’adc UART_Write(ADRESL);//8 bit meno significativi (nel PIC sono presenti due registri separati per la gestione dell'AD) UART_Write(ADRESH);//2 bit più significativi __delay_us(5); i++; if(i>=16384){i=0;a=0;Ir=0; }//se sono stati prelevati campioni a sufficienza } if(a== 'r')//caso del rosso,considerazioni equivalenti al caso precedente {Acquire=1; Red=1; ADC_Read(0); UART_Write(ADRESL); UART_Write(ADRESH); __delay_us(5); i++; if(i>=16384){i=0;a=0;Acquire=0;Red=0; } } }while(1);//loop } 21 Analisi dei dati raccolti Ora che abbiamo inviato i nostri campioni al computer dobbiamo studiarli per estrapolare le informazioni che ci interessano ai fini della misura. Per lo sviluppo di un’applicazione adatta ai fini proposti si è deciso di impiegare CVI, potente e versatile IDE sviluppato dalla National Instruments e disponibile per gli studenti come trial gratito sul loro sito. Andremo ora ad allegare ed analizzare alcuni frammenti di codice. L’interfaccia utente è stata così organizzata: 22 Andremo ora ad analizzare le varie funzioni relative ai singoli elementi dell’interfaccia. int CVICALLBACK StartCallback(int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { int32 error=0; char chan[256]; uInt32 sampsPerChan; float64 min,max,rate; int log; char errBuff[2048]={'\0'}; if( event==EVENT_COMMIT ) { GetCtrlVal(panel,PANEL_RS232,&comport);//identificazione della porta e del device connesso Fmt (devicename, "%s<%s%i", "Com", comport); if (ConfigCom()==-1) return -1; SetCtrlAttribute (panel, PANEL_START, ATTR_DIMMED, 1);//disattiva il pulsante start ProcessSystemEvents ();//refresh dell'applicazione a schermo GetCtrlVal(panel,PANEL_MINVAL,&min); GetCtrlVal(panel,PANEL_MAXVAL,&max); GetCtrlVal(panel,PANEL_RATE,&rate); GetCtrlVal(panel,PANEL_SAMPSPERCHAN,&sampsPerChan); SetCtrlAttribute(panel,PANEL_STRIPCHART,ATTR_XAXIS_GAIN,1.0/rate);//imposta la scala sull'asse x log = (int)log10(rate); //setto gli attributi del grafico SetCtrlAttribute(panel,PANEL_STRIPCHART,ATTR_XPRECISION,log); SetCtrlAttribute(panel,PANEL_STRIPCHART,ATTR_POINTS_PER_SCREEN,10000); SetCtrlAttribute(panel,PANEL_STRIPCHART,ATTR_NUM_TRACES,1); ComWrtByte (comport,'i' ); //inizia l'acquisizione dei dati dal micro,richiedendo prima l'analisi infrarossa. t0=Timer(); while (LengthQ <32768 && t<= 20)//limite di tempo per evitare loop infiniti in caso di malfunzionamenti { t=Timer()-t0; LengthQ = GetInQLen (comport); //legge la lunghezza della coda di informazioni disponibile sulla porta,se sono 32768 esce } if (LengthQ>=32767) //se effettivamente sono disponibili i dati e non si è verificato time out {ComRd (comport, Rs232Data, LengthQ);//salva nel vettore Rs232Data i 23 valori sulla coda in ingresso for(i=0;i<=LengthQ;i=i+2) {IrData[i/2]=(Rs232Data[i])+ (Rs232Data[i+1])*256;IrData[i/2]=IrData[i/2]*5/1024;}//ricostruisce l'informazione effettuando uno shift di 8 bit per le informazioni salvate nel secondo blocco di dati, e li moltiplica per il passo di quantizzazione 5/1024 per riconvertire i valori in volt SetCtrlVal (panelHandle,PANEL_SAMPLES, LengthQ); ACDCEstimator (IrData, LengthQ/2, &AcComponent, &DcComponent);//stimiamo il valore efficace della tensione. Questo permetterà di ottenere una misura notevolmente migliore nel calcolo di spO2 al momento del rapporto finale AutoPowerSpectrum (IrData,LengthQ/2 , 1/rate, Amplitude, &Freq);//viene effettuata la trasformata di fourier a partire dai campioni contenuti in IrData. La trasformata viene fornita come elenco delle ampiezze relative alle frequenze componenti. MaxMin1D (Amplitude,LengthQ/2 , &MaxVal, &MaxIndex, &MinVal, &MinIndex);//otteniamo gli indici del massimo e del minimo del vettore if(AcComponent<=0.1) FrequencyIr=0;//se non avviene una misura verosivime è inutile procedere nei conti else FrequencyIr=((MaxIndex+1) * Freq)*60;//convertiamo la frequenza fondamentale (quella dall'ampiezza maggiore) in battiti al minuto PlotStripChart(panelHandle,PANEL_STRIPCHART,IrData,10000,0,0,VAL_DOUBLE); //stampa dei campioni sul grafico SetCtrlAttribute(panel,PANEL_STRIPCHART,ATTR_NUM_TRACES,2);//predisposizione del grafico per la seconda traccia SetCtrlVal (panelHandle,PANEL_AC_IR, AcComponent); } ///analisi del rosso,stesse considerazioni del caso precedente t0 = Timer (); ComWrtByte (comport,'r' ); t0=Timer(); while (LengthQ <32768 && t<= 20) { t=Timer()-t0; LengthQ = GetInQLen (comport); } if (LengthQ>=32767) {ComRd (comport, Rs232Data, LengthQ); for(i=0;i<=LengthQ;i=i+2) {RedData[i/2]=(Rs232Data[i])+ (Rs232Data[i+1])*256;RedData[i/2]=RedData[i/2]*5/1024;} SetCtrlVal (panelHandle,PANEL_SAMPLES, LengthQ); ACDCEstimator (RedData, LengthQ/2, &AcComponent, &DcComponent); AutoPowerSpectrum (RedData,LengthQ/2 , 1/rate, Amplitude, &Freq); MaxMin1D (Amplitude,LengthQ/2 , &MaxVal, &MaxIndex, &MinVal, &MinIndex); if(AcComponent<=0.1) FrequencyRed=0; 24 else FrequencyRed=((MaxIndex+1) * Freq)*60; SetCtrlVal (panelHandle,PANEL_AC_RED, AcComponent); ///fine analisi rosso if(FrequencyIr==0 || FrequencyRed==0)Frequency=0;//se c'è stato un errore invalida la misura else Frequency=(FrequencyIr+FrequencyRed)/2;//altrimenti fa la media delle due frequenze ricavate SetCtrlVal (panelHandle,PANEL_FREQ, Frequency);//stampa della frequenza for(i=0;i<=16384 ;i++) {IrRedData[2*i]= IrData[i];IrRedData[2*i+1]= RedData[i];}//si crea un vettore unico adatto ad essere stampato sul grafico PlotStripChart(panelHandle,PANEL_STRIPCHART,IrRedData,20000,0,0,VAL_DOUBLE);/ /stampa dei due segnali spo2=-0.342*(AcComponent2/AcComponent)+ 1.167;//calcola spo2 SetCtrlVal(panel,PANEL_SPO2,spo2);//stampa spo2 } SetCtrlAttribute (panel, PANEL_START, ATTR_DIMMED, 0); //riattiva il pulsante start } return 0; } 25 Calibrazione e testing 26 27 Video del funzionamento (video disponibile anche a: http://www.youtube.com/watch?v=CChBlzBni5w&feature=youtu.be) 28 Conclusioni Il progetto ha analizzato tutte le tematiche relative alla pulsossimetria e alla realizzazione di un pulsossimetro, cercando, dove possibile, di entrare nello specifico. Con opportune modifiche le considerazioni fatte sono valide anche per la realizzazione di altri macchinari medici. Negli ospedali si stanno diffondendo sempre più sistemi d’automazione, dal semplice controllo di parametri vitali collegato ad allarme a veri e propri robot, come il ‘’da Vinci’’ della Intuitive Surgical in grado di operare pazienti. Sono in corso studi da svariati anni di dispositivi automatici in grado di somministrare farmaci salvavita o intervenire in vario modo su pazienti critici quando vengono rilevate anomalie in determinanti parametri fisiologici, l’ormai diffuso peacemaker ne è un esempio. Tutti questi sistemi hanno come requisito fondamentale l’affidabile misurazione delle grandezze di interesse. Una misura non adeguata può portare alla morte del paziente stesso, per questo motivo lo studio dell’automazione in ambito medico è di primaria importanza. Bibliografia [1] W.G.Zijistra,A. Buursma, “Absorption spectra of human fetal and adult oxyhemoglobin and de-oxyhemoglobin’’ Clin.Chem.,vol 37 [2] Wukitisch MW, Peterson MT, Tobler DR, Pologe JA: Pulse oximetry:analysis of theory, technology, and practice. J Clin Monit 1988, 4:290-301. Medical Electronics,Dr. Neil Townsend,Michaelmas Term 2001 32-42 Pulse Oximeter Fundamentals and Design, Santiago Lopez 2012 Pressione arteriosa,Grassi Software utilizzati CVI MPLAB HI TECH Microsft Office 29 Autori Fabrizio Gennari email:[email protected] Alessandro Giuseppi email:[email protected] Università degli studi di Roma La Sapienza 3° anno Ingegneria Informatica ed Automatica, indirizzo Automatica 30