? ? ? 一個(gè)很有意思的傳感器,BH1790GLC心率傳感器,這個(gè)傳感器是ROHM生產(chǎn)的,一個(gè)日本的廠家。其他的不說,就說說這個(gè)傳感器吧。
作為一名硬件開發(fā)設(shè)計(jì)人員,我拿到這個(gè)模塊第一反映是去官網(wǎng)下載其數(shù)據(jù)手冊(cè),通過數(shù)據(jù)手冊(cè)去了解這個(gè)傳感器的特性。
當(dāng)有一個(gè)脈搏信號(hào)傳遞過來時(shí),會(huì)造成血管的體積發(fā)生變化,如上圖所示。傳感器就通過采集血管的變化來檢測(cè)脈搏。
整個(gè)傳感器框圖如下:
傳感器需要外接兩個(gè)綠色的LED燈珠,這個(gè)LED普通的還真不行,模塊使用的是SML-M13MT這個(gè)型號(hào),它與普通的LED的區(qū)別是,其通過反射的方式,將光強(qiáng)在一定范圍內(nèi)實(shí)現(xiàn)等效分布。
芯片內(nèi)部有綠色LED的驅(qū)動(dòng)電路,另外在傳感器的外部,有一組IRCUT濾波器,將外部的其它光線以及紅外光線濾除,讓綠光通過IRCUT,進(jìn)入ADC去采集。最后數(shù)據(jù)通過IIC傳輸出來。
整個(gè)傳感器也沒有幾個(gè)用到幾個(gè)器件,但是我查了,這個(gè)模塊還真不便宜,網(wǎng)上報(bào)價(jià)是在100左右。
模塊的電路如下:
其他參數(shù)就不多少了,詳情可以查看傳感器的數(shù)據(jù)手冊(cè),
整個(gè)傳感器的寄存器也沒有幾個(gè),除了ID寄存器外,剩下就是控制寄存器,采集到的數(shù)據(jù)也是保存到DATOUT_LEDON 、DATOUT_OFF這兩組數(shù)據(jù)寄存器中。
還在手冊(cè)上有測(cè)量控制說明,不至于讓我感到太迷茫:
按照這個(gè)時(shí)序,我對(duì)0x41– 0x43寄存器進(jìn)行了如下設(shè)置。
最后按照時(shí)序要求就,讀出DATOUT_LEDON 、DATOUT_OFF
我將讀出的DATOUT_LEDON 、DATOUT_OFF值通過串口打印出來,并畫了線。
下圖為我手指沒有放上去的時(shí)候的數(shù)據(jù)波形:
DATAOUT_LEDOFF(紅色)、DATAOUT_LEDON(藍(lán)色)的值幾乎保持穩(wěn)定,在室內(nèi)數(shù)據(jù)處在260左右。
放上手指,波形馬上發(fā)生了變化。
DATAOUT_LEDOFF(紅色)馬上下降到20附近、而DATAOUT_LEDON(藍(lán)色)有了很明顯跳動(dòng),跳動(dòng)的幅度很小,而且DATAOUT_LEDON(藍(lán)色)值一直上升。
這樣的一個(gè)波形,當(dāng)然如何去提取出脈搏數(shù)據(jù)?
又需要一個(gè)怎樣的算法?
IIR濾波器應(yīng)該是比較適合的一種方案。
說到IIR濾波器,那就不得不說FIR濾波器,這兩個(gè)都是一種數(shù)字的線性濾波器,其兩者最大的區(qū)別是:
1、在相同的技術(shù)指標(biāo)下, IIR濾波器由于存在著輸出對(duì)輸入的反饋,因而可用比FIR濾波器需要更少的參數(shù)和資源。
2、FIR濾波器可得到嚴(yán)格的線性相位, 而IIR濾波器則做不到這一點(diǎn)。
3、IIR濾波器可以設(shè)計(jì)成標(biāo)準(zhǔn)低通、高通、帶通、帶阻、全通濾波器,而FIR濾波器則要靈活得多,可以設(shè)計(jì)出理想正交變換器、理想微分器、線性調(diào)頻器等
所以在我們的應(yīng)用中,考慮IIR濾波器就可以了。相位移位對(duì)我來說,沒有任何問題。
針對(duì)上圖中,當(dāng)手指按下時(shí)的波形,需要對(duì)這個(gè)波形進(jìn)行低通+高通的濾波。人體的脈搏正常范圍在60-100之間??紤]到極端情況下,所以設(shè)置一個(gè)3.5HZ的低通濾波器和0.5HZ的高通濾波器,只需要截取0.5HZ - 3.5HZ范圍的信號(hào)。
先說說IIR濾波器,我這里選擇的是直接I型IIR濾波器,其基于二階Biquad級(jí)聯(lián)的方式來實(shí)現(xiàn)的。每個(gè)Biquad由一個(gè)二階的濾波器組成:
y[n] = b0 * x[n] + b1 * x[n-1] + b2 *x[n-2] + a1 * y[n-1] + a2 * y[n-2]
直接 I 型算法每個(gè)階段需要 5 個(gè)系數(shù)和 4 個(gè)狀態(tài)變量,如下圖。
x[n]就是輸入變量,y[n]就是基于IIR濾波之后的輸出值。
按照這樣的公式,就是可以實(shí)現(xiàn)一個(gè)1階的IIR濾波器,如果你在這個(gè)濾波器后面多加幾個(gè)這樣的濾波器,就可以實(shí)現(xiàn)多階的IIR濾波器。
公式有了,但是上面公式中的b0 、b1、 b2、a1、a2這些參數(shù)當(dāng)怎么確定??
答案是:使用MATLAB
使用fdatool打開濾波器設(shè)計(jì)工具箱
設(shè)置濾波器參數(shù):
注意的是:我們配置的BH1790GLC心率傳感器輸出數(shù)據(jù)是按照32HZ的,所以濾波器的采樣頻率是32HZ,截至頻率是3.5HZ,
濾波器參數(shù)使用MATLAB輸出如下:
得到了濾波器的參數(shù),開始寫代碼吧。
定義IIR濾波器參數(shù)結(jié)構(gòu)體:
IIR濾波器初始化
IIR濾波器計(jì)算實(shí)現(xiàn)代碼如下:
關(guān)于濾波器的部分基本上 就是這么回事。
剩下的就是使用IIR濾波器。
程序按照32HZ的頻率去讀取傳感器的數(shù)據(jù)。
pw_GetMeasureData(&s_pwData);讀取傳感器的數(shù)據(jù)保存到s_pwData
pwCalc(&s_pwData,&pw);? ??? 數(shù)據(jù)經(jīng)過IIR濾波之得到PW數(shù)據(jù)
濾波方式如下:
?
首先原始數(shù)據(jù)先經(jīng)過滑動(dòng)求平均之后,經(jīng)過高通濾波器之后,在經(jīng)過低通濾波器,最后輸出dataOut
現(xiàn)在我將原始數(shù)據(jù)和濾波之后的數(shù)據(jù)通過串口傳出來,波形顯示如下:
紅色DATAOUT_LEDON,藍(lán)色DATAOUT_LEDOFF,以及經(jīng)過IIR濾波之后的數(shù)據(jù) pw綠色
將PW波形放大之后:
可以看到,經(jīng)過IIR濾波之后,pw幾乎呈現(xiàn)很規(guī)律的正弦波,這樣就可以很方便的統(tǒng)計(jì)出傳感器的脈搏心跳。
最后統(tǒng)計(jì)心跳,通過串口顯示如下:
當(dāng)前心率為71,反復(fù)測(cè)試幾次,數(shù)值都在70-75,看來一致性還是不錯(cuò)。
評(píng)論