数学建模论文帆板控制系统.doc
题目名称:帆板控制系统(F题)摘要:该系统是一个帆板控制系统,以STC12C5A32AD单片机作为帆板模拟系统的控制核心,系统由控制器单元、键盘控制模块、液晶显示模块、电机驱动模块、声光指示模块、信号检测模块、AD转换模块、直流稳压电源等电路构成。系统采用单轴倾角传感器IN1000060感应帆板的偏移角度,并将其转换成电压信号,经AD转换后送至单片机处理,根据实时测试角度,利用PWM控制方式控制直流风扇的电机转速,继而调节风扇的送风量,使帆板达到要求角度。该系统结构完整、功能完善、工作可靠、并且利用4键无线传输模块进行操作控制,操作简单、直观。 关键词:单片机 帆板模拟系统 单轴倾角传感器 Abstract:This system is a STC12C5A32AD single chip microcomputer as the panels simulation the core of the system. By the keyboard control module, liquid crystal display module, fan driver module, sound and light detection module, signal detection module, dc voltage power supply circuit to form. The keyboard by single-chip microcomputer control system structure, the Angle of the panels sensors in the migration Angle. Dc voltage of the system as a fan of the power supply system. 4 * 4 keyboard and liquid crystal display (LCD panels that control the operation of the system is simple, intuitive, system has set up sound and light prompt functions, make this a design more humane.Keyword:Single-chip microcomputer、Panels simulation system、Single axis tilt sensors一方案论证与比较1.1控制器模块单片机作为控制系统的核心,选择合适的单片机对整个系统的性能起到了很大因素。单片机的选择是一个非常重要的环节。方案一:选用AT89C51、AT89C52最小系统电路板。该单片机应用比较广泛,资源也比较丰富,可以实现各种控制算法和逻辑控制;但该单片机编程复杂,并且字长有限,处理速度较慢,资源尚不够丰富,需要扩展较多外围电路。方案二:选用STC12C5A60S2单片机。该单片机为宏晶科技生产的单时钟/机器周期的单片机,是高速/低功耗超强抗干扰的新一代单片机,指令代码完全兼容传统8051,但速度快8-12倍。并且内部集成了2路PWM、8路高速10位A/D转换。而且单片机容量为60K,基本能够满足控制要求,并且可以简化外围电路。方案比较与选择:ST12C5A60S2本身的内部结构决定了其内在特性比89C51更加优越,并且单片机资源丰富,可以简化系统外围硬件电路,提高数据处理速度,故选用ST12C5A60S2单片机作为主控制微处理器。1.2 角度检测模块系统为帆板控制系统,帆板的转角作为主要测试量,在每一个功能要求中都需要对其进行检测。方案一:利用单圈精密电位计进行角度测量。将单圈精密电位计的旋转杆和帆板的转轴固定在一起,当帆板受风作用翻转时,会带动轴上连接的电位计调节螺钉转动,电位计电阻变化,利用恒流源供电,即可将电阻量转换为电压输出。方案二:采用N1000060角度传感器,该角度传感器为单轴倾角传感器,测量范围1g+/-90度°,单极5V供电,模拟0.5-4.5V输出。该传感器主要用于倾角检测,输出一个电压的倾角信号,可以通过反正弦计算出出其对应角度值。但由于输出的为电压值,故需将模拟电压信号经过AD端口,以传输给单片机进行转化处理。方案比较与选择:在满足设计的要求的前提下,考虑到接口,安装方便等因素,选择了方案二,而且利用N1000060角度传感器更容易实现角度测量,其控制精度也更加容易调节,可以准确确定帆板的位置。1.3 AD转换模块方案一: 采用ADC0809芯片进行模数转换,其中ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。它是逐次逼近式A/D转换器,可以和单片机直接接口。方案二: TLC0820芯片进行模数转换,其中TLC0820采用8位并行输出,不需要任何外部振荡元件和时钟信号,转换速率快,最大转换一次时间仅需2.5us。方案三: 利用单片机自身自带的10位AD转换器实现,转换精度高,可以对转角传感器输出的信号进行实时转换处理,并且外电路简洁可靠。 综合以上三种方案,采用方案三。1.4电源模块 方案一:采用升压型稳压电路。用两片MC34063芯片分别将3V的电池电压进行直流崭波调压,得到5V和12V的稳压输出。虽然只需使用两节电池,既节省了电池,又减小系统体积重量但该电路供电电流小,但是供电时间短,无法使相对庞大的系统稳定运作。 方案二:采用三端稳压集成7805与7812分别得到5V和12V的稳定电压。利用该方法方便简单,工作稳定可靠。三端集成稳压电路,这是一种集成电路的稳压电路,其功能是稳定直流输出电压。这种集成电路只有三根引脚,使用很方便,在许多场合都有着广泛应用。 综上所述,选择方案二,采用三端稳压器电路。 1.5显示模块方案一:采用LED数码管显示。数码管显示控制简单,调试也方便,但是显示方式单一,只能显示单一七段码数值,有些字符等信息难以显示。方案二:采用LCD液晶模块显示。可以显示数字,字符等,显示内容丰富。并且系统体积紧凑、显示界面友好等优点。方案比较与选择:综上,选用LCD显示系统。1.6 驱动器模块方案一:采用继电器对电动机的开关进行控制,通过开关的切换对电机的速度进行调整。这个方案的优点是电路较为简单,实现容易;缺点是继电器的响应速度慢、机械结构易损坏、寿命短。方案二:使用多个功率放大器驱动电机。通过使用不同的放大电路和不同参数的器件,可以达到不同的放大要求,放大后能够得到较大的功率。由于放大电路很难做到完全一致,当电机的功率较大时运行起来会不稳定,而且电路的制作会比较复杂。 方案三:采用专用芯片L298N,L298N是一个具有高电压大电流的全桥驱动芯片,它相应频率高,且还带有控制使能端。用该芯片作为电机驱动,操作方便,稳定性好,性能优良。综合以上三种方案,选择方案三。1.7 总体设计系统总框图如下:系统由控制器单元、键盘控制模块、液晶显示模块、电机驱动模块、声光指示模块、信号检测模块、AD转换模块、直流稳压电源等电路构成。二 理论分析与计算在本设计每个功能需要测试帆板转角,系统采用N1000060角度传感器检测帆板的状态,进而调整帆板的转角。角度传感器水平安装在帆板固定轴上端,当帆板为垂直状态时,即当传感器角度为0度时输出电压为2.5V,随着帆板转角变换,传感器输出一个电压信号,通过线性关系计算出其对应的角度值。角度传感器实时采集帆板的转角(设为),且输出值为模拟电压量,输出量与夹角之间成线性关系,即: U=K* (K为比例系数)平板角度及其对应电压的测试数据如下表所示: -600 -450 -300 00 300 450 600电压 0.82V 1.15V 1.56V 2.5V 3.56V 3.98V 4.23V 结果分析:通过上面测得的结果进行分析,得到输出与输入关系曲线如下图所示。传感器模块输出与输入关系曲线 从测量电压与角度的关系曲线可以看出,两者之间不是纯粹的线性关系。这就需要采用比拟和计算方法,在容许的误差范围内,通过建立函数关系,将两者之间转变为线性关系,利用处理器对其进行实际的测算,即进行软件矫正。三 单元电路设计系统由控制器单元、键盘控制模块、液晶显示模块、电机驱动模块、声光指示模块、信号检测模块、AD转换模块、直流稳压电源等电路构成。3.1控制器电路3.2.角度传感器接口电路设计根据系统需求,如下图3.1.4a和图3.1.4b所示为寻找平衡点电路设计(角度传感器) 图3.1.4a 角度传感器接口电路由于角度传感器输出的是一个连续变化的电压信号,所以在PROTEL里用滑动变阻器代替角度传感器。3.3 驱动器电路本次设计中,采用L298N驱动器驱动直流风扇电机,L298是一款承受高压大电流的全桥型直流/步进电压驱动器,内部包含4信道逻辑驱动电路。 步进电机的驱动模块由驱动芯片L298,总线驱动芯片74LS244以及二极管等构成,其电路连接图如下3.1.3图所示:3.4电源电路电源由变压部分、整流部分、滤波部分、稳压部分组成。通过7812和2940稳压器为整个系统提供5V或者12V电压,确保电路的正常稳定工作。这部分电路比较简单,都采用三端稳压管实现。3.5 声光提示模块当帆板与风扇间距 d=10cm 时,通过操作键盘控制风力大小,使帆板转角稳定在 45°±5°范围内,此时有声光提示。综合以上要求我们设计了如下电路图。电路图如下: 此电路图由电阻、PNP、以及发光二级管和蜂鸣器组成,PNP管在在电路图中起到开关作用,整个电路图是由单片机最小系统控制的,当挡板转到45度时,单轴倾角传感器会送给单片机一个信号,单片机控制系统则负责给此电路一个低电平,三极管处于饱和状态,此时三极管导通,此电路就会声光提示。四 软件设计主控制芯片为STC12C5A60S2,处理器速度较快,资源丰富,所以采用c51语言编程方便简单。软件流程图如下: 五 测试方法与测试结果5.1测试仪器量角器、秒表、示波器、数字电压表、万用表等。5.2测试方法 5.2.1手动检测: 通过手动旋转转轴使帆板与竖直方向角度发生偏移,此时,利用量角器观察偏移角度,液晶显示器显示出角度数值。5.2.2自动检测:通过键盘设置PWM波占空比,调节直流风扇电机转速,控制风扇风速,从而吹动帆板使其发生角度偏移,用量角器测量偏移角度,并在液晶显示器上显示实测角度。、5.3 测试结果 测试结果见下表示:表1:转动帆板,显示帆板角度实验次数帆板转角(量角器测量)实测角度(显示器)10°0°215°15.6°330°31.2°445°46°560°58.5°表二:d=10cm,键盘操作,改变帆板转角实验次数键盘动作实测角度(显示器)1“+“键连续动作5次16°2“+“键连续动作10次33.4°3“+“键连续动作20次62.1°表三:d=10cm,键盘操作,帆板稳定45°实验次数键盘动作理论角度(计算)实测角度(显示器)完成时间1“+“键连续动作15次45°43.5°5秒2“+“键连续动作15次45°42.0°6秒3“+“键连续动作15次45°46.2°5秒表四:d=10cm,键盘设定转角,帆板转动实验次数设定角度(计算)实测角度(显示器)完成时间145°43.5°5秒245°42.0°6秒345°46.2°5秒表五:d=7-15cm,键盘设定转角,帆板转动实验次数距离设定角度(计算)实测角度(显示器)完成时间17cm45°42.6°4秒212cm45°43.5°4.8秒315cm45°48°10秒功能完成情况:基本功能1完成基本功能2完成基本功能3完成扩展功能1完成扩展功能1完成5.4 结论测试数据与理论推算基本相同,在本次设计过程中,我们三人通力合作,排除万难,终于按时完成了赛题设计任务。在这短短的四天三夜比赛过程中我们不仅提高了自己解决问题的能力,而且深深体会到团队协作精神的重要性。参考文献:信号与系统,ALAN V.OPPENHEIM著,西安:西安交通大学出版社,1997年;数字图像处理学,元秋奇著,北京:电子工业出版社,2000年;模拟电子线路基础,吴运昌著,广州:华南理工大学出版社,2004年;数字电子技术基础,阎石著,北京:高等教育出版社,1997年;ARM&Linux嵌入式教程,马忠梅著,北京:北京航空航天大学出版社; 单片机原理及应用,李建忠著,西安:西安电子科技大学,2002年;附录:附1:元器件明细表:1) 单片机STC12C5A32AD2) L298N3) 74LS2444) SC2272_M4附2:仪器设备清单1) 数字万用表2) 稳压电源附3:电路图图纸最小系统电路图声光检测电路图稳压直流电路图】稳压直流电路图附4:#include <reg52.h>#include <intrins.h>#include <absacc.h>#define uchar unsigned char#define uint unsigned int #define ulong unsigned long/*Declare SFR associated with the ADC */sfr ADC_CONTR = 0xBC; /ADC control registersfr ADC_RES = 0xBD; /ADC hight 8-bit result registersfr ADC_LOW2 = 0xBE; /ADC low 2-bit result registersfr P1ASF = 0x9D; /P1 secondary function control register/*Define ADC operation const for ADC_CONTR*/#define ADC_POWER 0x80 /ADC power control bit#define ADC_FLAG 0x10 /ADC complete flag#define ADC_START 0x08 /ADC start control bit#define ADC_SPEEDLL 0x00 /540 clocks#define ADC_SPEEDL 0x20 /360 clocks#define ADC_SPEEDH 0x40 /180 clocks#define ADC_SPEEDHH 0x60 /90 clocks#define lcd_output P0sbit key0=P20;sbit key1=P21;sbit key2=P22;sbit key3=P23;sbit buzzer=P14;sbit led=P15;sbit lcdrs=P13;sbit lcdrw=P12;sbit lcden=P11;sbit fan_output1 = P16; /风扇输出sbit fan_output2 = P17;uint ms1,ms2,ms3;uint ADNUM; /ADC_res读取 uchar ch = 0; /ADC channel NO. uchar aangle10cm_table=0xe3,':','0','0',0xdf,'C',/十厘米时目标角度 aangle_table=0xe2,':','0','0',0xdf,'C',/目标角度cangle_table=0xe0,':','0','0',0xdf,'C',/实时角度 ms,speednum="V:000c/s"/风扇转速 uchar pwm_circle,/风扇转圈pwm_circle10cm; char drive=30;/占空比默认为四十五°、52 char drivedelay; uchar drive10cm=0; uchar key1num10cm; bit flag45;/四十五度测试标志 bit jiben10cm; /10厘米时基本部分标志位 bit key0num;/开闭环切换标志位 bit flagopen;/开环标志位 bit flag10cm;/十厘米标志位 bit openstart;/开环启动标志位 bit openstart10cm; bit ms500flag; bit delaynum; bit start_flag;/提示标志位 bit start_flag1; uchar key1num; /设置位切换 char aim_angle,/帆板要达到的角度 aim_angle10cm, current_angle,/实际角度 aim_anglege10cm,aim_angleshi10cm, aim_anglege,aim_angleshi; uchar code drive10cmcode=0,1,2,3,4,10,11,12,13,14, 14,14,15,15,15,15,17,17,17,18, 19,20,21,22,26,26,27,27,27,27, 28,28,28,29,29,29,29,30,30,30, 33,34,35,36,37,37,38,38,39,39, 39,39,40,40,41,43,45,47,48,48, 49; uint code angle_code=563,572,580,588,592,595,602,608,613,621, 628,634,639,643,648,653,661,667,675,681, 688,694,670,706,713,721,726,733,737,743, 750,756,763,767,773,779,783,790,796,800, 805,811,815,820,826,830,836,839,845,848, 853,858,862,867,870,874,878,880,883,886,889;/角度编码 uint circle;/风扇每秒圈数/*-延时微妙-*/void delayus(uint z) for(;z>0;z-) ;/*-延时一毫秒-*/void delayms(uint z) uint x=0; uchar y=0; for( x=z;x>0;x-) for( y=120;y>0;y- ); /*-检查LCD忙碌-*/void check_lcdbf() uchar x=0x80;while(x&0x80)lcdrs=0;lcdrw=1;lcden=0;delayus(20);lcden=1;x=lcd_output;lcden=0;/*-给LCD写数据-*/void write_lcddata(uchar num) lcdrs=1;lcdrw=0;lcden=0;lcd_output=num;lcden=1;delayus(20);lcden=0;check_lcdbf(); /*- 给LCD写指令 -*/void write_lcdcom(uchar num) lcdrs=0;lcdrw=0; lcden=0;lcd_output=num;lcden=1;delayus(20);lcden=0;check_lcdbf();/*-ad值显示转换-*/*void ad_transfer(uint num) ad_table13=num%10+0x30; num/=10; ad_table12=num%10+0x30; num/=10; ad_table11=num%10+0x30; num/=10; ad_table10=num%10+0x30;*/*-实际角度转换*/void angle_transfer(uchar m)cangle_table3=m%10+0x30; m/=10;cangle_table2=m%10+0x30; /*-风扇转速显示转换-*/void speedtransfer(uint num)/转换显示数字 speednum4=num%10+0x30; num/=10; speednum3=num%10+0x30; num/=10; speednum2=num%10+0x30;/*-键盘扫描-*/void keyscan() uchar temp,i; temp=P2; temp=temp&0x0f; if(temp) delayms(1);/*延时1毫秒 待调整 temp=P2; temp=temp&0x0f; if(temp) switch(temp) case 0x01: /key0 开 闭 环切换write_lcdcom(0x0c);/关闭闪烁 if(key0num=0) key1num10cm=0; key0num=1; key1num=0; jiben10cm=0; openstart=0;/若有切换 关闭风扇启动flagopen=1; flag10cm=0; /标志位切换 write_lcdcom(0x88); / /全显示 for( i=0;i<6;i+) write_lcddata(aangle_tablei); write_lcdcom(0x8f); write_lcddata('x'); / 显示切换到闭环 else flag45=0;/清零关于开闭环的标志位 key0num=0; drive10cm=0;/角度清零 flagopen=0; flag10cm=1; /标志位切换 openstart=0; jiben10cm=1; write_lcdcom(0x88); / /全显示 for( i=0;i<6;i+) write_lcddata(aangle10cm_tablei); write_lcdcom(0x8f); write_lcddata('x'); break; case 0x02: /key1 开环时45独显示 闭环时 设置切换 启动停止 if(key0num=0) /吹45°* key1num10cm+; if(key1num10cm=1) jiben10cm=0; flag45=1;/测试置位 drive10cm=37;/ 待修改 else if(key1num10cm=2) flag45=0; else if(key1num10cm=3) write_lcdcom(0x8b);write_lcdcom(0x0f);/开闪烁 else if(key1num10cm=4) write_lcdcom(0x8a);else if(key1num10cm=5) jiben10cm=0; openstart10cm=1; write_lcdcom(0x0c);/关闭闪烁 aim_angle10cm=aim_angleshi10cm*10+aim_anglege10cm; /设角值 /start_flag1=1;/启动闭环风扇 write_lcdcom(0x8f); write_lcddata(0xdb); buzzer =0; /声光提示 led=0; delayms(400); buzzer=1; led=1; else jiben10cm=1; openstart10cm=0; key1num10cm=0; / start_flag1=0;/关闭闭环风扇 write_lcdcom(0x8f); write_lcddata('x'); buzzer =0; /声光提示 led=0; delayms(400); buzzer=1; led=1; else key1num+; if(key1num=1) write_lcdcom(0x8b);write_lcdcom(0x0f);/开闪烁if(key1num=2) write_lcdcom(0x8a);if( key1num=3) drivedelay=3;/待调整 openstart=1;write_lcdcom(0x0c);/关闭闪烁 aim_angle=aim_angleshi*10+aim_anglege; /设角值 start_flag1=1;/启动闭环风扇 write_lcdcom(0x8f); write_lcddata(0xdb); buzzer =0; /声光提示 led=0; delayms(400); buzzer=1; led=1; if(key1num>3) openstart=0; key1num=0; start_flag1=0;/关闭闭环风扇 write_lcdcom(0x8f); write_lcddata('x'); buzzer =0; /声光提示 led=0; delayms(400); buzzer=1; led=1; break; case 0x04: /key2 - if(flagopen ) if(key1num=1) /调节键开启 aim_anglege-; if(aim_anglege<0) aim_anglege=9; write_lcdcom(0x8b); write_lcddata(aim_anglege+0x30);write_lcdcom(0x8b); if(key1num=2) aim_angleshi-; if(aim_angleshi<0) aim_angleshi=5; write_lcdcom(0x8a);write_lcddata(aim_angleshi+0x30);write_lcdcom(0x8a); if(flag10cm) if(key1num10cm=3) aim_anglege10cm-; if(aim_anglege10cm<0) aim_anglege10cm=9; write_lcdcom(0x8b); write_lcddata(aim_anglege10cm+0x30);write_lcdcom(0x8b); else if(key1num10cm=4) aim_angleshi10cm-; if(aim_angleshi10cm<0) aim_angleshi10cm=5; write_lcdcom(0x8a);write_lcddata(aim_angleshi10cm+0x30);write_lcdcom(0x8a); else if(drive10cm<15) drive10cm=0; else drive10cm-=3; if(drive<0)drive=0; break; case 0x08: /key3 + if(flagopen) if(key1num=1) /调节键开启 aim_anglege+; if(aim_anglege>9) aim_anglege=0; write_lcdcom(0x8b); write_lcddata(aim_anglege+0x30);write_lcdcom(0x8b); if(key1num=2) aim_angleshi+; if(aim_angleshi>5) aim_angleshi=0; write_lcdcom(0x8a);write_lcddata(aim_angleshi+0x30);write_lcdcom(0x8a); if(flag10cm) if(key1num10cm=3) /调节键开启 aim_anglege10cm+; if(aim_anglege10cm>9) aim_anglege10cm=0; write_lcdcom(0x8b); write_lcdd