18video性欧美19sex,欧美高清videosddfsexhd,性少妇videosexfreexxx片中国,激情五月激情综合五月看花,亚洲人成网77777色在线播放

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

嵌入式軟件設(shè)計(jì)之PPG采集系統(tǒng)

云深之無(wú)跡 ? 來(lái)源:云深之無(wú)跡 ? 2023-08-03 10:18 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

500d6ae2-318e-11ee-9e74-dac502259ad0.png

嵌入式系統(tǒng)是分層級(jí)的,分模塊的。

使用的硬件資源有:

IMU-IIC

采集-ADC

電源-ADC

外置接口-串口

主控部分使用ESP32-IDF進(jìn)行開(kāi)發(fā),因?yàn)樾酒拇嫫鬏^多,而且采集對(duì)的實(shí)時(shí)性有要求,所以選用freeRTOS,在滿足實(shí)時(shí)性的要求上程序的設(shè)計(jì)也會(huì)更簡(jiǎn)單。

FreeRTOS任務(wù)設(shè)計(jì)

MAX30102采集任務(wù):初始化IIC和MAX30102,在一個(gè)死循環(huán)里面以50Hz的頻率讀取紅外線和紅光傳感器的數(shù)據(jù),進(jìn)行簡(jiǎn)單濾波后存入隊(duì)列。

MPU6050任務(wù):初始化IIC和MPU6050,連續(xù)讀取Euler角,以20Hz的頻率進(jìn)行更新,數(shù)據(jù)處理后存入隊(duì)列。

ADC采集任務(wù):初始化ADC,以適當(dāng)采樣頻率(例如100Hz)采集模擬通道電壓,發(fā)送到隊(duì)列。

串口發(fā)送任務(wù):優(yōu)先級(jí)最低,從隊(duì)列中讀取數(shù)據(jù)并打包發(fā)送??梢栽O(shè)置一定的數(shù)據(jù)緩存。

空閑任務(wù):優(yōu)先級(jí)最低,MCU睡眠時(shí)運(yùn)行,用于切換低功耗模式。

數(shù)據(jù)同步

采用FreeRTOS的隊(duì)列和信號(hào)量機(jī)制進(jìn)行任務(wù)間同步。信號(hào)量可用于指示隊(duì)列已滿或空。

給每個(gè)數(shù)據(jù)包添加采集時(shí)間戳,上位機(jī)可以根據(jù)時(shí)間戳重新同步。

也可以僅在串口發(fā)送任務(wù)中合并時(shí)間戳,不在各個(gè)采集任務(wù)中添加。

低功耗設(shè)計(jì)

利用調(diào)度器suspend/resume接口暫停任務(wù)實(shí)現(xiàn)睡眠喚醒。

DMA采集ADC數(shù)據(jù),避免CPU占用。

使用內(nèi)部PERIPH FIFO buffer,減少I(mǎi)IC任務(wù)調(diào)用。

串口使用DMA傳輸,CPU僅在發(fā)送完一個(gè)包后進(jìn)行復(fù)位。

關(guān)閉不需要的外設(shè)時(shí)鐘。利用IDLE調(diào)度鉤子函數(shù)實(shí)現(xiàn)自動(dòng)降頻。

模塊化設(shè)計(jì)

獨(dú)立通信模塊,內(nèi)部封裝串口通信的復(fù)雜度。

采集核心模塊只輸出統(tǒng)一格式的采集數(shù)據(jù)。

模塊間使用統(tǒng)一的隊(duì)列/緩存接口進(jìn)行數(shù)據(jù)交換。

502d2292-318e-11ee-9e74-dac502259ad0.png504c494c-318e-11ee-9e74-dac502259ad0.png

這里給出采集的樣板任務(wù)

針對(duì)MAX30102的芯片,更多的技術(shù)細(xì)節(jié)是:首先配置傳感器工作在FIFO模式下然后周期性讀取FIFO,通過(guò)1024點(diǎn)的FFT變換得到頻域數(shù)據(jù),然后選擇頻帶內(nèi)的最高幅值為心率,通過(guò)對(duì)比兩個(gè)幅值的幅度計(jì)算出血氧飽和度。通過(guò)平均其他頻點(diǎn)的差值來(lái)標(biāo)定兩個(gè)波長(zhǎng)數(shù)據(jù)。

struct compx FFTBUF1[FFT_N + 16];
struct compx FFTBUF2[FFT_N + 16];
uint16_t g_fft_index = 0;
BloodData g_blooddata = {0};


