传感器实验
酒精传感器
1. 酒精传感器(MQ-3)介绍
特点
? 对乙醇蒸汽有很高的灵敏度和良好的选择性
? 快速的响应恢复特性
? 长期的寿命和可靠的稳定性
? 简单的驱动回路
应用
? 用于机动车驾驶人员及其他严禁酒后作业人员的现场检测;也用于其他场所乙醇蒸汽的检测。
训练目的
通过本实验了解酒精传感器的硬件电路和工作原理
1. 编写一个读取酒精传感器数据的程序
2. 将状态做简单的处理显示
1. 硬件部分
(1) 采集节点一个
(2) J-Link仿真器一个
(3) 显示终端一台
(4) 酒精传感器一个
2. 软件部分
Keil μVision4 开发环境,J-Link 驱动程序
1. 酒精传感器工作原理
电路中用到,酒精传感器电路、信号放大电路、单片机系统、状态显示系统构成。其基本工作原理:经过信号放大电路,酒精传感器电路将感受到的酒精浓度以模拟量形式输出至单片机系统, 经AD转换由状态显示系统进行显示。
酒精传感器工作框图如图5-1:
图5-1 电路工作框图
1. 酒精传感器的硬件电路图
电路中,酒精传感器电路如图5-2。
图5-2 酒精传感器原理图
实验基本步骤如下:
1. 启动Keil μVision4,新建一个项目工程Bank,添加常用组,并添加相应库函数;
2. 在user文件中建立main.c,SystemInit.c,PublicFuc.c文件;
3. 新建一个组sensor,在sensor中编写读取酒精传感器状态的代码;
4. 编译链接工程,并生成hex 文件,所有文件如下图6-1所示:
图6-1 文件示意图
5. 将酒精传感器接到传感器接口1;
图 6-2 酒精传感器
6. 将J-Link仿真器、ZigBee路由器接入传感器采集节点,仿真器USB 接口连入PC 机,插好电源,并打开开发实验箱上的电源开关,如图6-3:
图6-3 硬件连接示意图
7. 将ZigBee协调器接入智能网关,插好电源,并打开电源启动智能网关系统,运行传感器实验显示程序;
图6-4 传感器实验显示程序
图6-5 智能网关连接示意图
8. 选择【Debug】->【Start/Stop Debug Session】,启动J-Link 进行仿真调试;
9. 选择【Debug】->【run】或者按快捷键“F5”,运行程序;
10. 验证:改变酒精的浓度,观察显示屏上数值的变化;
11. 验证完毕后,退出J-Link仿真界面,关闭Keil μVision4软件;关闭硬件电源,整理桌面;
12. 实验完毕。
代码解释:
7.1 IO口初始化
void SensorADInit(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
/* PC0*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* ADC1 */
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //连续多通道模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //连续转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换不受外界决定
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //扫描通道数
ADC_Init(ADC1, &ADC_InitStructure);
// 配置通道10的采样速度,配置为最慢
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5);
/* 允许ADC1*/
ADC_Cmd(ADC1, ENABLE);
/*重置校准寄存器 */
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
/*开始校准状态*/
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
/* 人工打开ADC转换.*/
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
解释:
ADC通道10使用PC0引脚,所以该引脚要设置为模拟量输入。然后调用ADC_Init()函数设置AD转换的配置,调用ADC_RegularChannelConfig()函数设置AD转换通道的采样时间,然后调用ADC_Cmd()函数给AD转换模块上电,调用ADC_ResetCalibration()函数复位校准寄存器准备校准,然后调用ADC_StartCalibration()函数启动校准功能,就这样,最后只要调用ADC_SoftwareStartConvCmd()函数就可以启动AD转换。
7.2 AD转换代码
程序代码:
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx)
{
/* Check the parameters */
assert_param(IS_ADC_ALL_PERIPH(ADCx));
/* Return the selected ADC conversion value */
return (uint16_t) ADCx->DR;
}
代码解析:
通过读取ADCx_DR寄存器的值获取AD转换的结果
u16 Sample_Combustible_gas(void)
{
u16 adc;
adc=ADC_GetConversionValue(ADC1);
return adc;
}
代码解释:
调用ADC_GetConversionValue()函数获取AD转换的结果。
7.2 采集数据函数
void GetSensorAD_data(u8* data)
{
u16 adc;
adc = ADC_GetConversionValue(ADC1); //读取模数转换值
data[0] = 0;
data[1] = (adc>>8)&0x00ff;
data[2] = adc&0x00ff;
data[3] = 0;
data[4] = 0;
}
解释:调用ADC_GetConversionValue(ADC1)函数实现AD数值转换,并将值赋予ADC,再进行必要的转换,实现智能网关的数据显示。
1. 程序是否能运行和编译成功。
2. 用改变酒精的浓度,观察显示屏上显示的数值是否发生变化。
图 8-1 传感器状态显示
思考
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
1. 修改程序,实现一定浓度的报警。