1理论分析
MQ- 2 气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。MQ-2 气体传感器对液化气、丙烷、氢气的灵敏度高,对天然气和其它可燃蒸汽的检测也很理想。这种传感器可检测多种可燃性气体,是一款适合多种应用的低成本传感器。
2实验详解
2.1实验目的
1) 通过实验掌握 CC2530 芯片 GPIO 的配置方法;
2) 学会在协议栈中使用 MQ-2 气体传感器;
3) 通过串口输出显示相关浓度信息。
2.2实验设备
硬件:PC 机一台; ZB2530(底板、核心板、仿真器、USB 线) 一套 ;MQ-2 气体传感一套
软件:2000/XP/win7 系统,IAR 8.20 集成开发环境。
2.3实验相关电路图
接线方式:
1、VCC:接电源正极(5V)
2、GND:接电源负极
3、DO:TTL 开关信号输出
4、AO:模拟信号输出(悬空没有使用)
2.4实验相关寄存器
实验中使用P0_5 做为检测引脚,当浓度高于设定值时,P0_5 为低电平,平时正常状态时为高电平。DO 输出电平和厂家有关,请参考具体模块的参数。相关寄存器如下:
配置P0_5的方法:
P0DIR &= ~0x20; //配置与MQ-2 连接的P0.5 为输入口
#define DATA_PIN P0_5 //定义P0.5 口为传感器的输入端
2.5参考代码(部分代码)
/**Includes*********************************************************************/
#include "ioCC2530.h"
#include "string.h"
#include "LCD.h"
/**宏定义***********************************************************************/
//定义数据类型
typedef unsigned char uchar;
typedef unsigned int uint;
typedef signed short int16;
typedef unsigned short uint16;
/**函数声明*********************************************************************/
void InitUart(void);
void UartSendString(char *Data, int len);
uint16 ReadGasData( void );
/**全局变量*********************************************************************/
char TxBuf[4];
uint16 GasData;
uint16 ReadGasData( void );
/**
* @brief 主函数
* @param None
* @retval None
*/
void main(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定为32M
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
InitUart(); //调置串口相关寄存器
LCD_Init(); //oled 初始化
LCD_CLS(); //屏全亮
LCD_welcome();
while(1)
{
GasData = ReadGasData(); //读取烟雾传感器引脚上的ad转换值,并没有换算成能表示烟雾浓度的值
//演示如何使用2530芯片的AD功能,更具体在组网中给出
//读取到的数值转换成字符串,供串口函数输出
TxBuf[0] = GasData / 100 + '0';
TxBuf[1] = GasData / 10%10 + '0';
TxBuf[2] = GasData % 10 + '0';
TxBuf[3] = 0;
UartSendString(TxBuf, 4); //想串口助手送出数据,波特率是115200
UartSendString("\n", sizeof("\n")); //想串口助手送出数据,波特率是115200
DelayMS(500);
LCD_P8x16Str(4, 2, "GasData:");
LCD_P8x16Str(72, 2, (unsigned char*)TxBuf);
DelayMS(1000); //延时函数
}
}
/**
* @brief 串口初始化函数
* @param None
* @retval None
*/
void InitUart(void)
{
PERCFG = 0x00; //外设控制寄存器 USART 0的IO位置:0为P0口位置1
P0SEL = 0x0c; //P0_2,P0_3用作串口(外设功能)
P2DIR &= ~0XC0; //P0优先作为UART0
U0CSR |= 0x80; //设置为UART方式
U0GCR |= 11;
U0BAUD |= 216; //波特率设为115200
UTX0IF = 0; //UART0 TX中断标志初始置位0
}
/**
* @brief 串口发送函数
* @param Data:发送缓冲区 len:发送长度
* @retval None
*/
void UartSendString(char *Data, int len)
{
uint i;
for(i=0; i<len; i++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
/**
* @brief 获取数据
* @param None
* @retval None
*/
uint16 ReadGasData( void )
{
uint16 reading = 0;
/* Enable channel */
ADCCFG |= 0x40;
/* writing to this register starts the extra conversion */
ADCCON3 = 0x86;// AVDD5 引脚 00: 64 抽取率(7 位ENOB) 0110: AIN6
/* Wait for the conversion to be done */
while (!(ADCCON1 & 0x80));
/* Disable channel after done conversion */
ADCCFG &= (0x40 ^ 0xFF); //按位异或。如1010^1111=0101(二进制)
/* Read the result */
reading = ADCL;
reading |= (int16) (ADCH << 8);
reading >>= 8;
return (reading);
}
注意:TxBuf[3] = 0;一定要加这句,这是字符串的结束标志。不明白的查看C语言相关知识吧。
2.6实验现象
下载好程序到开发板,如果带有OLED屏,就可看到OLED上有显示,当异常气体靠近时,发现数据变化,如果没有OLED通过串口查看也是一样的。笔者只是通过OLED查看,想验证串口显示是否正确,有兴趣的自己试试吧。