void test(float data1, float data2)
{
    static uint8_t str[50];
    sprintf((char *)str, "%f,%f
", data1, data2);
    HAL_UART_Transmit_DMA(&huart1, str, sizeof(str));
}


// 血液檢測(cè)信息更新
void blood_data_update(void)
{
    static DC_FilterData dc1 = {.w = 0, .init = 0, .a = 0.8};
    static DC_FilterData dc2 = {.w = 0, .init = 0, .a = 0.8};
    static float data1buf[20];
    static uint8_t data1cur = 0;
    static float data2buf[20];
    static uint8_t data2cur = 0;
    uint16_t temp_num = 0;
    uint16_t fifo_word_buff[1][2];
    temp_num = max30100_Bus_Read(INTERRUPT_REG);
    if (INTERRUPT_REG_A_FULL & temp_num)
    {
        max30100_FIFO_Read(0x05, fifo_word_buff, 1); // read the hr and spo2 data form fifo in reg=0x05
        float data1 = dc_filter(fifo_word_buff[0][0], &dc1) + 100.0;
        float data2 = dc_filter(fifo_word_buff[0][1], &dc2) + 100.0;
        data1buf[data1cur] = data1;
        data2buf[data2cur] = data2;
        data1 = 0;
        data2 = 0;
        for (int i = 0; i < 20; i++)
        {
            data1 += data1buf[i];
            data2 += data2buf[i];
        }
        data1 /= 20;
        data2 /= 20;
        data1cur = (data1cur < 19) ? data1cur + 1 : 0;
        data2cur = (data2cur < 19) ? data2cur + 1 : 0;
        g_blooddata.hb = data1 + 50;
        g_blooddata.hbo2 = data2 + 50;
        // 將數(shù)據(jù)寫(xiě)入fft輸入并清除輸出
        for (int i = 0; i < 1; i++)
        {
            if (g_fft_index < FFT_N)
            {
                FFTBUF1[g_fft_index].real = fifo_word_buff[i][0];
                FFTBUF1[g_fft_index].imag = 0;
                FFTBUF2[g_fft_index].real = fifo_word_buff[i][1];
                FFTBUF2[g_fft_index].imag = 0;
                g_fft_index++;
            }
        }
        // 信息更新標(biāo)志位
        g_blooddata.update++;
    }
}
// 血液信息轉(zhuǎn)換
void blood_data_translate(void)
{
    // 緩沖區(qū)寫(xiě)入結(jié)束
    if (g_fft_index >= FFT_N)
    {
        // 快速傅里葉變換
        FFT(FFTBUF1);
        FFT(FFTBUF2);
        // 解平方
        for (int i = 0; i < FFT_N; i++)
        {
            FFTBUF1[i].real = sqrtf(FFTBUF1[i].real * FFTBUF1[i].real + FFTBUF1[i].imag * FFTBUF1[i].imag);
            FFTBUF2[i].real = sqrtf(FFTBUF2[i].real * FFTBUF2[i].real + FFTBUF2[i].imag * FFTBUF2[i].imag);
        }
        // 讀取峰值點(diǎn) 10-100帶通 頻率范圍30-292次/分鐘
        uint16_t s1_max_index = find_max_num_index(FFTBUF1, 100);
        uint16_t s2_max_index = find_max_num_index(FFTBUF2, 100);


        // 檢查HbO2和Hb的變化頻率是否一致
        if (s1_max_index == s2_max_index)
        {
            // 心率計(jì)算
            uint16_t Heart_Rate = 60 * SAMPLES_PER_SECOND *
                                  s2_max_index / FFT_N;
            g_blooddata.heart = Heart_Rate;
            // 血氧含量計(jì)算
            float sp02_num = (FFTBUF1[s1_max_index].real * FFTBUF1[0].real) / (FFTBUF2[s1_max_index].real * FFTBUF2[0].real);
            sp02_num = sp02_num * SAMPLES_PER_SECOND + CORRECTED_VALUE;
            g_blooddata.SpO2 = sp02_num;
            // 狀態(tài)正常
            g_blooddata.state = BLD_NORMAL;
        }
        else // 數(shù)據(jù)發(fā)生異常
        {
            g_blooddata.heart = 0;
            g_blooddata.SpO2 = 0;
            g_blooddata.state = BLD_ERROR;
        }


        g_fft_index = 0;
    }
}

因?yàn)镻PG的數(shù)據(jù)處理是難點(diǎn),以上給出一段處理代碼,但是還有優(yōu)化的空間。

將采集數(shù)據(jù)和處理算法分離開(kāi)來(lái),降低耦合

可以創(chuàng)建獨(dú)立的采集模塊和處理模塊,采集模塊專注獲取傳感器數(shù)據(jù),處理模塊實(shí)現(xiàn)算法邏輯。兩者通過(guò)統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)進(jìn)行交互。這可以提高代碼的模塊化和可維護(hù)性。

