對於 arduino 來說,網上有大量關於 PulseSensor 脈搏傳感器的資料,而其他單片機上的實例較少。本文使用 STM32F407 系列芯片的 ADC 模塊,從硬件配置、簡易心率算法編寫到官方 Processing 上位機的使用,帶你全方位玩轉 PulseSensor,玩的,就是心跳!
供電電壓:3.3~5V
檢測信號類型:光反射信號(PPG)
輸出信號類型:模擬信號
輸出信號大小:0~VCC
電流大小:~4ma(5v 下)
PulseSensor 是一款用於脈搏心率測量的光電反射式模擬傳感器。將其佩戴於手指、耳垂等處,利用人體組織在血管搏動時造成透光率不同來進行脈搏測量。傳感器對光電信號進行濾波、放大,最終輸出模擬電壓值。單片機通過將采集到的模擬信號值轉換為數字信號,再通過簡單計算就可以得到心率數值。
58592659f73823c97c1dd34ec2d938b0
PulseSensor 是一款開源硬件,目前國外官網上已有其對應的開源 arduino 程序和上位機 Processing 程序,其適用於心率方面的科學研究和教學演示,也非常適合用於二次開發。 網上關於傳感器的 arduino 資料已經十分豐富(畢竟同為開源硬件),本文采用 STM32F407系列芯片 的 ADC 模塊讀取並處理傳感器數據,實現心率測量。
傳感器隻有三個引腳,分別為信號輸出 S 腳 、電源正極 VCC 以及電源負極 GND,供電電壓為 3.3V - 5V,可通過杜邦線與開發板連接。上電後, 傳感器會不斷從 S 腳輸出采集到的電壓模擬值。需要註意的是,印有心形的一面才是與手指接觸面,在測量時要避免接觸佈滿元件的另一面,否則會影響信號準確性。
開發板使用的是公司的 M4 板子,傳感器 3.3V 供電,信號采集選用 ADC1 的 通道 2,硬件連接如下:
開發板傳感器PA2S3V3+GND-
把 PA2 用作模擬功能,配置 ADC 為 12 位分辨率,單次轉換,並設置轉換序列長度為 1,首次轉換通道 2。為確保數據準確性,選擇APB2 時鐘 6 分頻作為 ADC 時鐘(即 84M / 6 = 14M),采樣時間 480 個周期(使得采樣時間更加充分),最後使能 ADC。初始化函數如下:
/******************** ADC通道2初始化函數 ************************/
void ADC_AN2_Init(void)
{
/* 設置ADC功能對應的GPIO端口 */
RCC->AHB1ENR |= 1 << 0;
GPIOA->MODER &= ~(3 << (2 * 2));
GPIOA->MODER |= 3 << (2 * 2);
/* 配置ADC采樣模式 */
RCC->APB2ENR |= 1 << 8; //使能ADC模塊時鐘
ADC1->CR1 &= ~(3 << 24); //12位分辨率
ADC1->CR1 &= ~(1 << 8); //非掃描模式
ADC1->CR2 &= ~(3 << 28); //禁止外部觸發
ADC1->CR2 &= ~(1 << 11); //右對齊
ADC1->CR2 &= ~(1 << 1); //單次轉換
ADC->CCR &= ~(3 << 16);
ADC->CCR |= 2 << 16; //6分頻
ADC1->SMPR2 &= ~(0x07 << 6);
ADC1->SMPR2 |= 0x07 << 6; //480采樣周期
ADC1->SQR1 &= ~(0x0f << 20); //1次轉換
ADC1->SQR3 &= ~(0x1f << 0);
ADC1->SQR3 |= 0x02 << 0; //轉換的通道為通道2
/* 使能ADC */
ADC1->CR2 |= 1 << 0; //開啟ADC
}