EO_481

ANALOG/MIXED SIGNAL BIOLOGICAL SENSOR 38 - ELETTRONICA OGGI 481 - OTTOBRE 2019 un sistema PC Windows tramite Bluetooth e avviare il software del kit di valutazione con GUI basata su Win- dows di Maxim Integrated per il kit MAX86150EVSYS. Il pacchetto GUI mostra i dati ECG e PPG di MAX86150 e consente agli sviluppatori di modificare le imposta- zioni del dispositivo per esaminare l’effetto sulle pre- stazioni (Fig. 6). Agli sviluppatori che desiderano creare applicazioni personalizzate, il driver MAX86150 di Maxim Integra- ted forniscono il codice sorgente per la funzionalità del dispositivo core. Il pacchetto dimostra, tra le altre cose, come lavorare con il FIFO del dispositivo per ridurre al minimo il consumo energetico limitando il tempo per cui il processore host deve rimanere nel suo stato at- tivo. Al centro di questo approccio, il software si basa su una coppia di gestori di interrupt per rispondere agli eventi del dispositivo e intervenire quando sono disponibili campioni di dati. L’approccio pilotato da interrupt inizia con la routine di inizializzazione che registra un handler IRQ (richie- sta di interrupt), max86xxx_irq_handler(). Quando si verifica un evento di interrupt, questo handler verifi- ca i dati disponibili del dispositivo, se necessario ri- chiama un handler FIFO separato (max86xxx_fifo_irq_ handler()) ed esegue importanti funzioni di gestione interna, incluso il controllo della temperatura del die del dispositivo e il livello VDD (Listato 1). Quando viene richiamato dall’handler IRQ del disposi- tivo, l’handler FIFO esegue le operazioni di basso livello richieste per riassemblare le letture dei sensori memo- rizzate dall’86150 nel suo buffer FIFO. Questo handler esegue loop dei campioni disponibili nel buffer FIFO, riassemblando i tre byte utilizzati per memorizzare i dati dall’ADC a 18 bit del canale ECG e dall’ADC a 19 bit del canale PPG (Listato 2). In conclusione, oltre alla misurazione della frequenza cardiaca basata su PPG, a smartwatch, fasce di fitness e altri dispositivi mobili viene chiesta sempre più la funzionalità ECG a canale singolo. Tuttavia, l’imple- mentazione pratica, accurata e a basso consumo sia di PPG che di ECG per questi dispositivi indossabili si è rivelata un compito abbastanza arduo. Una soluzione efficiente è rappresentata dal modulo sensore del biopotenziale 86150 di Maxim Integrated con sottosistemi PPG ed ECG integrati. Abbinato a una MCU, il modulo 86150 consente agli sviluppatori di im- plementare in tempi brevi prodotti mobili per salute e fitness in grado di fornire dati precisi sulle prestazioni cardiache. int max86xxx_irq_handler(void* cbdata) { struct max86xxx_dev *sd = max86xxx_get_device_data(); int ret; union int_status status; status.val[0] = MAX86XXX_REG_INT_STATUS1; ret = max86xxx_read_reg(status.val, 2); if (ret < 0) { printf(“I2C Communication error. err: %d. %s:%d\n”, ret, __func__, __LINE__); return -EIO; } if (status.a_full || status.ppg_rdy || status.ecg_imp_rdy || status.prox_int) { max86xxx_fifo_irq_handler(sd); } if (status.die_temp_rdy) max86xxx_read_die_temp(sd); if (status.vdd_oor) { sd->vdd_oor_cnt++; printf(“VDD Out of range cnt: %d\n”, sd->vdd_oor_cnt); } return 0; } Listato 1 – Questo frammento del pacchetto di driver MAX86150 di Maxim Integrated mostra come un handler IRQ del dispositivo può ridurre al minimo l’elaborazione richiamando un handler FIFO separato solo quando sono disponibili dei campioni o quando si verifica un evento come un interrupt di prossimità (Codice per gentile concessione di Maxim Integrated) void max86xxx_fifo_irq_handler(struct max86xxx_dev *sd) { . . . num_samples = max86xxx_get_num_samples_in_fifo(sd); . . . num_channel = max86xxx_get_fifo_settings(sd, &fd_settings); . . . num_bytes = num_channel * num_samples * NUM_BYTES_PER_ SAMPLE; fifo_buf[0] = MAX86XXX_REG_FIFO_DATA; ret = max86xxx_read_reg(fifo_buf, num_bytes); . . . fifo_mode = max86xxx_get_sensor_mode(sd, fd_settings, num_ channel); . . . sensor = get_sensor_ptr(sd, fifo_mode); for (i = 0; i < num_samples; i++) { offset1 = i * NUM_BYTES_PER_SAMPLE * num_channel; offset2 = 0; for (j = 0; j < MAX_FIFO_SLOT_NUM; j++) { tmp_fd = (fd_settings >> (4 * j)) & 0x000F; if (tmp_fd) { index = offset1 + offset2; tmp = ((int)fifo_buf[index + 0] << 16) | ((int)fifo_buf[index + 1] << 8) | ((int)fifo_buf[index + 2]); samples[tmp_fd] = tmp; max86xxx_preprocess_data(&samples[tmp_fd], 1); offset2 += NUM_BYTES_PER_SAMPLE; } } . . . sensor->report(sensor, samples); . . . } if (sensor->update) sensor->update(sensor); return; . . . Listato 2 – Questo frammento del pacchetto di driver MAX86150 di Maxim Integrated mostra l’uso di un handler FIFO per estrarre i dati campionati da FIFO MAX86150, in cui ogni campione viene memorizzato in un formato a tre byte (Codice per gentile concessione di Maxim Integrated)

RkJQdWJsaXNoZXIy MTg0NzE=