優(yōu)化數(shù)據(jù)濾波方式

當(dāng)前的平均濾波可以考慮改為滾動(dòng)平均濾波,這樣可以加快數(shù)據(jù)更新的響應(yīng)速度。同時(shí)可以引入一階IIR濾波來(lái)平滑數(shù)據(jù)。

優(yōu)化FFT實(shí)現(xiàn)

可以考慮使用更優(yōu)化的FFT庫(kù),或者直接調(diào)用DSP庫(kù)的FFT函數(shù),提高運(yùn)算效率。當(dāng)前的FFTBUFFER可以改為復(fù)數(shù)數(shù)組,簡(jiǎn)化運(yùn)算。

血氧算法可進(jìn)一步優(yōu)化

血氧計(jì)算中使用了簡(jiǎn)單的比值法,可以參考更復(fù)雜的算法來(lái)提高精度,比如考慮LED功率補(bǔ)償?shù)取?/p>

添加參數(shù)配置接口

例如采樣率、FFT長(zhǎng)度、濾波參數(shù)等可以設(shè)計(jì)成可配置的,而不是硬編碼的數(shù)字。這樣可以更靈活地調(diào)整參數(shù)。

優(yōu)化數(shù)據(jù)包發(fā)送流程

可以考慮使用FreeRTOS隊(duì)列來(lái)緩存要發(fā)送的數(shù)據(jù),發(fā)送任務(wù)從隊(duì)列中獲取數(shù)據(jù)。這可以避免直接在中斷中發(fā)送造成的阻塞。

增加狀態(tài)機(jī)管理

可以設(shè)計(jì)一個(gè)狀態(tài)機(jī)來(lái)管理整個(gè)采集和處理的流程,例如初始化狀態(tài),檢測(cè)狀態(tài),發(fā)送狀態(tài)等。這可以使代碼流程更清晰。

50769b8e-318e-11ee-9e74-dac502259ad0.png

50ac82ee-318e-11ee-9e74-dac502259ad0.png

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5177

    文章

    20003

    瀏覽量

    325538
  • adc
    adc
    +關(guān)注

    關(guān)注

    100

    文章

    6863

    瀏覽量

    552729
  • 采集系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    175

    瀏覽量

    21584
  • PPG
    PPG
    +關(guān)注

    關(guān)注

    2

    文章

    68

    瀏覽量

    18967
  • FreeRTOS
    +關(guān)注

    關(guān)注

    14

    文章

    496

    瀏覽量

    65987

原文標(biāo)題:PPG采集系統(tǒng)-嵌入式軟件設(shè)計(jì)思路

