




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
./信息工程学院CDIO指导老师:申小颂组员:建、白兰、晓曦、勋、汤泉、马娜、艳鹏20.摘要本题设计一个智能灭火小车,以宏晶公司生产的STC12C5A60S2芯片为核心,辅助必要的外围电路〔包括舵机控制、电机控制、红外接收、驱动,利用C语言编程,实现了智能车自动寻找火源〔以下简称自动模式以及由遥控方式寻找火源〔以下简称遥控模式两种灭火模式,在自动模式下,小车能够自己寻找火源并主动向火源靠近;在遥控模式下,小车能由遥控者控制寻找火源并进行灭火。关键词:灭火STC12C5A.目录1系统方案11.1电源模块11.2舵机驱动模块11.3电机驱动的论证与选择11.3主控芯片的论证与选择21.4火源寻找模块的论证与选择31.5遥控模块的论证与选择32系统理论分析与计算32.1电机控制电路的分析32.1.1电机驱动控制的分析3脉冲宽度的分析42.2舵机原理的分析42.2.1舵机转动角度原理42.3红外编码原理的分析52.3.1编码原理53电路与程序设计63.1电路的设计6系统总体框图6单片机系统框图与电路原理图6电机驱动系统框图与电路原理图7红外接收原理图8电源93.2程序的设计9程序功能描述与设计思路9程序流程图9附录1:系统电路原理图13.智能灭火机器人1系统方案本系统主要由电源模块、电机驱动模块、舵机驱动模块、火源寻找模块、遥控模块、主控芯片组成,下面分别论证这几个模块的选择。1.1电源模块方案一:采用1117稳压芯片将电池7.8V电压稳到5V供给单片机、红外及舵机。此方案设计简单,成本低。但是1117芯片最大承受电流不到1A,不能稳定供给给红外及舵机。方案二:采用2596芯片制作的开关电源为整个系统供电,2596芯片最大输出电流达3A,可以供给整个系统足够电流。但是此电路结构复杂,成本高。且用一个电源芯片会造成相互影响。特别是舵机、电机转动可能导致对单片机供电不稳定。方案三:采用双电源供电,利用1117芯片只跟单片机供电。电机模块、舵机模块以及红外模块通过7805线性电源芯片为其供电。此方案电路结构简单,成本适中,并且减小了各个模块间的相互影响,增强系统稳定性。综上所述,分析各个方案有确定及实际应用情况,我们选择方案三作为电源模块方案。1.2舵机驱动模块舵机转动自身会产生微弱电流,反馈给电源模块造成电压不稳定。所以不能与单片机用同一个电源芯片,我们在电源模块选择时选择双电源供电,解决了这一问题。舵机直接由7805线性电源芯片供电。1.3电机驱动的论证与选择方案一:采用L298N驱动直流电动机,该芯片是利用TTL电平进行控制,对电机的操作方便,通过改变芯片控制端的输入电平,即可以对电机进行正反转操作,很方便单片机的操作,亦能满足直流减速电机的要求。采用L298N少占用的空间且不容易产生信号干扰<电机驱动如图1.3所示>。图1.3电机驱动电路方案二:采用分立元件组成的平衡式驱动电路,这种电路可以由单片机直接对其进行操作,但由于分立元件占用的空间比较大,容易产生信号干扰,且还要配上两个继电器,考虑到小车运转稳定性问题,此方案不够理想。综合考虑采用方案一:采用L298N驱动直流电动机。1.3主控芯片的论证与选择方案一:采用Atmel公司的AT89c52RC单片机作为系统的控制器。单片机算术运算功能强,软件编程灵活,可用软件较简单的实现各种算术和逻辑控制,并且由于其成本低,体积小和功耗低等优点,使其在各个领域应用广泛;另外,由于本设计中会用到较多的算术运算,所以对本系统来说非常适合利用单片机作为控制器。方案二:采用Atmel公司的STC12C5A60S2单片机作为系统的控制器。综合考虑,本系统所需处理的信息量比较大,并且要用到AD采集模块,所以采用方案二作为本系统控制芯片。1.4火源寻找模块的论证与选择方案一:采用温度传感器作为火源寻找模块的主要传感器,利用火源外围温度比常温高这一特点寻找火源。此方案虽然易于理解但是温度传感器稳定性差,在不同室温下门限值要求不同,适应性差。并且火源外围温度变化围窄,不适合远距离寻找火源。方案二:采用红外接收头作为火源寻找模块的主要传感器,利用接收红外光的不同寻找火源,经试验,红外接收头在对准火源时电阻变化很大,很利于信号采集。而且电路结构简单,编程容易。缺点在于适应性差,等热光源对其影响较大。综合考虑所有因素,我们选择方案二作为火源寻找模块的方案。1.5遥控模块的论证与选择 方案一:采用24L01无线射频收发芯片作为遥控模块主芯片,此芯片有效距离长并且外界对其干扰小。但是成本高,需要两块芯片作为发送和接受,并且电路复杂,编程困难。不容易调试,出问题不易找出问题所在。 方案二:利用红外编码遥控,此方案结构简单,只需一个普通红外遥控器及0038接收头就能实现遥控,成本低,编程容易,调试方便。缺点在于外界影响比较大。 综合考虑两种方案的优缺点以及实际情况,我们选择方案二作为最终方案。2系统理论分析与计算2.1电机控制电路的分析电机驱动控制的分析L298N是SGS公司的产品,部含4通道逻辑驱动电路。是一种二相和四相电机专用驱动器,即含二个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可以驱动46V、2A一下的电机。表1LIN1IN2ENA电机状态XX0停止101顺时针011逆时针000停止110停止脉冲宽度的分析脉冲宽度调制〔PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有<ON>,要么完全无<OFF>。电压或电流源是以一种通<ON>或断<OFF>的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。2.2舵机原理的分析舵机转动角度原理控制电路板接受来自信号线的控制信号〔具体信号待会再讲,控制电机转动,电机带动一系列齿轮组,减速后传动至输出舵盘。舵机的输出轴和位置反馈电位计是相连的,舵盘转动的同时,带动位置反馈电位计,电位计将输出一个电压信号到控制电路板,进行反馈,然后控制电路板根据所在位置决定电机的转动方向和速度,从而达到目标停止。舵机的基本结构是这样,但实现起来有很多种。例如电机就有有刷和无刷之分,齿轮有塑料和金属之分,输出轴有滑动和滚动之分,壳体有塑料和铝合金之分,速度有快速和慢速之分,体积有大中小三种之分等等,组合不同,价格也千差万别。例如,其中小舵机一般称作微舵,同种材料的条件下是中型的一倍多,金属齿轮是塑料齿轮的一倍多。需要根据需要选用不同类型。舵机的输入线共有三条,红色中间,是电源线,一边黑色的是地线,这辆根线给舵机提供最基本的能源保证,主要是电机的转动消耗。电源有两种规格,一是4.8V,一是6.0V,分别对应不同的转矩标准,即输出力矩不同,6.0V对应的要大一些,具体看应用条件;另外一根线是控制信号线,Futaba的一般为白色,JR的一般为桔黄色。另外要注意一点,SANWA的某些型号的舵机引线电源线在边上而不是中间,需要辨认。但记住红色为电源,黑色为地线,一般不会搞错。舵机的控制信号为周期是20ms的脉宽调制〔PWM信号,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0-180度,呈线性变化。也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。舵机部有一个基准电路,产生周期20ms,宽度1.5ms的基准信号,有一个比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号。由此可见,舵机是一种位置伺服的驱动器,转动围不能超过180度,适用于那些需要角度不断变化并可以保持的驱动当中。2.3红外编码原理的分析2.3.1编码原理WD6122所发射的一帧码含有一个引导码,16位的用户编码和8位的键数据码、键数据码的反码也同时被传送。码型结构如下:引导码由一个9ms的载波波形和4.5ms的关断时间构成,它作为随后发射的码的引导,这样当接收系统是由微处理器构成的时候,能更有效地处理码的接收与检测及其它各项控制之间的时序关系。编码采用脉冲位置调制方式〔PPM。利用脉冲之间的时间间隔来区分"0”和"1”。每次83电路与程序设计3.1电路的设计系统总体框图系统总体框图如图所示主系统板主系统板红外接收遥控接收舵机驱动电机驱动遥控板系统总体框图单片机系统框图与电路原理图1、单片机最小系统框图单片机最小系统采用宏晶公司的STC12C5A60S2单片机,核心板采用5V输入,采用12M有源晶振。核心板13只I/O口引出,便于与外围器件的连接及系统扩展。单片机最小系统框图如图图1:单片机系统原理图电机驱动系统框图与电路原理图
L298N部包含4信道逻辑驱动电路,是一种二相和四相步进电机的专用驱动器,可同时驱动2个二相或1个四相步进电机,含二个H-Bridge的高电压、大电流双全桥式驱动器,接收标准。TL逻辑准位信号,可驱动46V、2A以下的步进电机,且可以直接透过电源来调节输出电压从而控制电机转速。原理图如图2所示。图2:电机驱动原理图红外接收原理图本系统一共设置了2个红外接收头,左右各一个用于火源寻找。图3:红外接收原理图电源1117电源:7805电源:3.2程序的设计程序功能描述与设计思路1、程序功能描述程序包括舵机角度控制,电机转速控制,红外解码,红外接收等功能模块。实现两种寻火模式。在遥控模式下,红外接收模块停止工作,机器人只由遥控者控制前往火源出进行灭火。在自动模式下,机器人自主寻找火源,自主前往火源处,此时遥控者随时可以中断自动模式改为遥控模式。程序流程图1、主程序流程图启动启动初始化遥控模式自动模式模式选择遥控器控制小车灭火红外接收模块控制小车停止.附录1:系统电路原理图系统电路PCB红外接模块PCB驱动模块PCB附件二:程序代码.#include<reg51.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsfrP1ASF=0X9D;//P1口选择功能寄存器sfrADC_CONTR=0XBC;//ADC控制寄存器sfrADC_RES=0XBD;//ADC转换结果寄存器高sfrADC_RESL=0XBE;//ADC转换结果寄存器低sfrAUXR1=0XA2;//ADC转换结果调整位sfrCMOD=0xD9;//PCA工作模式寄存器sfrCCON=0xD8;//PCA控制寄存器//sfrCR=CCON^6;sfrCCAPM0=0xDA; //PCA0比较捕获寄存器sfrCCAPM1=0xDB;//PCA1比较捕获寄存器sfrCL=0xE9;//PCA的十六位计数器低八位CLsfrCH=0xF9; //PCA的十六位计数器高八位CHsfrCCAP0L=0xEA; //PCA捕捉比较寄存器sfrCCAP1L=0xEB;sfrCCAP0H=0xFA;sfrCCAP1H=0xFb;sfrPCA_PWM0=0xF2;//PCA模块PWM寄存器sfrPCA_PWM1=0xF3;//PCA模块PWM寄存器ucharLCD_ID_1[16]={"miehuoxiaoche"};ucharLCD_ID_2[16]={"IRCODE:--H"};uintADC_Result[3]; //AD转换结果存储ucharCYCLE; //定义周期ucharPWM_ON=0; //定义低电平时间ucharIRCOM[7];ucharkeys=0xff,x;intmie=0;voidPWM_Init<void>;voidADC_init0<void>; //P1.0口AD转换初始化voidADC_init1<void>;//P1.1口AD转换初始化voidADC_init2<void>; //P1.2口AD转换初始化voidDelay<uintx>;//延时函数voiddelay<ucharx>;//x*0.14MSvoiddelay1<intms>;voidDelay<uintz>;//延时函数voiddang<>;sbitdj1in1=P1^3; //电机接口1IN1sbitdj1in2=P1^4; //电机接口1IN2sbitpz1=P3^2; //碰撞开关接口1sbitpz2=P3^4; //碰撞开关接口2sbitIRIN=P3^3;//红外接收器数据线sbitPWM=P3^6; //定义舵机的控制端口sbitfeng=P2^0;sbitE=P2^7; //1602使能引脚sbitRW=P2^6; //1602读写引脚sbitRS=P2^5; //1602数据/命令选择引脚sbitring=P2^4;voidqian<>;voidhou<>;voidzuo<>;voidyou<>;voidstop<>;voidzidong<>;voidmiehuokai<>;voidmiehuoguan<>;/*********************************************************************名称:delay<>*功能:延时,延时时间大概为140US。*输入:无*输出:无***********************************************************************/voidDelay2<>{ inti,j; for<i=0;i<=10;i++> for<j=0;j<=2;j++>;}/*********************************************************************名称:enable<uchardel>*功能:1602命令函数*输入:输入的命令值*输出:无***********************************************************************/voidenable<uchardel>{ P0=del; RS=0; RW=0; E=0; Delay2<>; E=1; Delay2<>;}/*********************************************************************名称:write<uchardel>*功能:1602写数据函数*输入:需要写入1602的数据*输出:无***********************************************************************/voidwrite<uchardel>{ P0=del; RS=1; RW=0; E=0; Delay2<>; E=1; Delay2<>;}/*********************************************************************名称:L1602_init<>*功能:1602初始化,请参考1602的资料*输入:无*输出:无***********************************************************************/voidL1602_init<void>{ enable<0x01>; enable<0x38>; enable<0x0c>; enable<0x06>; enable<0xd0>;}/*********************************************************************名称:L1602_char<ucharhang,ucharlie,charsign>*功能:改变液晶中某位的值,如果要让第一行,第五个字符显示"b",调用该函数如下 L1602_char<1,5,'b'>*输入:行,列,需要输入1602的数据*输出:无***********************************************************************/voidL1602_char<ucharhang,ucharlie,charsign>{ uchara; if<hang==1>a=0x80; if<hang==2>a=0xc0; a=a+lie-1; enable<a>; write<sign>;}/*********************************************************************名称:L1602_string<ucharhang,ucharlie,uchar*p>*功能:改变液晶中某位的值,如果要让第一行,第五个字符开始显示"abcdef",调用该函数如下 L1602_string<1,5,"abcdef;">*输入:行,列,需要输入1602的数据*输出:无***********************************************************************/voidL1602_string<ucharhang,ucharlie,uchar*p>{ uchara; if<hang==1>a=0x80; if<hang==2>a=0xc0; a=a+lie-1; enable<a>; while<1> { if<*p=='\0'>break; write<*p>; p++; }}voidTime0<void>{ TMOD|=0x01; //定时器设置1msin12Mcrystal TH0=<65536-250>/256; TL0=<65536-250>%256;//定时0.25mS //打开中断 TR0=1; //定时器打开}voidTime1<void>{ TMOD|=0x01; //定时器设置1msin12Mcrystal TH0=<65536-250>/256; TL0=<65536-250>%256;//定时0.25mS //打开中断 TR0=1; //定时器打开}/*******************************************************************/main<>{ Time0<>;IE=0x86;//允许总中断中断,使能INT1外部中断TCON=0x10;//触发方式为脉冲负边沿触发 CYCLE=81; PWM=0;IRIN=1;//I/O口初始化 feng=0;delay1<10>;//延时L1602_init<>;//初始化LCD L1602_string<1,1,LCD_ID_1>; L1602_string<2,1,LCD_ID_2>; PWM_Init<>;while<1>{ switch<keys> { case 0x45: zidong<>;break; case 0x40: qian<>;break; case 0x19: hou<>;break; case 0x07: zuo<>;break; case 0x09: you<>;break; case 0x15: stop<>;break; case 0x47: miehuokai<>;break; case 0x43: miehuoguan<>;break; case 0x0C: x=0X60;break; case 0x18: x=0X50;break; case 0x5E: x=0X40;break; default:break; }}}//endmain/**********************************************************/voidIR_IN<>interrupt2using0{unsignedcharj,k,N=0;EX1=0; delay<15>; if<IRIN==1>{EX1=1; return; }//确认IR信号出现while<!IRIN>//等IR变为高电平,跳过9ms的前导低电平信号。{delay<1>;}for<j=0;j<4;j++>//收集四组数据{for<k=0;k<8;k++>//每组数据有8位{while<IRIN>//等IR变为低电平,跳过4.5ms的前导高电平信号。{delay<1>;}while<!IRIN>//等IR变为高电平{delay<1>;}while<IRIN>//计算IR高电平时长{delay<1>;N++;if<N>=30> {EX1=1; return;}//0.14ms计数过长自动离开。}//高电平计数完毕IRCOM[j]=IRCOM[j]>>1;//数据最高位补"0if<N>=8>{IRCOM[j]=IRCOM[j]|0x80;}//数据最高位补"1N=0;}//endfork}//endforjkeys=IRCOM[2];if<IRCOM[2]!=~IRCOM[3]>{EX1=1;return;}IRCOM[5]=IRCOM[2]&0x0F;//取键码的低四位IRCOM[6]=IRCOM[2]>>4;//右移4次,高四位变为低四位if<IRCOM[5]>9>{IRCOM[5]=IRCOM[5]+0x37;}else IRCOM[5]=IRCOM[5]+0x30;if<IRCOM[6]>9>{IRCOM[6]=IRCOM[6]+0x37;}else IRCOM[6]=IRCOM[6]+0x30;//////////////////////////L1602_char<2,10,IRCOM[5]>;L1602_char<2,9,IRCOM[6]>;//beep<>;EX1=1;}voidtim<void>interrupt1using1{ staticunsignedcharcount; TH0=<65536-250>/256; TL0=<65536-250>%256;//定时1mS if<count==PWM_ON> { PWM=1; //直流电机转 } count++; if<count==CYCLE> { count=0; if<PWM_ON!=0>//如果左右时间是0保持原来状态 { PWM=0;//直流电机不转 } }}/**********************************************************/voiddelay<unsignedcharx>//x*0.14MS{unsignedchari,j;while<x-->{for<j=0;j<12;j++>{for<i=0;i<13;i++>{}}}}/**********************************************************/voiddelay1<intms>{unsignedchary;while<ms-->{for<y=0;y<250;y++>{_nop_<>;_nop_<>;_nop_<>;_nop_<>;}}}voidqian<>{ PWM_ON=73;CCAP0H=CCAP0L=x; CCAP1H=CCAP1L=0xff;}voidhou<>{ CCAP1H=CCAP1L=x; CCAP0H=CCAP0L=0xff;}voidyou<>{ PWM_ON=71;}voidzuo<>{ PWM_ON=75;}voidstop<>{ CCAP0H=CCAP0L=0xff; CCAP1H=CCAP0L=0xff;}voidzidong<>{ CCAP0H=CCAP1L=0x50; CCAP1H=CCAP1L=0xff; ADC_init0<>; _nop_<>; _nop_<>; ADC_init1<>; _nop_<>; _nop_<>; ADC_init2<>; _nop_<>; _nop_<>; CCAP0H=CCAP0L=0x50; CCAP1H=CCAP1L=0xff; if<ADC_Result[0]>ADC_Result[1]+50> { PWM_ON=75; ring=0; } elseif<ADC_Result[1]>ADC_Result[0]+50> { PWM_ON=71; ring=0; } else { PWM_ON=73; } /*if<<ADC_Result[2]>ADC_Result[1]>&&<ADC_Result[2]>ADC_Result[0]>> { PWM_ON=71; }*/}voidPWM_Init<void> //PWM初始化程序{ CCON=0; CL=0; CH=0; CMOD=0x02; //计数模式、计数时钟选择 CCAP0H=CCAP0L=0Xff; CCAPM0=0x42; //使能PCA模块工作在PWM模块 CCAP1H=CCAP1L=0Xff; //PCA_PWM1=0x03; CCAPM1=0x42; //使能PCA模块工作在PWM模块 CCON=0X40;} /**************P1.0口AD初始化程序***********************************/voidADC_init0<void> //AD转换初始化{ uintADC_Result1,ADC_Result2,a; ADC_RES=0; ADC_RESL=0; for<a=0;a<20;a++>; P1ASF=0X07;//X选择P1.0作为ADC转换输入通道 ADC_CONTR=0X80; //打开ADC转换电源 _nop_<>; _nop_<>; AUXR1=0X04; //将高两位存放在寄存器ADC_RES,低八位存放在寄存器ADC_RESL中 ADC_CONTR|=0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论