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