STM32单片机使用ADC功能驱动手指检测心跳模块

26 篇文章 1 订阅
19 篇文章 3 订阅
本文介绍了使用STM32F103C8T6和ADC模块检测脉搏的原理及实现步骤,包括MXCube配置、ADC初始化代码和数据处理。尽管能用于学习ADC和滤波算法,但模块受环境影响大,数据准确性有限,不适合精确的心跳检测应用。
摘要由CSDN通过智能技术生成

一、模块简介

某宝或某多,两三块钱一个,如下图。
在这里插入图片描述
该模块采用超亮红外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的使用,可以使用本模块练手,也可用这些数据来学习滤波算法、傅里叶变换等,但是想用来比较精准的检测心跳,还是不推荐。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值