別看了,題文不符,我本來寫腦電,后來不小心搞成AED科普了。
開源EEG-腦電采集硬件KS108x
TGAM腦電模塊-實(shí)戰(zhàn)應(yīng)用(良好封裝版)
腦電采集+TGAM腦電模塊
這個(gè)板子是官方的開發(fā)板(貴死)
真貴啊,700+可以買個(gè)FPGA的板子玩了。。。
沒辦法,為了MCU的源碼沖了。
便攜腦電方案評測——信號采集及方案開發(fā); 微弱電信號傳感——毫伏級電信號監(jiān)測性能評估及數(shù)據(jù)采集。
V3
V2.1
支持DC耦合和AC耦合輸入模式配置; 就是一開始輸入的開關(guān)
具有靈活的開關(guān)和接口選擇實(shí)現(xiàn)電路配置;
媽的,只能說貴,就這點(diǎn)物料設(shè)計(jì)就100多,含淚掙我600,如果固件好,我就不說什么了。
我就看上這個(gè)GUI配置傳感器了,我必須下面搓一個(gè)
在上面的一溜,就是控制通道開閉和增益以及濾波器的,好像就這樣了
這個(gè)上位機(jī)的軟件呢,我也得看看怎么個(gè)事
使用QT6寫的,libwinpthread 是 Windows 上的 POSIX 線程庫。在 Windows 平臺上,POSIX 線程(Pthreads)是一種用于多線程編程的標(biāo)準(zhǔn)。libwinpthread 提供了對這些標(biāo)準(zhǔn)線程功能的支持,使得在Windows 上的應(yīng)用程序能夠更容易地移植和運(yùn)行POSIX 線程。使用了多線程和OpenGL實(shí)現(xiàn)炫酷的效果。
我多線程不會??!不會就不會了,不耽誤我中午吃飯。
對一個(gè)用戶來講,他是不管你芯片有多好,他只看你的效果好不好,很膚淺的就是看一個(gè)可視化的圖,他不懂濾波,就知道看圖有沒有什么毛刺。
而且一個(gè)芯片里面這么多的寄存器,固件里面一次寫死也不好,尤其是你要當(dāng)肯定比給別人用。OK,那就淺淺的來實(shí)現(xiàn)一下。
實(shí)現(xiàn)串口接收指令并通過SPI接口配置傳感器的功能
初始化串口和SPI模塊:在代碼中初始化串口和SPI模塊,配置它們的參數(shù),包括波特率、數(shù)據(jù)位、停止位等。
// 串口初始化 HAL_UART_Init(&huart1); // SPI初始化 HAL_SPI_Init(&hspi1);接收串口指令:使用UART中斷或輪詢方式,從串口接收指令。當(dāng)有數(shù)據(jù)到達(dá)時(shí),需要解析接收到的數(shù)據(jù)以獲取控制傳感器的指令和參數(shù)。
// 串口接收 HAL_UART_Receive_IT(&huart1, rxBuffer, RX_BUFFER_SIZE);在UART的回調(diào)函數(shù)中處理接收到的數(shù)據(jù),解析指令:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { // 解析接收到的指令并執(zhí)行相應(yīng)的操作 parseAndExecuteCommand(rxBuffer); // 重新啟動串口接收 HAL_UART_Receive_IT(&huart1, rxBuffer, RX_BUFFER_SIZE); }配置SPI并發(fā)送數(shù)據(jù)到傳感器:根據(jù)接收到的指令,配置SPI參數(shù),并將相應(yīng)的數(shù)據(jù)發(fā)送到傳感器。
// SPI數(shù)據(jù)傳輸 HAL_SPI_Transmit(&hspi1, txBuffer, TX_BUFFER_SIZE, HAL_MAX_DELAY);實(shí)現(xiàn)指令解析和傳感器配置函數(shù):編寫函數(shù)來解析串口接收到的指令并配置傳感器。
void parseAndExecuteCommand(uint8_t *command) { // 解析指令并執(zhí)行相應(yīng)的操作 if (command[0] == 'C' && command[1] == 'F') { // 配置傳感器寄存器 configureSensorRegisters(command + 2); // 傳遞參數(shù)部分 } } void configureSensorRegisters(uint8_t *parameters) { // 根據(jù)參數(shù)配置傳感器寄存器 // 將參數(shù)寫入SPI緩沖區(qū)并通過SPI接口發(fā)送到傳感器 }
一般是要寫在中斷里面,解析接收到的指令并執(zhí)行相應(yīng)的操作,然后重新啟動中斷,根據(jù)接收到的指令,配置SPI參數(shù),并將相應(yīng)的數(shù)據(jù)發(fā)送到傳感器。
中斷里面是來把要控制的操作取出來,然后使用SPI發(fā)出去
這些代碼有點(diǎn)兒戲,讓我來寫一點(diǎn)工程化的東西。
不妨先寫一個(gè)控制傳感器的函數(shù),通常會實(shí)現(xiàn)解析和處理傳感器配置參數(shù)
函數(shù)檢查接收到的命令是否以"CONFIGURE:"開頭。如果是,它提取參數(shù)并調(diào)用configureSensorRegisters來處理和配置傳感器。
函數(shù)是一個(gè)回調(diào)函數(shù),當(dāng)通過UART接收到字節(jié)時(shí)會執(zhí)行。它收集接收到的字符,直到遇到換行或回車字符,表示命令的結(jié)束。然后,它使用parseAndExecuteCommand()處理接收到的命令。
因?yàn)槭侵袛啵锩嬉矝]有什么好寫的
接下來看看電極分類
現(xiàn)在很多的都用音頻接口來連接電極
這個(gè)是開發(fā)板上面的4個(gè)引腳
這個(gè)是在繪制的裝配圖,給了AD的封裝
這個(gè)是TI的,可以看到在共模干擾這塊還是優(yōu)勢大
兩者參數(shù)各有高低,國產(chǎn)的偏置電流還小一些
這個(gè)LOGO還是有點(diǎn)意思的
這東西也會用在AED里面,你要這樣說,我突然感覺AED就有技術(shù)含量了
OPA305這個(gè)型號奇奇怪怪的,一般沒有中間的0,查了一下果然有貓膩。
就是沒有305這個(gè)型號
它捕獲治療電極發(fā)出的ECG信號,運(yùn)行ECG分析算法以識別可電擊復(fù)律,并建議操作員是否需要除顫。
基本除顫器包含高壓電源、存儲電容器、可選電感器和患者電極。它能在存儲電容器中產(chǎn)生電荷,形成潛在電流。電壓越高,可能形成的電流就越大。
如果AED分析患者的ECG并探測到可電擊復(fù)律,電容器將會充電,其中 Wc = 1/2CV^2c;而電容器電壓 Vc(t) = Vc(0)e–t/RC,同時(shí) R = R(lead) << R(chest)。按下電擊按鈕提供高壓脈沖時(shí),電流將開始流經(jīng)身體以去極化大部分心肌細(xì)胞,從而重建協(xié)調(diào)收縮和正常心率。電流量由電容器和身體阻抗確定。
也就是說,其實(shí)是這個(gè)AED電流是實(shí)時(shí)的計(jì)算的
除顫能量需要經(jīng)過經(jīng)胸阻抗的衰減后才能到達(dá)心臟 。經(jīng)胸阻抗測量是 AED 的重要功能之一。經(jīng)胸阻抗 的大小一般在 25~200 Ω,影響經(jīng)胸阻抗的因素有很多, 包括電極的類型和面積、電極板和皮膚間的接觸狀態(tài)等。經(jīng)胸阻抗測量是 AED 最重要的功能之一,該功能可以使 AED 根據(jù)患者經(jīng)胸阻抗大小實(shí)時(shí)調(diào)整除顫能量的 大小,同時(shí)可以對導(dǎo)聯(lián)脫落、導(dǎo)聯(lián)電極接觸異常等危險(xiǎn) 狀況實(shí)現(xiàn)預(yù)警 。
目前的人體阻抗測量分析中,大多研究仍然采用經(jīng)典三元等效電路模型,這個(gè)模型指出人體的等效阻抗主要是由細(xì)胞內(nèi)電阻、細(xì)胞體液電阻以及細(xì)胞膜所形成的等效電容 C 三者組成的,目前多數(shù)市場在售的 AED 使用基于此原理的雙電極恒流源激勵(lì)電壓測量的方法 在除顫前對患者進(jìn)行經(jīng)胸阻抗測量,具體做法是在電極連接完成后,AED 的恒流源激勵(lì)電路向患者發(fā)送一個(gè)高頻低壓激勵(lì)信號,隨后信號檢測電路檢測經(jīng)過經(jīng)胸阻抗衰減的激勵(lì)信號,通過計(jì)算得到患者的經(jīng)胸阻抗信息。
目前該方法的不足之處在于需要對患者施加額外的電流激勵(lì),且需要額外的時(shí)間成本,有向患者施加不當(dāng)除顫的風(fēng)險(xiǎn)。
除顫電流檢測電路如圖所示,出于除顫電流值較大的考慮,本系統(tǒng)選擇通過電流互感器將除顫大電流線性轉(zhuǎn)化為小電壓進(jìn)行數(shù)據(jù)采集,這樣非接觸式的測量方式可以保證測量的準(zhǔn)確性和安全性,為防止在除顫電流檢測時(shí), 除顫峰值電流過大超出電流互感器的量程范圍,本研究在除顫回路中串聯(lián) 50 Ω 的機(jī)內(nèi)補(bǔ)償電阻 Rc 來防止除顫電流過大。
《2015 美國心臟協(xié)會 CPR 和 ECC 指南》指出,90%以上心臟驟停發(fā)生在醫(yī)院之外,數(shù)據(jù)顯示中國各大城市救護(hù)車到達(dá)現(xiàn)場最少要15-20分鐘,在心臟驟停發(fā)生的四分鐘內(nèi)及時(shí)施救顯得尤為重要,因此,AED體外除顫是目前心源性猝死搶救的最好辦法。
AED的普及為何困難? 高成本,低投入,低使用 在發(fā)達(dá)國家,平均每十萬人有用300臺AED,如果中國想要達(dá)到這樣的標(biāo)準(zhǔn),那么420萬臺AED將要被投入使用,平均每一臺AED,政府需要花20293元購買,此后每一年會產(chǎn)生580至1000元不等的耗材費(fèi)用,直到2-5年后報(bào)廢。這是一個(gè)高達(dá)874-900億元的大市場。 然而,現(xiàn)實(shí)很骨感。到2020年,政府共為AED投入1億元左右,2020年國家醫(yī)療衛(wèi)生的總投入是19201.22億元。假設(shè)每年銷售額保持不變,要消化874-900億的市場,大概還需要5個(gè)世紀(jì)。
貴啊
其實(shí)這個(gè)圖就很簡單的說明白了難點(diǎn)和原理,ECG可以精確的算出你什么時(shí)候需要電擊,在電子學(xué)里面快速的放電的東西只有電容合適一些。
這里面的很多東西都是靠算法和穩(wěn)定性的設(shè)計(jì),太酷了。
給出代碼:
#include "main.h" #include "stdio.h" #include "string.h" UART_HandleTypeDef huart1; SPI_HandleTypeDef hspi1; #define RX_BUFFER_SIZE 50 #define TX_BUFFER_SIZE 50 uint8_t rxBuffer[RX_BUFFER_SIZE]; uint8_t txBuffer[TX_BUFFER_SIZE]; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); static void MX_SPI1_Init(void); void parseAndExecuteCommand(uint8_t *command); void configureSensorRegisters(uint8_t *parameters); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); MX_SPI1_Init(); HAL_UART_Receive_IT(&huart1, rxBuffer, 1); while (1) { // Main application loop } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart == &huart1) { static uint8_t commandBuffer[RX_BUFFER_SIZE]; static uint8_t commandIndex = 0; if (rxBuffer[0] == ' ' || rxBuffer[0] == ' ') { // End of command, process the received command commandBuffer[commandIndex] = '?'; parseAndExecuteCommand(commandBuffer); // Reset command buffer commandIndex = 0; memset(commandBuffer, 0, sizeof(commandBuffer)); } else { // Add the received character to the command buffer commandBuffer[commandIndex++] = rxBuffer[0]; } // Restart UART receive HAL_UART_Receive_IT(&huart1, rxBuffer, 1); } } void parseAndExecuteCommand(uint8_t *command) { if (strncmp((char *)command, "CONFIGURE:", 10) == 0) { // Extract parameters and configure sensor configureSensorRegisters(command + 10); } } void configureSensorRegisters(uint8_t *parameters) { // Parse and process sensor configuration parameters // Example: parameters may be a series of bytes to be sent via SPI // Update txBuffer with the data to be sent // ... // Send data via SPI HAL_SPI_Transmit(&hspi1, txBuffer, strlen((char *)txBuffer), HAL_MAX_DELAY); } // ... (HAL_UART_Init, HAL_SPI_Init, SystemClock_Config, MX_GPIO_Init implementations)
審核編輯:湯梓紅
-
傳感器
+關(guān)注
關(guān)注
2552文章
51302瀏覽量
755250 -
mcu
+關(guān)注
關(guān)注
146文章
17227瀏覽量
351958 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5096瀏覽量
97825 -
除顫器
+關(guān)注
關(guān)注
0文章
21瀏覽量
10442 -
AED
+關(guān)注
關(guān)注
0文章
19瀏覽量
1869
原文標(biāo)題:帶你認(rèn)識AED-無限跑題版
文章出處:【微信號:TT1827652464,微信公眾號:云深之無跡】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論