一個100行的代碼調試都可能會讓程序員遇到很多挫折,所以,面對挫折,我們永遠不能低頭。
關於MAX30102驅動配置程序,網上搜索博客有一堆資料,c/c++寫的驅動代碼都有,
可參考博客:
軟件流程:
* 中斷向量初始化
* 串口初始化
* 定時器初始化
* IIC初始化
* max30102初始化
* 循環讀取max30102數據寄存器的值
* 每隔10s計算一次心率值
基本的單片機配置不用多說,不會的可以區正點原子官網下載例程好好學一學
stm32系列基本上都是庫函數,非常適合新手上手
我這里使用的是stm32f405單片機
單片機調試會出現很多莫名其妙的bug,有軟件產生的,有硬件產生的,要學會逐個問題的分析排查
調試max30102尤其要注意的點;
* 搞清楚測心率是紅燈還是紅外,官方英文手冊有寫:紅燈是心率模式,紅燈+紅外是血氧模式
* 一定要保證IIC配置正確,這樣才能讀到數據
* 一定要注意max30102的采樣頻率,采樣頻率的設置直接關系到心率計算的准確度
* 根據采樣頻率如設置100hz,說明每10ms采樣一個數據,那么就可以采用定時器每定時10ms設置標志位,然后再在應用程序里判斷標志位從而把數據讀出來
* 讀取數據可采用fifo模式,需看懂官方手冊,如何利用fifo讀取數據以及每個數據是如何組成的,如心率模式下,讀FIFO是六個字節,前后三個字節都是紅燈數據
* 10s即可讀到1000個數據,利用此1000個數據即可計算心率值
硬件准備就緒,軟件驅動配置正確的情況下,將手指頭貼在max30102上面靜止不動,采集數據如下:
112539 112514 112534 112523 112548 112631 112578 112663 112591 112636 112669 112644 112436 112386 112262 112296 112183 112234 112138 112155 112143 112205 112162 112158 112178
采集到數據后需要對數據進行預處理,再經過心率提取算法,計算出心率值,可先離線分析,再將代碼實現在單片機上。
數據預處理部分基本上包含如下:
* 環境光處理(硬件處理)
* 去除運動偽影
* 維納濾波衰減噪聲(適合運動下測量)
* 巴特沃茲去低頻噪聲
* rolling去除基線漂移,只能線性補償,非線性待測試解決
* 均值濾波->滑動平均使波形更平滑
python實現效果如下:
經過和華為watch測試對比,靜止情況下,誤差在1%之內