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