电子血压计
一、背景
??2022年6月,很高興能夠參與到騰訊云AIoT應用創新大賽,有機會認識到各種行業背景的物聯網愛好者,作為一個新手,接觸了面向物聯網領域的TencentOS Tiny系統、騰訊云物聯網開發平臺以及RISC-V芯片的應用實例等。
??高血壓作為一種常見的心血管疾病,大大的增加了心臟、腎臟等器官的負擔,其初期癥狀主要有:頭暈,耳鳴,頭疼以及心悸等;調研可知,市面上銷售有多款醫療監測設備,能夠實現血壓、血糖等生物指標的在線監測,然而依據患者實際使用體驗,大多產品普遍存在精度低、可靠性差等弊端,不能切實滿足用戶的醫療需求;因此,最近借助AloT應用創新比賽探究了TencentOS Tiny系統以及RISC-V芯片在可穿戴醫療設備的應用前景,具體內容如下所示:
圖1 基于TencentOS Tiny的電子血壓計及測量結果項目亮點:
- 基于CH32V_EVB RISC-V開發板,實現了物聯網+血壓計的應用demo;
- 編寫了血壓解算算法:通過FIR濾波的方式從壓力傳感器輸出結果中提取脈搏波信號,相較于基于時域的血壓解算方法,對ADC采樣頻率的依賴程度更低;
- 為人工智能算法應用于慢性病管理提供前提基礎。
二、血壓的測量原理
??市面上銷售的血壓計大多采用示波法檢測血壓的幅值,其工作過程是:1、將袖帶充氣以阻斷動脈血流;2、放氣過程中通過聽診器探究血壓與袖帶壓力之間的關系;3、通過信號調理以及電壓采集電路檢測袖帶的壓力變化,后續利用相應的算法提取脈搏波信號,具體過程如圖2所示:
圖2 血壓監測的過程以及原理——示波法三、項目整體架構
??本項目基于TencentOS Tiny CH32V\_EVB RISC-V開發套件,設計了一款電子血壓計demo,核心的流程框架為:采用壓力傳感器實時采集袖套的壓力變化,后續通過算法解算出血壓幅值,最終上傳到騰訊物聯網云平臺并顯示在騰訊練練小程序端,具體如圖3所示。
圖3 基于TencentOS Tiny的電子血壓計四、硬件組成
4.1 TencentOS Tiny CH32V\_EVB RISC-V開發板
??TencentOS Tiny CH32V\_EVB RISC-V開發板主要包含主控CH32V307、ESP8266 wifi模塊、ST7789屏幕以及WCH-Link等,具體如圖4所示。比賽過程中學習了《TencentOS Tiny RISC-V端云AIoT一體化解決方案示例》,后續為了能夠解決圖像識別算法泛化能力差等弊端,編寫了能夠接收RGB565圖像數據的matlab程序,最后調用yolov5算法實現圖像的識別;具體內容見往期文章【基于TencentOS Tiny的圖像識別案例】。
圖4 TencentOS Tiny CH32V\\\_EVB RISC-V開發板4.2 壓力傳感器
??本項目中采用了XGZT6847A壓力傳感器模塊,廣泛應用于電子血壓計、呼吸機、胎壓計以及壓力儀表等場景;其內部結構主要包含4個壓敏電阻,通過惠斯通電橋將外界壓力信號轉變為電壓信號。該款壓力傳感器的工作原理以及封裝工藝在前期推文中具有詳細描述,具體可以參考:【MEMS壓力傳感器—工作原理】和【mems壓力傳感器—封裝工藝】。
圖5 XGZT6847A壓力傳感器及工作原理4.3 袖套以及輔助元件
??電子血壓計設計過程中需要用到多種輔助元件,主要包含有氣囊、袖帶、轉接口以及杜邦線,具體如圖6所示:
圖6 電子血壓計的配件(氣囊及袖套)五、程序源代碼
??基于TencentOS Tiny的電子血壓計主要用到了CH32V\_EVB開發板的key、ADC模塊、LCD模塊以及WiFi模塊等,具體架構及程序運行流程如圖7所示,項目的核心在于袖帶壓力檢測、血壓計算以及MQTT通信。
圖7 血壓計的架構及程序運行流程5.1 電壓信號采集
??前期研究表明,袖帶壓力的采集精度與血壓計的性能息息相關;近來從硬件成本、技術難度以及工作量等多種角度出發,利用CH32V307板載的adc模塊采集XGZT6847A壓力傳感器的輸出電壓,通過key1和key2分別控制血壓測量的開始及結束時間,所用的程序為:
void xueyacaijiadc(uint32_t yanshi,u8 timess) {u16 ADC_val;while(1){u8 ii=0;u16 i=0;if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)){tos_task_delay(20);if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)){while(1){ADC_val = Get_ADC_Average( ADC_Channel_8, timess );Delay_Ms(yanshi);ADC_val = Get_ConversionVal(ADC_val);xueyashuju(ADC_val,i);i=i+1;if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)){tos_task_delay(20);if(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)){tos_sem_post(&xueyaReady);i=i-1;xueyazhi=xueyajisuan(i);ii=1;break;}}}}}if(ii){break;}} }5.2 濾波算法
??項目實施過程中采用matlab Filter Designer工具箱,通過濾波算法從壓力傳感器的輸出信號中提取脈搏波和袖帶壓兩種特征(基于信號的頻率),具體的參數設置如圖8所示。由人體脈搏波的生理特征可知,其頻率特征一般為0.5-25Hz;考慮到電壓信號的采樣頻率為20hz,本項目采用高通濾波器,具體框架如圖8所示:
圖8 基于matlab的FIR濾波器設計??為了能夠將濾波器應用于嵌入式設備,實現血壓的在線監測,需要將FIR濾波器的參數輸出為C文件格式,具體結果下所示:
#include "tmwtypes.h"const int BL = 277; const real64_T B[277] = {0.004032097827315, -0.01361253802573,2.597171096933e-05, 0.003348334864088,0.003625434828895, 0.003075252870792, 0.002363330670909, 0.001684305478472,0.001086888354097, 0.000577314540584, 0.000150303226719,-0.000203595824125,-0.0004926710990588,-0.0007227263390531,-0.0009016784083378,-0.001032396319006,-0.001120672276141,-0.001168532570402,-0.001180365895233,-0.001156474414754,-0.001101740427144,-0.001015878136264,-0.0009024994467314,-0.0007626855367863,-0.0006023408366827,-0.0004221566176204,-0.0002278010444023,-2.194638011082e-05,0.0001881785279959,0.0003997734340485,0.0006050358020624,0.0008005298221407,0.0009782209243579, 0.001134430633007, 0.001261549186962, 0.001357407502196,0.001415113703677, 0.001433556195906, 0.001408713236901, 0.001341963856305,0.001229572975887, 0.001075239871217,0.0008795732861174,0.0006489666716781,0.0003852551502332,9.872454417174e-05,-0.0002059121142722,-0.0005180020684175,-0.0008320332250745,-0.001134172783683, -0.00141866471304,-0.001671996894583,-0.001888430504748,-0.002055203813477,-0.002170534807299,-0.002222600479273,-0.002212008028482,-0.002130544174645, -0.00198321289329,-0.001762747894781,-0.001481894556659,-0.001137634776605,-0.0007460555145065,-0.0003053610713622,0.0001577643868071,0.0006523796587688, 0.001138643754299, 0.001628607274255,0.002085903767237, 0.002501813092496, 0.002876533604827, 0.003164214837755,0.00338851877287, 0.003517760801587, 0.003539564797592, 0.003462967347778,0.003281533504934, 0.002979428624974, 0.002579062725162, 0.002082149606443,0.001493040074613,0.0008203270186895,9.469626294734e-05,-0.0006720547052417,-0.001463763987657,-0.002259865982444,-0.003026453103984,-0.003743966181793,-0.004391268544832,-0.004948402698578,-0.005386969969742,-0.005688090821732,-0.005835495632912,-0.005821005029434,-0.005632151124321,-0.005262401312117,-0.004709057485807, -0.00398126201767,-0.003089332315323,-0.002049702462558,-0.0008797479345688,0.0003953388863763, 0.001747264964925, 0.003138571980546,0.004531450492127, 0.005886315826933, 0.007166383757553, 0.008329678988278,0.009334244731398, 0.0101362881621, 0.0106984004083, 0.01098554300518,0.01096865186478, 0.0106200513836, 0.009921005429631, 0.00885679757615,0.007419733712968, 0.00560728586161, 0.003430936137808,0.0009078874704657,-0.001938037629184,-0.005077694888244,-0.008470486259104, -0.0120743843455,-0.01584139953131, -0.01971705386372, -0.0236399855461, -0.02755185216501,-0.0313904739043, -0.03509178030298, -0.03859570273574, -0.04184621012791,-0.04478623773664, -0.04736318149261, -0.04954152912819, -0.05127042363801,-0.05253132389338, -0.05329580730867, 0.946448561442, -0.05329580730867,-0.05253132389338, -0.05127042363801, -0.04954152912819, -0.04736318149261,-0.04478623773664, -0.04184621012791, -0.03859570273574, -0.03509178030298,-0.0313904739043, -0.02755185216501, -0.0236399855461, -0.01971705386372,-0.01584139953131, -0.0120743843455,-0.008470486259104,-0.005077694888244,-0.001938037629184,0.0009078874704657, 0.003430936137808, 0.00560728586161,0.007419733712968, 0.00885679757615, 0.009921005429631, 0.0106200513836,0.01096865186478, 0.01098554300518, 0.0106984004083, 0.0101362881621,0.009334244731398, 0.008329678988278, 0.007166383757553, 0.005886315826933,0.004531450492127, 0.003138571980546, 0.001747264964925,0.0003953388863763,-0.0008797479345688,-0.002049702462558,-0.003089332315323, -0.00398126201767,-0.004709057485807,-0.005262401312117,-0.005632151124321,-0.005821005029434,-0.005835495632912,-0.005688090821732,-0.005386969969742,-0.004948402698578,-0.004391268544832,-0.003743966181793,-0.003026453103984,-0.002259865982444,-0.001463763987657,-0.0006720547052417,9.469626294734e-05,0.0008203270186895,0.001493040074613, 0.002082149606443, 0.002579062725162, 0.002979428624974,0.003281533504934, 0.003462967347778, 0.003539564797592, 0.003517760801587,0.00338851877287, 0.003164214837755, 0.002876533604827, 0.002501813092496,0.002085903767237, 0.001628607274255, 0.001138643754299,0.0006523796587688,0.0001577643868071,-0.0003053610713622,-0.0007460555145065,-0.001137634776605,-0.001481894556659,-0.001762747894781, -0.00198321289329,-0.002130544174645,-0.002212008028482,-0.002222600479273,-0.002170534807299,-0.002055203813477,-0.001888430504748,-0.001671996894583, -0.00141866471304,-0.001134172783683,-0.0008320332250745,-0.0005180020684175,-0.0002059121142722,9.872454417174e-05,0.0003852551502332,0.0006489666716781,0.0008795732861174, 0.001075239871217,0.001229572975887, 0.001341963856305, 0.001408713236901, 0.001433556195906,0.001415113703677, 0.001357407502196, 0.001261549186962, 0.001134430633007,0.0009782209243579,0.0008005298221407,0.0006050358020624,0.0003997734340485,0.0001881785279959,-2.194638011082e-05,-0.0002278010444023,-0.0004221566176204,-0.0006023408366827,-0.0007626855367863,-0.0009024994467314,-0.001015878136264,-0.001101740427144,-0.001156474414754,-0.001180365895233,-0.001168532570402,-0.001120672276141,-0.001032396319006,-0.0009016784083378,-0.0007227263390531,-0.0004926710990588,-0.000203595824125, 0.000150303226719, 0.000577314540584,0.001086888354097, 0.001684305478472, 0.002363330670909, 0.003075252870792,0.003625434828895, 0.003348334864088,2.597171096933e-05, -0.01361253802573,0.004032097827315 };??后續將濾波算法部署到主控CH32V307上,具體使用的代碼為:
double state[FIR_FILTER_LENGTH+1]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; void process(double *x,double *y,u16 N) {int i = 0,j = 0,k=0,mm=0;double temp;for (k = 0; k < N; k++){state[0] = x[k];for (i = 0, temp = 0; i < FIR_FILTER_LENGTH; i++)temp += FIR_COFFES[i] * state[i];y[k] = temp;for (j = FIR_FILTER_LENGTH - 1; j > -1 ; j--)state[j+1] = state[j];} }電壓與血壓之間的轉化關系為(ADC與mmHg之間的轉化):
double ADC_mmhg(double adc) {double pressure,mmhg,val_mv;val_mv = (adc*3.3)/4096;pressure=(40*val_mv)/2.7;mmhg=pressure/0.13;return mmhg; }5.3 MQTT通信代碼及騰訊連連小程序設計
??電子血壓計通過MQTT協議將測量結果上傳到騰訊云LoT平臺,具體采用的格式為:
#define REPORT_DATA_TEMPLATE "{\\\"method\\\":\\\"report\\\"\\,\\\"clientToken\\\":\\\"00000001\\\"\\,\\\"params\\\":{\\\"pressure\\\":%d\\}}"后續在騰訊云IoT Explorer中創建項目—創建產品—創建設備—創建數據模板,實現云端設備的對接,核心步驟如圖9所示:
圖9 騰訊云IoT Explorer平臺端云對接的步驟??最后采用騰訊連連的默認的可視化頁面模板,將測量結果進行可視化,具體如圖10所示:
圖10 騰訊連連可視化頁面配置及結果展示六、總結與展望
??電子血壓計設計過程中應該盡可能避免外界干擾,主要有:1. 壓力傳感器的環境適應能力(減小溫度等因素造成的干擾);2. 信號調理電路的誤差;3. AD采樣的速率和精度;4. 血壓解算程序的準確度;希望后續有時間的話對項目進行優化改進。
總結
- 上一篇: 关于网络测试仪
- 下一篇: 自己对mysql中的Join的理解