一、模块简介
某宝或某多,两三块钱一个,如下图。
该模块采用超亮红外LED和光敏晶体管来探测手指的脉搏,将手指放在发射和接收端之间,血压随着脉搏变化,接收端收到的光会发生相应的变化,因此可用来检测心跳。
二、STM32MX Cube配置
采用STM32F103C8T6最小系统板,STM32MX Cube进行系统配置并自动生成代码。
在ADC1中,我们选则IN1通道,即PA1引脚,其他配置如图,基本都是默认的配置,无需选择。所有配置完成后,生成工程代码,本文不再详细介绍。
三、主要代码
ADC的初始化代码在MX_ADC1_Init()中,生成的main函数会自动调用:
MX_ADC1_Init();
在进行AD转换时,需要先调用HAL_ADC_Start(&hadc1)函数开始转换,我们不使用中断,通过while (HAL_ADC_PollForConversion(&hadc1,10) != HAL_OK)来等待转换完成,然后通过HAL_ADC_GetValue(&hadc1)函数获取AD值,HAL_ADC_Stop(&hadc1)函数结束转换。以上过程每10ms执行一次,即采样频率100Hz。
HAL_ADC_Start(&hadc1);while (HAL_ADC_PollForConversion(&hadc1,10) != HAL_OK)//等待转换完成{}HeartBeat_RawData = HAL_ADC_GetValue(&hadc1);//RAW_DATA_LENGTH为保存的数据个数HAL_ADC_Stop(&hadc1);printf("%d\n", HeartBeat_RawData);
上面代码中的printf函数将数据打印到串口。看,需要自己写的代码,没有几行。
四、运行效果
上图是通过串口绘图软件VOFA+绘制的原始AD值的图,可看出数据比较杂乱,下图中绿色线是经过简单滤波后的效果:
五、总结
1.实际测试发现,该模块环境影响较大,白天、夜晚,开灯、关灯都会对数据有很大影响,且数据经常会漂移;
2.只是读取了数据,做了简单滤波,从时域图中,找不出什么规律;
3.如果只是用来学习ADC的使用,可以使用本模块练手,也可用这些数据来学习滤波算法、傅里叶变换等,但是想用来比较精准的检测心跳,还是不推荐。
如果觉得《STM32单片机使用ADC功能驱动手指检测心跳模块》对你有帮助,请点赞、收藏,并留下你的观点哦!