基于S08AW60的矿井下一氧化碳气体检测仪的设计.docx
《基于S08AW60的矿井下一氧化碳气体检测仪的设计.docx》由会员分享,可在线阅读,更多相关《基于S08AW60的矿井下一氧化碳气体检测仪的设计.docx(25页珍藏版)》请在冰豆网上搜索。
基于S08AW60的矿井下一氧化碳气体检测仪的设计
微控制系统原理
课程设计
题目基于S08AW60的矿井下一氧化碳气体检测仪设计
院系名称:
电气工程学院专业班级:
学生姓名:
学号:
设计题目
基于S08AW60的矿井下一氧化碳气体检测仪的设计
设计内容和要求
利用S08AW60设计一个一氧化碳气体检测系统,实现以下功能:
1.实现对一氧化碳浓度的测量;
2.能够完成信号采集、浓度计算、显示、报警等功能;
3.一定距离内,能够准确检测到一氧化碳的浓度准确值。
要求:
1.当一氧化碳的浓度超过预先设定的值时,能够及时报警;
2.检测装置实现在1000ppm范围内对一氧化碳浓度的检测,分辨率高,精度可以达到要求,在误差范围内有较好的重复性。
报告
主要
章节
1.引言
2.一氧化碳气体检测仪的控制法案的设计
3.矿井下一氧化碳气体检测仪的硬件设计
4.软件设计
5.总结
目录
1.引言4
2一氧化碳气体检测仪的控制法案的设计4
3.矿井下一氧化碳气体检测仪的硬件设计5
2.1传感器模块的设计5
2.2键盘的设计7
2.3单片机电路的设计8
2.4显示部分电路的设计9
2.5声光报警电路的设计10
2.6系统电源电路设计11
3软件设计12
4总结13
参考文献14
附录A:
总电路原理图15
附录B:
源程序16
1.引言
煤矿生产时国计民生密切相关的一个领域,而煤矿的安全无疑是大家关注的热点之一,不仅对社会经济有影响,更关系到每个矿业人员的生命安全。
在我国煤矿安全事故中,瓦斯爆炸造成的伤亡占所有重大事故伤亡人数的50%以上,成为实现安全生产的最大障碍。
矿井瓦斯是多种易爆易燃气体的总称,其主要成分之一就是一氧化碳,它与空气混合,当提及百分比达到一定的程度时,遇明火就会爆炸。
2006年初,国家安全生产监督管理总局又提出“低瓦斯矿井也要装备数字化监测监控系统”。
因此,对瓦斯进行实时检测在煤矿生产安全系统中显得非常重要,要实现瓦斯动态连续监测,高性能的智能一氧化碳传感器是必不可少的条件。
2一氧化碳气体检测仪的控制法案的设计
一氧化碳气体检测仪表主要是对井下一氧化碳气体浓度的检测。
一个完整的煤矿气体检测仪表一般由四个部分主城,如图1所示:
图1煤矿气体检测仪表原理框图
(1).传感器:
能感知环境中某种气体及其浓度的一种装置或器件,它能将与气体种类和浓度有关的信息转换成电信号。
(2).转换及控制电路:
该电路的作用是将传感器输出地电信号进行放大、变化和处理,通常包括放大、非线性补偿、信号转换等电路。
(3).声光报警电路:
当检测到的气体浓度超出设定的报警阈值时,就给出声光报警信号。
(4).显示模块:
一般采用集成液晶显示芯片。
3.矿井下一氧化碳气体检测仪的硬件设计
该一氧化碳气体检测仪的研制目标是实现在电池供应的条件下,能够连续不断地对周围环境中的一氧化碳浓度进行准确、灵敏、可靠的检测,而且还要具备超限声光报警、实时测量数据、本地显示的功能。
整机电路由电源电路,一氧化碳气体的检测电路及其信号放大处理电路、嵌入式微处理器电路、液晶显示电路、声光报警电路等组成。
总体设计方框图如图2所示:
图2总体硬件设计方案框图
2.1传感器模块的设计
在一氧化碳气体检测仪中,传感器把一氧化碳气体的浓度转换成电信号,通过静置放大电路、后级放大电路,送入点偏激进行A/D转换处理。
整个数据采集通道如图3所示:
图3数据采集通道框图
(1)前置放大转换电路的设计
前置放大电路由三部分组成:
控制电路、电流测量电路、还有当电源关断时控制工作电极和参考电极电位短接的FET电路。
如图4所示:
图4前置放大电路
(2)后级放大电路的设计
在设计后级放大电路时,由于单电源供电系统的输入信号以地为参考,实际上就是以供电电源的一端作为参考。
这样的反向放大器在输入信号为正电压时,由于输出不可能低于最低供电电压,所以不能正常工作。
当输入信号不是以地做为参考,参考电平与地的差值将随信号一起放大,除非这个参考电平是作为共模电压出现的。
因此要对输入信号进行偏置才能获得想要的输出电压。
为解决这个问题,自然想到了信号采用交流耦合的方法。
但是,采用交流耦合输入输出都需要耦合电容,而耦合电容的存在影响了电路的低频效应,降低了带宽。
当采用同相配置时,放大器静态输出会通过反馈回路影响输入端的偏置电压,处理起来很麻烦。
在这里我们后级放大电路采用直流耦合、放大器同相放大正偏移的设计方法,大大简化了单电源供电放大器的设计。
电路如图5所示:
图5后级放大电路
2.2键盘的设计
键盘电路主要用来输入数据,从而实现人机交互。
键盘采用软件查询和外部中断相结合的方法来设计,高电平有效。
系统共用到4个按键,由于按键较少,所以选择了独立式键盘。
每个独立式按键占用一根I/O线,每根I/O线上的按键工作状态不会影响其他I/O口线上的按键的工作状态,其电路如图6所示。
AN1复位键是系统复位。
AN2是功能转换键,按键按下时,显示质量浓度设定值;按键升起时,显示当前质量浓度值。
AN3是减1键,设定气体质量浓度逐次减1。
AN4是加1键,设定气体质量浓度逐次加1。
图6键盘电路
2.3单片机电路的设计
飞思卡尔的新型8位MC9S08AW系列微控制器是第一款基于高度节能型S08核的器件,支持5V应用。
这使得其成为工业应用的理想之选,而且它还是第一款认可用于汽车市场的S08微控制器。
其最小系统如下所述:
(1)电源电路
VDD和VSS是S08MCU主要的电源引脚,工作电压范围是2.7V~5.5V.该电源为所有的I/O缓冲器电路和内部稳压器供电。
通常,应用系统需要在电源引脚上加两个独立的电容器。
其中一个为大容量的电解电容,如10uF电容为系统提供大容量的电荷存储,同时应在尽量靠近MCU电源引脚的地方安装一个0.1uF的陶瓷旁路电容器来抑制高频噪声。
(2)振荡器
S08AW60没有外部晶振或振荡器也能工作。
在这种情况下,MCU使用自身内部时钟频率相当于8MHZ。
该时钟可用于MCU的复位启动过程,以减小晶振起振时间的延迟对MCU节能模式和快速响应的影响。
(3)复位电路
RESET引脚是专门用于单片机的复位,该引脚带有在内置的上拉器件,输入迟滞,10mA电流输出驱动,无输出压摆率控制。
由于具有内部上电复位和低电压检测复位功能,所以没必要给MCU施加一个外部复位信号。
如果需要,可以增加一个到地电位的简单开关以实现手动外部复位。
另外在复位引脚处连接RC滤波可以增加系统的抗干扰性。
实际最小系统电路连接图如图7所示:
图7S08AW60最小系统电路连接图
2.4显示部分电路的设计
由于发光二极管显示器LED多为8段或米字段,只能输出有限的字符,对于仪器的使用者来说很不方便,所以我们在智能传感器上使用了LCD1602字符液晶显示器。
S08AW60与液晶显示模块连接的电路图如图8所示。
具体引脚说明为:
4,5,6三个控制引脚分别连接单片机的PTE5,PTE6,PTE7三个串行通讯引脚。
DB0-DB7分别连接于单片机的PTB0-PTB7八个输出引脚。
图8显示模块电路图
2.5声光报警电路的设计
当测量的达到或超过设定的报警点的时候,仪器应当发出声光报警信号,以提示周围人员的注意。
当发现有超限参数或出现错误,则软件单片机口线输出一驱动信号,驱动声光报警电路开始工作。
为了降低系统功耗,采用PNP三极管,具体的声光报警电路如图9所示。
当输入电平“0”时,三极管导通,蜂鸣器鸣叫,同时相应通道和相应级别的红绿色发光二极管指示灯亮。
当传感器信号未接入,即为故障状态,相应通道的黄色发光二极管灯亮。
图9声光报警电路
2.6系统电源电路设计
该检测装置的系统9V电源由六节干电池提供。
通过线性电压基准器件LM317、TPS76301及辅助电路将9V的电源变换成不同等级的电压值,为传感器、信号调理电路、声光报警电路、显示电路、串口电路等提供工作电压,电压转换电路如图10所示。
图10电压转换电路
3软件设计
任务级由一个无限循环程序构成。
系统上电,完成初始化任务后进入无限循环。
无限循环内包含了从电信号的采样到浓度超限报警等服务程序,流程图如图11所示。
一旦发生SPI接受中断,中断服务程序进入串口中断程序。
完成通讯服务后,程序从新返回死循环。
若发生键盘中断,则进入键盘中断程序。
首先芯片本身主要进行环境的初始化任务:
包括所用的寄存器清零,程序ROM区和数据RAM区的初始化,中断I/O矢量设置等等主程序运行之前的准备工作,检查和保护电源,利用看门狗监视芯片上电后S08AW60芯片内各资源的硬件运行情况,定时器的设置,所用变量初始化,开中断,检测传感器信号是否正确接入,未接入产生故障报警等。
接则进入采样任务,包括A/D转换,然后进入计算任务,首先是计算一氧化碳的浓度值,后进入显示任务,包括在液晶显示器上显示浓度数据,最后进入报警任务,主要判断是否达到报警值,确定是否需要报警,然后回到采样任务一直循环。
图11程序整体结构框图
4总结
本文从我国煤矿安全的现状出发,阐述了研发煤矿用智能参数检测仪的必要性和现实意义,并对国内外现状金像了分析,提出了该仪器的技术指标和功能要求,对该仪器的核心部件一氧化碳气体敏感元件,CPU、显示模块等进行了比较选型,保证了整个仪器测量的准确性、可靠性。
本文的主要研究工作体现在以下几个方面:
(1)阐述了煤矿智能气体检测仪的设计要求和设计原理;基于设计要求和设计原理,完成了气体检测仪的硬件系统设计,主要包括一氧化碳气体的检测电路和信号处理电路、嵌入式微处理器系统、液晶显示电路、声光报警电路和保护电路等。
(2)通过对电化学式传感器检测一氧化碳的原理进行分析,结合在检测电路中模拟电路设计的特点,检测装置的模拟输入通道进行了详细的设计,同时设计了数据采集、控制和处理软件。
(3)由于本设计采用了S08AW60系列8位单片机,本智能仪器可以扩展为智能多参数的气体检测仪器,例如可以同时测量甲烷、氧气、一氧化碳以及环境温度等参数,因此可以为以后的学习和应用智能仪器打下基础。
参考文献
[1]王威.嵌入式微控制器S08AW原理与实践[M].北京:
北京航空航天大学出版社,2009
[2]陈杰.传感器与检测技术[M].北京:
高教出版社,2004
[3]邵贝贝.龚光华.单片机认识与实践[M].北京:
北京航空航天大学出版社,2006
[4]阎石....数字电子技术基础(第三版)....北京:
高等教育出版社,1989
[5]沈兰荪.数据采集与处理[M]北京:
能源出版社,1987
[6]沙占友、王彦朋、孟志永.单片机外围电路设计.电子工业出版社,2003
[7]孙传友、汉泽西.测控系统原理与设计.北京航空航天大学出版社,2002
附录A:
总电路原理图
附录B:
源程序
#include
#nclude"derivative"//调用外函数//
#include
#include
#include
#include
#include
#include/**********初始化CPU************/
voidinit_cpu()//初始化cPu
{
TIM1SC=0X4E;
TPM1MODH=0X0C;
TPM1MODL=0X35;
EnbleInterrupts;
}
interruptVectorNumber_Vtpm1ovfvoidTPM1_OVF_ISR()
{
keyval=PTAD;
}//初始化CPU结束//
voidmain_menu_initial()//LCD主菜单初始化.//
{
main1_menu[0].menu_count=4;//有4个菜单项.//
main1_menu[0].display=measurearray;//定义一个”开始测量“数组//
main1_menu[0].subs=NULL;
main1_menu[0].children_menus=measure_menu;//当前菜单子菜单的指针
main1_menu[0].parent_menus=NULL;
}
voidmeasure_menu_initial()//“开始测量”菜单设置//
{
measure_menu[0].menu_count=2;
measure_menu[0].display=qr;//开始测量函数,确认.
measure_menu[0].subs=start_measure_function;//开始测量函数
measure_menu[0].children_menus=NULL;
measure_menu[0].parent_menus=main1_menu;
measure_menu[1].menu_count=2;
measure_menu[1].display=qx;//开始测量函数,取消.
measure_menu[1].subs=NULL;
measure_menu[1].children_menus=NULL;
measure_menu[1].parent_menus=main1_menu;
}
//还有voidstore_menu_initial()、voidtime_menu_initial()//
voidled_menu_pro(){
max_item=menu_led->menu_count;
switch(keyval)
{
case0:
break;
case1:
//向上键.
if(user_choosen==0)
{
user_choosen=max_item;
}
shuaxin=1;
user_choosen--;
break;
}
……//“向上”“向下”“确认”“取消”键//
if(shuaxin)//是否需要刷新LCD标志位.
{Clr_Scr();
shuaxin=0;
}
led_menu_show();
}
voidled_menu_show()
{
ucharn;
max_item=menu_led->menu_count;
if(max_item>=4)//菜单项为3则表示为主菜单.
{
for(n=0;n<4;n++)
{draw_bmp(n*2,20,96,0,menu_led[n].display);
}
select_item(user_choosen);//标记出当前菜单项.
}
else
{
switch(temp_choosen)
{case0:
draw_bmp(0,20,96,0,measurearray);//“开始测量”数组//
break;
……
default:
break;
}
for(n=0;n{
draw_bmp((n+1)*2,20,32,0,menu_led[n].display);
}
select_item(user_choosen+1);}}
voidselect_item(ucharn)
{
draw_bmp(n*2,2,16,0,curflag);
}
voidstart_measure_function(void)//开始测量函数//
{main_Menu();
}
……
/*----------------主函数-------------------*/
main()
{
PTADD=0XFF;
PTBDD=0X00;
init_cpu();
Init_Clock();
init_lcd();
Disp_Img(FirstPage);
delay(2000);//延时//
ClockMsg();
Refresh();
delay(2500);
Clr_Scr();
main_Menu();
Clr_Scr();
main_menu_initial();
measure_menu_initial();
store_menu_initial();
time_menu_initial();
communication_menu_initial();
while
(1)
{keyval=get_key();//读键.
led_menu_pro();
}
}//适当延时防止因为不断查忙而耗费大量CUP资源//
ADC0832程序
#defineuintunsignedint//常量/变量定义//
uchark,i,j;
floatlv;
#defnieADCSPTAD_PTAD4//接口定义//
……//其它引脚略……
uchardsw[20];//存放sprintf转换字符
ucharvalue[149];//点阵字符储存
uchartable[]={//字符查表
0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*".",0*/
……};//采集并返回
unsignedintAdc0832(unsignedcharchannel)//AD转换,返回结果
{
uchari=0;
ucharj;
uintdat=0;
ucharndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1;
ADCS=0;//拉低CS端
ADCLK=1;//拉高CLK端
ADCLK=0;//拉低CLK端,形成下降沿1
ADCLK=1;//拉高CLK端
ADDI=channel&0x1;
ADCLK=0;//拉低CLK端,形成下降沿2
ADCLK=1;//拉高CLK端
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿3
ADDI=1;//控制命令结束
dat=0;
for(i=0;i<8;i++)
{
dat|=ADDO;//收数据
ADCLK=1;
ADCLK=0;//形成一次时钟脉冲
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO;//收数据
ADCLK=1;
ADCLK=0;//形成一次时钟脉冲
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1;//拉低CS端
ADCLK=0;//拉低CLK端
ADDO=1;//拉高数据端,回到初始状态
dat<<=8;
dat|=ndat;
return(dat);//returnadk
}
/*----------------------点阵字符采集函数--------------------------*/
voidtra(uchar*p)//数组dsp[]里面的字符查询后,再储储存到另一个显示数组value[]
voidmain_Menu()
{Clr_Scr();//先清屏//
CS2=1;CS1=0;
hz_disp16(0,32,1,jiaquan);……//甲//醛//测//量//数//据//存//储//……
delay(2000);
do{
/*k=Adc0832(0);//AD转换结果
l=k/255.0*100.0;
ltemp=floor(l);
dsw[0]=ltemp/10;
dsw[1]=ltemp%10;
//sprintf(dsw,"%2.3f",l);
//dsw[0]=1;
switch(dsw[0])
{
case0:
sz_disp16(2,32,1,sz0);
break;
case1:
……sz_disp16(2,32,1,sz9);
}
switch(dsw[1])
{
case0:
sz_disp16(2,40,1,sz0);
break;
case1:
……sz_disp16(2,40,1,sz9);
}*/
//sz_disp16(2,40,1,sz0);
/*tra(dsw);
CS2=1;CS1=0;
sz_disp16(2,56,1,value);*/
}
while(P1_3);
}