第三次培训 心率传感器和烟雾传感器的学习了解
一.pulsesensor传感器
1.学习了解
Pulse Sensor是一款用来检测心率的传感器,使用方法还是比较方便的,用户只需要用手指按住传感器就可以,传感器的实物图如下:
2.如何使用
PulseSensor 是一款用于脉搏心率测量的光电反射式模拟传感器。将其佩戴于手指、耳垂等处,利用人体组织在血管搏动时造成透光率不同来进行脉搏测量。传感器对光电信号进行滤波、放大,最终输出模拟电压值。单片机通过将采集到的模拟信号值转换为数字信号,再通过简单计算就可以得到心率数值。
3.工作原理
Pulse Sensor检测原理是通过发射光源,然后根据光源返回的效果输出ADC数据。由于手指上布满毛细血管,而毛细血管会随着心率而跳动,这就导致传感器发射和接收光的效果不同,从而达到ADC输出效果不同,比如下图就是ADC的输出图:
因此检测心率的方式很简单:测出两个ADC峰值间的时长,假设这个时长为T,单位是毫秒,那么1分钟的心率假设为S,则:
S = 60000/T 次/秒
4.相关程序实例
/********** ADC通道2转换函数 **************/
u16 Get_ADC_1_CH2(void)
{
u8 i,j;
u16 buff[10] = {0};
u16 temp;
for(i = 0; i < 10; i ++)
{
/* 开始转换 */
ADC1->CR2 |= 1 << 30;
/* 等待转换结束 */
while( !(ADC1->SR & (1 << 1)) )
{
/* 等待转换接收 */
}
buff[i] = ADC1->DR; //读取转换结果
}
/* 把读取值的数据按从小到大的排列 */
for(i = 0; i < 9; i++)
{
for(j = 0 ; j < 9-i; j++)
{
if(buff[j] > buff[j+1])
{
temp = buff[j];
buff[j] = buff[j+1];
buff[j+1] = temp;
}
}
}
/* 求平均值 */
temp = 0;
for(i = 1; i < 9; i++)
{
temp += buff[i];
}
return temp/8;
5.相关注意事项
二.烟雾传感器
1.MQ-2可用于家庭和工厂的气体泄漏监测装置,适宜于液化气、苯、烷、酒精、氢气、烟雾等的探测。故因此,MQ-2可以准确来说是一个多种气体探测器。
MQ-2的探测范围极其的广泛。它的优点:灵敏度高、响应快、稳定性好、寿命长、驱动电路简单。
实物图如下
2.工作原理
MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。处于200~300摄氏度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的调至而变化,就会引起表面导电率的变化。利用这一点就可以获得这种烟雾存在的信息,烟雾的浓度越大,导电率越大,输出电阻越低,则输出的模拟信号就越大。
3.如何使用
MQ-2常用的电路有两种,一种使用采用比较器电路监控,另一种为ADC电路检测。
比较器电路
ADC转换电路
4.相关程序实例
/****************************************************************************
函数功能:AD转换子程序
入口参数:channel
出口参数:dat
****************************************************************************/
unsigned char adc0832(unsigned char channel )
{
unsigned char i,test,adval,dat;
adval = 0x00;
test = 0x00;
Clk = 0; //初始化
DATI = 1;
_nop_();
CS = 0;
_nop_();
Clk = 1;
_nop_();
if (channel == 0x00 ) //通道选择
{
Clk = 0;
DATI = 1; //通道0的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 0; //通道0的第二位
_nop_();
Clk = 1;
_nop_();
}
else
{
Clk = 0;
DATI = 1; //通道1的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 1; //通道1的第二位
_nop_();
Clk = 1;
_nop_();
}
Clk = 0;
DATI = 1;
for( i = 0;i < 8;i++ ) //读取前8位的值
{
_nop_();
adval <<= 1;
Clk = 1;
_nop_();
Clk = 0;
if (DATO)
adval |= 0x01;
else
adval |= 0x00;
}
for (i = 0; i < 8; i++) //读取后8位的值
{
test >>= 1;
if (DATO)
test |= 0x80;
else
test |= 0x00;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
}
if (adval == test) //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
dat = test;
nop_();
CS = 1; //释放ADC0832
DATO = 1;
Clk = 1;
return dat;
}
/****************************************************************************
函数功能:获取烟雾浓度
入口参数:无
出口参数:dat
****************************************************************************/
unsigned char GetYanWuValue(void)
{
unsigned int sum=0;
unsigned char m,value=0;
for(m=0;m<20;m++) //读50次AD值
sum = adc0832(0)+sum; //读到的AD值,将读到的数据累加到sum
value=(unsigned char)(sum/20); //跳出上面的for循环后,将累加的总数除以50得到平均值value
if(value > ADC_Zero)
value = value - ADC_Zero; //首先减去零点漂移
else
value = 0;
return value;
}

来源:oschina
链接:https://my.oschina.net/u/4361381/blog/4475938