文章出處:【微信號(hào):TT1827652464,微信公眾號(hào):云深之無(wú)跡】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    嵌入式軟件設(shè)計(jì)思想與方法

    本帖最后由 lee_st 于 2018-2-24 17:16 編輯 嵌入式軟件設(shè)計(jì)思想與方法
    發(fā)表于 02-24 17:15

    掌握嵌入式系統(tǒng)軟件設(shè)計(jì)方法

    實(shí)驗(yàn)?zāi)康模?)掌握嵌入式系統(tǒng)軟件設(shè)計(jì)方法,培養(yǎng)分析問(wèn)題、解決問(wèn)題、應(yīng)用知識(shí)的能力和創(chuàng)新精神,全面提高綜合素質(zhì)。(2)熟悉嵌入式Linux開(kāi)發(fā)環(huán)境,學(xué)會(huì)基于UP-CUP6410-II型平臺(tái)的Linux
    發(fā)表于 11-09 09:05

    嵌入式系統(tǒng)軟件設(shè)計(jì)的原則是什么

    嵌入式系統(tǒng)軟件設(shè)計(jì)的原則1、基本原則是“物盡其用”,嵌入式系統(tǒng)的硬件和軟件都必須高效率地設(shè)計(jì),去除冗雜? 還應(yīng)盡可能采用高效率的設(shè)計(jì)方法,標(biāo)
    發(fā)表于 12-24 06:29

    基于ARM的嵌入式系統(tǒng)軟件設(shè)計(jì)

    嵌入式軟件的啟動(dòng)代碼嵌入式軟件開(kāi)發(fā)關(guān)鍵技術(shù)嵌入式實(shí)時(shí)操作系統(tǒng)程序的鏈接定位
    發(fā)表于 03-25 15:03 ?203次下載
    基于ARM的<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)軟件設(shè)計(jì)</b>

    基于嵌入式的腦卒中康復(fù)儀的軟件設(shè)計(jì)

    本文介紹一種新型嵌入式腦卒中康復(fù)治療儀系統(tǒng)軟件設(shè)計(jì)。以Qt/Embedded為核心實(shí)現(xiàn)治療儀的軟件設(shè)計(jì),利用Qt/Embedded的多線程技術(shù)來(lái)實(shí)現(xiàn)肌電信號(hào)的
    發(fā)表于 08-14 09:30 ?29次下載

    ARM嵌入式系統(tǒng)開(kāi)發(fā)-軟件設(shè)計(jì)與優(yōu)化

    ARM嵌入式系統(tǒng)開(kāi)發(fā)-軟件設(shè)計(jì)與優(yōu)化
    發(fā)表于 02-11 09:57 ?94次下載
    ARM<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>開(kāi)發(fā)-<b class='flag-5'>軟件設(shè)計(jì)</b>與優(yōu)化

    嵌入式USB主機(jī)設(shè)計(jì)(硬件設(shè)計(jì)和軟件設(shè)計(jì))

    嵌入式USB主機(jī)設(shè)計(jì)(硬件設(shè)計(jì)和軟件設(shè)計(jì)) 嵌入式USB主機(jī)硬件設(shè)計(jì)選用廉價(jià)的51系列單片機(jī)(89C52)控制US
    發(fā)表于 11-26 13:58 ?1486次閱讀
    <b class='flag-5'>嵌入式</b>USB主機(jī)設(shè)計(jì)(硬件設(shè)計(jì)和<b class='flag-5'>軟件設(shè)計(jì)</b>)

    采用構(gòu)件技術(shù)的嵌入式系統(tǒng)復(fù)用軟件設(shè)計(jì)

    采用構(gòu)件技術(shù)的嵌入式系統(tǒng)復(fù)用軟件設(shè)計(jì) 提高軟件生產(chǎn)率成為軟件產(chǎn)業(yè)的當(dāng)務(wù)之急;基于構(gòu)件的軟件復(fù)用
    發(fā)表于 03-29 15:10 ?958次閱讀
    采用構(gòu)件技術(shù)的<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>復(fù)用<b class='flag-5'>軟件設(shè)計(jì)</b>

    嵌入式系統(tǒng)智能鍵盤(pán)的軟件設(shè)計(jì)

    嵌入式系統(tǒng)智能鍵盤(pán)的軟件設(shè)計(jì) 引言鍵盤(pán)是智能化測(cè)控系統(tǒng)主要的信息輸入方式,是實(shí)現(xiàn)人機(jī)對(duì)話的重要途徑,因此如何有效地控制鍵盤(pán)并為系統(tǒng)服務(wù)是
    發(fā)表于 03-11 13:45 ?1332次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>智能鍵盤(pán)的<b class='flag-5'>軟件設(shè)計(jì)</b>

    基于ARM的嵌入式系統(tǒng)軟件設(shè)計(jì)部分

    基于ARM的嵌入式系統(tǒng)軟件設(shè)計(jì)部分
    發(fā)表于 01-14 12:32 ?15次下載

    ARM的嵌入式系統(tǒng)軟件設(shè)計(jì)

    ARM的嵌入式系統(tǒng)軟件設(shè)計(jì)
    發(fā)表于 10-27 15:00 ?8次下載
    ARM的<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)軟件設(shè)計(jì)</b>

    基于RTOS的嵌入式系統(tǒng)軟件設(shè)計(jì)

    基于RTOS的嵌入式系統(tǒng)軟件設(shè)計(jì)說(shuō)明。
    發(fā)表于 04-19 14:38 ?18次下載

    嵌入式軟件設(shè)計(jì)設(shè)計(jì)模式

    文章目錄前言1.設(shè)計(jì)模式適配器模式2.設(shè)計(jì)模式單例模式3.設(shè)計(jì)模式命令模式前言在嵌入式軟件設(shè)計(jì)過(guò)程中,也會(huì)用到一些設(shè)計(jì)模式,所以說(shuō)設(shè)計(jì)
    發(fā)表于 10-21 11:07 ?9次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>軟件設(shè)計(jì)</b><b class='flag-5'>之</b>設(shè)計(jì)模式

    嵌入式系統(tǒng)軟件設(shè)計(jì)教材資料

    嵌入式系統(tǒng)軟件設(shè)計(jì)教材資料免費(fèi)下載。
    發(fā)表于 04-12 14:44 ?5次下載

    嵌入式軟件設(shè)計(jì)的原則分享

    嵌入式軟件開(kāi)發(fā)如果具有更好的閱讀性、擴(kuò)展性以及維護(hù)性,就需要考慮很多因素。今天給大家分享幾個(gè)嵌入式軟件設(shè)計(jì)的原則。
    發(fā)表于 02-25 10:54 ?1290次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>軟件設(shè)計(jì)</b>的原則分享