基于线性ccd的自主行驶小车系统的设计_第1页
基于线性ccd的自主行驶小车系统的设计_第2页
基于线性ccd的自主行驶小车系统的设计_第3页
基于线性ccd的自主行驶小车系统的设计_第4页
基于线性ccd的自主行驶小车系统的设计_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要本文主要设计制作一辆基于线性CCD自主循迹行驶的智能车,采用飞思卡尔半导体公司生产的32位单片机MK60DN512VLQ10作为核心处理器,主要通过TSL1401线性CCD采集赛道的一维图像信息,反馈给单片机控制舵机转向,电机调速,使小车按照事先架设好的跑道自主行驶,并且能通过ST188红外对管识别出终点(跟边线垂直的黑线段)自动停车。硬件系统由单片机模块,TSL1401线性CCD模块、电源管理模块、电机驱动模块、OLED人机交互模块、光电对管模块以及电机、舵机和编码器组成。软件系统主要由IAR进行开发,控制算法主要采用PID控制。关键词智能车;线性CCD;PIDAbstractThispapermainlyintroducesthedesignaboutasmartcarwithautomatictrackingfunctionbasedonlinearCCD.ThecontrolsystemusestheFreescaleSemiconductor's32-bitmicrocontrollerMK60DN512VLQ10asthecoreprocessor.TheTSL1401linearCCDacquiresone-dimensionalimageinformation,whichisfeedbackedtoTheMCU.ThentheMCUcontrolsservo’sdirection,motor’sspeed,sothecarcanautomaticallydriveinaccordancewithbeforehandtrack,identifytheend(theblacklineverticalwithsideline)andstopautomaticallybytheST188.Thehardwaresystemincludesamicrocontrollermodule,aTSL1401linearCCDmodule,apowermanagementmodule,amotordrivemodule,twoOLEDmodules,fourphotoelectrictubemodules,amotor,aservoandaencoder.ThesoftwaresystemisdevelopedbyIARandthecontrolalgorithmmainlyusesPIDcontrol.KeywordsSmartCar;LinerCCD;PIDPAGEPAGE21.引言汽车行业的发展已经超过了100多年,自1980年以来,智能理论控制技术在交通运输工程中已经被越来越广泛的运用,智能汽车的概念在这一背景下也就相应产生和发展[1]。随着科学技术与现代汽车工业的结合发展,两者的产物“智能汽车”能像机器人一样,可以自动地进行环境的感知,规划和决策的运行控制[2]。智能车系统是一个综合多技术领域系统,其包含了自动控制、模式识别、传感技术、电子、电气、计算机、机械与汽车等多个学科专业[3]。因此,对智能车技术的研究能够促进计算机技术、车辆控制理论、摄像头[4]等多传感器信息融合技术等技术的快速发展;可以提高车辆的控制能力和辅助驾驶水平,对优化交通设施,缓解和改善交通问题具有积极的意义;改善工业人员工作环境,提高安全系数,同时还可以提高工业的智能化水平,提高产量。为人类的生产生活带来越来越多的便利,使人类的生活质量越来越高。智能车最大的要求就是能够自动循迹,像全国“飞思卡尔”杯智能车比赛、瑞萨杯智能车比赛等比赛都是要求智能车能够自动循迹。而光电传感器的选用在自动循迹智能车系统中更是一个关键的问题。传统的红外对管,激光管在前瞻和稳定性方面都存在一定的缺陷[5],线性CCD是新兴的光电传感器,第八届全国飞思卡尔杯智能车比赛中就对TSL1401线性CCD传感器进行了第一次使用,与传统的红外对管,激光等光电传感器相比,线性CCD具有很多优点,尤其是在线性度和图像均匀性等方面,采集到的数据便于单片机处理。实验表明,线性CCD的前瞻比较远,能达到1.2米左右。随着对智能车辆速度增加的要求,需要跟踪处理越来越多路况,如路口,避障等。对于以上的情况,线性CCD能够利用其本身的特点有效的予以解决,尤其是在对于智能车辆的提速问题上。随着线性CCD技术的不断提高与发展,线性程度自然会持续提高,提取的图像信息会变得更加的稳定有效,前瞻会变得更宽更远,因此必定会加快推进智能车速度提高的进步[6]。本智能车系统就是基于线性CCD为基础而设计的。2.设计方案思路2.1单片机的选择方案一:采用传统的8位40引脚单片机STC89C52作为主控芯片,该MCU是台湾宏晶公司的产品,具有低功耗,高性能,编程简单等特点,应用在很多领域。方案二:使用飞思卡尔半导体公司的32位144引脚单片机MK60DN512VLQ10作为主控芯片,该MCU外设资源多,运算速度快,精度高。考虑到本次智能车系统设计有一定的复杂性,要求主控芯片带有AD,PWM,正交解码等功能,并且要用到的引脚数目比较多,因此本次设计选用了K60作为主控芯片。2.2电机驱动的选择方案一:使用2片BTN7971半桥芯片搭成一个全桥驱动电机,电路搭建简单,理论驱动电流达到50A,但是芯片容易发烫。方案二:用4个MOS管LR7843构成H桥和一个MOS驱动芯片IRF2184驱动电机运转,虽然电路组建有点复杂,但是理论驱动电流能达到160A并且电路稳定不会发烫。方案三:采用LN298电机驱动模块,电路简单,但是驱动电流只能达到2A,达不到理想驱动效果。考虑到系统电路的稳定性,本次设计选用了方案二。2.3显示模块的选择方案一:使用常用的LCD1602作为液晶显示器,显示字母和数字比较方便,控制简单,成本低,整屏能显示16*2个字符,与单片机并口连接,接线引脚多。方案二:使用LCD12864作为液晶显示器,自带中文字库,分辨率为128*64,与单片机并口连接,但是价格昂贵。方案三:采用0.96寸OLED12864显示器,采用4线同步串行SPI接线方式,接线简单,高分辨率,为128*64,显示效果远远超过LCD[7]。考虑到成本,电路接线,显示效果等因素,本次设计选用了方案三。3.总体设计3.1系统设计要求本课题要求设计制作一套基于线性CCD的自主行驶小车系统。本系统场地是在一个白色地面上用黑色绝缘胶带布置两根边线,两根边线内是小车要行驶的道路,小车能通过线性CCD识别出该道路,并能自主沿着道路前进,到达终点时会自动停止,终点为跟边线垂直的黑线段(黑色绝缘胶带)。在道路中间含十字路口,要求能识别出该十字路口,并正确通过该十字路口。3.2系统总体设计方案本系统的最小控制核心MCU为MK60DN512VLQ10;线性CCD用支架固定在小车中心离地30cm处,前瞻60cm(能准确提取边线且不失真),使用4个MOS管搭成H桥作为电机驱动模块[8],大大增加电机驱动能力;光电传感器模块由四个ST188光电对管构成,在车身底部“一”字排开,用以检测终点。电源模块采用飞思卡尔的7.2V电池给电机供电,同时经TPS7350芯片输出5V稳压给CCD模块、编码器供电;经TL1963芯片输出6V稳压给舵机供电;经TPS7333芯片输出3.3V稳压给单片机、OLED模块供电。TSL1401线性CCD采回的图像数据传递给单片机处理,单片机利用PID算法控制舵机转变方向,调节电机速度,从而完成小车智能循迹[9]。系统由K60为最小控制核心模块、TSL1401线性CCD模块、电源管理模块、电机驱动模块、OLED12864液晶人机交互模块、ST188光电对管模块以及电机、舵机和编码器组成。系统框图如图3-1所示。图3-1系统框图系统各个模块功能设计如下:1、通过TSL1401线性CCD获取道路的一维图像信息(128个像素点的电压),然后给单片机进行数据处理;2、采用MK60DN512VLQ10单片机为主控芯片对外围电路进行实时控制;3、光电对管用以检测起跑线,到达终点后,控制停车;4、伺服舵机带动小车两前轮控制小车转向;5、电机驱动电路驱动直流电机带动小车两后轮运转;6、采用两片OLED12864显示屏,一片显示CCD采回的图像波形,另一片结合五向按键做人机交互界面,调节PID参数,节省多次下载程序的时间,大大提高调车效率;7、采用500线欧姆龙编码器反馈电机转速,精确控制小车速度,有效提高系统的稳定性。4.硬件设计4.1飞思卡尔32位单片机MK60DN512VLQ10介绍及其最小系统本设计使用的MCU是飞思卡尔半导体公司生产的32位MK60DN512VLQ10单片机,是飞思卡尔公司推荐的K60系列的32位增强型单片机。该芯片以飞思卡尔最新的闪存技术,并且具有功耗低,性能高,精度高等特点,特别是多路快速的16位模数转换(ADC)、数模转换(DAC)和可编程增益运放(PGA)等功能强大、高效率的信号转换,调节和控制模块。K60还具有以太网,全功能USB、硬件加密和篡改检测功能,具有丰富的模拟通信,定时和控制外设,还包括单精度浮点型运算单元,NAND闪存控制器和DRAM控制器[10]。本设计的MK60DN512VLQ10单片机的最小系统如图4-1所示。图4-1K60单片机最小系统4.2电源模块的设计本智能小车采用飞思卡尔公司的7.2V电池给RS540直流电机供电,除此之外,系统还需要6V、5V、3.3V、12V给系统其他模块供电。4.2.16V稳压电源设计由于舵机需要用到6V电源给其供电,本次设计选用了德州仪器生产的TL1963A电源管理芯片,可调输出电压范围为1.21V~20V,输出电流能达1.5A,驱动舵机的效果比较明显,其电路原理图如图4-2所示。图4-26V稳压电源原理图通过查询芯片的Datasheet可知,TL1963A的输出电压计算公式为,因此电阻R1配1K,R2配3.9K,经计算VOUT=1.21*(1+3.9/1)=5.929V≈6V。4.2.25V稳压电源设计为了提高电池的使用时间,通常需要调节压差(输入输出电压差小),使用功耗小(静态电流小),还有就是能够有欠压信号使单片机复位,德州仪器生产的TPS73XX系列就符合这一功能的低压差稳压器。因此5V电源模块部分就采用TPS7350Q芯片,最大输出电流达500mA,输出电压精度高,噪声小,内部带过流过压保护,另一个优点就是该芯片外围元器件少,电路搭建简单,符合智能车设计要求[11]。其电路原理图如图4-3所示。图4-35V稳压电路原理图在本系统中,5V稳压模块给TSL1401线性CCD模块,500线欧姆龙编码器,5V至12V升压模块供电,经计算CCD模块供电需要100mA,编码器供电只需几十mA,升压模块需耗电100mA,因此使用TPS7350Q符合系统供电要求。4.2.33.3V稳压电源设计因为MCU的供电需要3.3V供电,为此选用了TPS7333Q作为电源管理IC,输出3.3V电压,同TPS7350Q一样,输出精度高,带过压过热保护功能,输出电流达500mA,电路原理图如图4-4所示。图4-43.3V稳压电路原理图输出的3.3V电压给单片机供电以为,还给OLED显示模块供电,单片机供电需要200mA,由于用到了2片OLED液晶屏,所以耗电200mA,因此总的供电量也是合理符合的。4.2.412V稳压电源设计由于IRF2184需要12V供电,因此比较使用了DCDC-5V12V升压模块,因为该模块已经集成化,所以比较稳定,纹波比较小。其外观图如图4-5所示。图4-5B0512S外观图4.3电机驱动模块电机驱动电路一般采用H全桥驱动直流电机,一般的桥式电机驱动电路分为单极性和双极性,但是双极性电路输出的电压含有比较多的交流成分,极易造成电机消磁和发烫,因此最后选择了直流电动机可逆单极型驱动器,采用4个功率元件N沟道mos管搭建而成,额定输出电流达到150A以上,驱动效果理想,使直流电机的转速和扭矩都明显提高。其电路原理图如图4-6所示。图4-6电机驱动原理图为了驱动MOS管LR7843,为此使用了mos管驱动芯片IRF2184,IRF2184的驱动电压是12V,因此用了5V-12VDCDC升压模块,同时为了不让驱动部分的大电流回流到单片机最小系统把单片机烧掉,因此在单片机输出引脚和驱动之间加了隔离芯片74HC02,该芯片是4通道2输入或非门,不仅能进行电平转换,而且还能根据单片机输出高低电平控制电机正反转,使用起来更方便。4.4OLED显示模块本次设计用到的是OLED12864液晶显示模块,OLED的英文名为OrganicLight-EmittingDide,中文名为有机型发光二极管,该屏幕轻薄,省电,已经在MP3等播放器上得到了广泛的应用,OLED12864分辨率为128*64,能显示中文字符,大小只有0.96寸,并且成本低,实物图如图4-7所示。图4-70.96寸OLED12864实物图为了调试方便,使用了2片OLED屏幕,一片读取CCD采集的赛道信息,另一片用五向按键调节PID参数。单片机采用4线SPI驱动液晶显示,通过控制片选端CS选择驱动哪片OLED,模块的电路原理图如图4-8所示。图4-8OLED12864液晶屏原理图4.5五向按键模块本次设计的按键部分采用了五向按键,小巧方便,在硬件设计上原本需要占据5个I/O口,但本设计采用了AD按键,把5个引脚同时挂在同一个I/O口上,利用5个方向引脚电压的差异识别出哪个方向键按下,大大节省了I/O口资源。按键模块配合OLED模块使用,进行人机交互,缩短了系统调试时间,按键模块电路原理图如图4-9所示。图4-9五向AD按键原理图4.6TSL1401线性CCD模块线性CCD是本系统的核心部分,就好比小车的“眼睛”,非常重要。本次设计中的CCD模块采用了北京龙邱科技公司的TSL1401模块,如图4-10所示。图4-10TSL1401模块实物图4.6.1线性CCD模块引脚定义SI:串行输入口。经过单片机的IO口控制数据起始位。CLK:时钟引脚。经过单片机的IO口控制电荷的转换和像素的输出。AO:模拟输出。经过单片机的ADC口进行数据采集。 VDD:+5V电源供电。GND:接地。4.6.2线性CCD模块工作原理TSL1401线性CCD模块中有光电二极管128个成线性分布。都有积分电路与各个光电二极管相互对应,这些积分电路称为像素。采样的像素采集的灰度值与感应到的光的强度以及积分的时间成正比。除了128个像素以外,模块还包含逻辑开关控制电路以及移位寄存器电路。每个像素的积分和复位由SI引脚控制;CLK引脚在电路中的作用是顺序输出每一个像素电压值。TSL1401线性CCD模块的内部结构如图4-11所示。图4-11TSL1401模块内部结构图能够从图中看到像素电路、开关逻辑控制电路以及位移寄存器电路。还有一个增益调整模块,对输出电压可调增益,所以不需要其他放大模块进行放大,AO口输出的电压可以直接给单片机AD采样进行处理。一般都是从CIK引脚的下降沿进行AD采样。4.7ST188红外对管模块终点为跟边线垂直的黑线段(黑色绝缘胶带),小车到终点是要自动检测到,如果也用CCD检测,可能会造成误判,小车转弯时也可能当作终点而停车,所以专门用了ST188红外对管模块来检测终点线,其外形如图4-11所示。图4-11ST188外观引脚图其中A、K引脚是红外发射极的正负极,E、C引脚是接受极的正负极,能检测范围是4-13mm,无须接触,电路原理图如图4-12所示。图4-12ST188红外对管接线原理图工作原理:当检测到黑线时(无红外线反射),A、K未导通,C、E截至,输出高电平,相反当检测到白线时(有红外线反射),A、K导通,C、E也导通,输出端为低电平[12]。考虑到在测量过程中会出现比较大的死区电压,为此加了运放进行比较器调节,同时用电位器还能进行阈值调节,方便灵活。为了直观反映检测效果,运放输出端加了指示灯,黑线指示灯亮,白线指示灯灭。另外终点线有2段黑线,所以用了4个ST188检测,根据黑线段的间距进行合理分布,在车模底部一字排开,无论什么情况都有2个ST188同时检测到2条黑线段,使单片机控制小车停车。4.7500线欧姆龙编码器智能车要完成闭环控制,必须能够反馈速度,本系统采用了欧姆龙公司生产的500线E6A2-CW3C双相编码器进行反馈,转一圈能输出500个脉冲,实物图如图4-13所示。图4-13500线编码器实物图编码器一段通过齿轮跟电机连在一起,模块有4根接线,褐色连5V,蓝色连GND,黑色连A相,白色连B相,利用K60的正交解码功能检测脉冲数据[13]。因为A,B两相的相位相差90度,所以可以通过对比是A相超前还是B相超前进行正反转判断,并且也能在A、B相的上升(下降)沿进行脉冲计数,反馈给单片机测速。如果A,B相引脚直接接单片机正交解码引脚,测到的是尖峰波(并非方波),单片机不能正常处理,因此加了10k的上拉电阻后,就能得到正常的方波给单片机测速,与单片机连接口如图4-14所示。图4-14编码器引脚接线图4.9SD-5舵机小车的转向舵机使用的是北京科宇通博科技有限公司生产的SD-5舵机,它的工作电压是6V,并且自带堵转保护电路,力矩是5000g,回中较准确,定位较精确,只需300Hz频率PWM波就能进行方向控制,操作简单。SD-5舵机实物图如图4-15所示。图4-15SD-5舵机实物图4.10RS-540直流电机本系统使用了RS540大功率直流电机,工作时电压为7.2V,空载时电流为1.72A,最大的工作电流可以达到9.71A,最大工作功率达到61.75W,完全符合小车速度需要,电机实物图如图4-16所示;图4-16RS540电机实物图4.11小车车模使用飞思卡尔智能汽车竞赛的B模型,实物图如图4-17所示。图4-17飞思卡尔比赛B车模5.软件设计硬件平台搭好后,就需要软件的开发,小车只有通过软硬件的有机结果,才能实现自动循迹功能,本系统软件开发使用的是IAR,其界面如图所示,IAR有多种版本,有编译ARV的,stm8的,ARM的,因为K60是ARM内核的,因此选择了IARForARM版本进行安装。IAR是目前最简单和最完备的嵌入式开发工具,利用IAR开发有许多优点,能够最大化地优化代码,节约硬件资源,大大地降低开发成本。本次设计软件编写使用了通俗易懂,可移植性较强的C语言,在电脑上安装好IAR软件后,根据使用说明建立一个工程项目,进行程序编写和在线调试,界面如图5-1所示,详细的源程序见附件。图5-1IAR界面图5.1总体方案程序主要要实现的功能是:通过TSL1401线性CCD传感器采集的128个一维图像信息,传递给单片机进行判断处理,单片机根据PD算法,判断小车与中线的偏差输出PWM波控制舵机打角多少,使小车始终沿跑道中线行驶,为了控制小车的速度,使小车能闭环稳定跑,通过反馈编码器的转速给单片机,单片机利用PI算法同样输出PWM波控制电机速率。当ST188光电对管模块检测到终点线后,单片机控制小车停车。为了在调试过程中方便快捷,提高效率,利用了K60的flash擦写功能,在OLED液晶屏上使用五向按键改变PID参数,直接在小车上调试,省去了多次下载程序的时间,并且能对调试理想的参数进行保存,下次开机后还能读取上一次保存的参数,明显提高调车效率。5.2主程序设计程序上电后,先关总中断,然后串口、CCD、PIT0、FTM0、FTM1、OLED、ADC、FLASH、按键等各模块初始化,然后开总中断,进入main函数,开始各子函数调用。首先开始CCD的采集,CCD采集的128个像素点的电压通过单片机AD采样,然后二值化后通过PD算法输出PWM波控制舵机打角转向,编码器正交解码返回脉冲数给单片机通过PI算法输出PWM波给电机调速,并且执行AD按键扫描程序,执行按键事件进行OLED屏幕参数调节(PID参数)。以上子程序都在PIT0中断中执行,在PIT0中断中,1ms进一次中断,为一个控制周期,共分4个控制周期,第一个控制周期内CCD曝光计算,第二个控制周期内进行获取编码器脉冲数后进行PI调速,第三个周期内进行内进行位置解算,PD算法控制舵机转向,第四个周期为按键扫描,进行人机互动。Main函数内做两件事:一是判断终点线,一旦检测到,就直接电机不使能停车;二是CCD计算曝光时间(20ms一次),会在后面CCD部分讲到。主程序框图如图5-2所示。图5-2系统主程序框图5.3各子程序模块设计接下来开始介绍各个子程序部分的设计,由于各程序中基本上都用到了PID控制算法,先介绍下PID控制原理。PID控制算法为使用较早,较为经典的控制方法之一。PID控制器根据系统的过去信息(I)、当前信息(P)和将来信息(D)三个参数进行控制。P为系统偏差的比例,I为系统偏差的积分,D为系统偏差的微分。PID控制算法优点有很多,使用起来方便简单,鲁棒性能比较好,因此在工业上得到了普遍的运用。PID控制系统由三部分组成,分别是控制对象、执行机构以及模拟调节器,如图5-3所示。图5-3PID控制系统原理框图PID调节器是一种线性调节器,e(t)为给定的量r(t)和实际输出的量c(t)之间的偏差:,然后将系统偏差的比例(P)、积分(I)、微分(D)根据某种线性组合关系组合成控制量,最终对控制量一起控制,因此叫PID调节器[14]。但是在实际生产应用中,常常会根据相关控制要求需要将P、I、D进行适当的组合,来达到有效控制被控对象的目的。比如,P调节器,PI调节器,PD调节器,PID调节器等。一般的PID调节控制规律为:上式中,KP是比例系数,KI是积分常数,KD是微分常数。各校正环节的在系统控制中作用是:比例环节(P):作用是一旦系统出现了偏差,比例调节环节马上进行调节,抑制偏差的产生,但是也有缺点,就是系统会产生余差;(2)积分环节(I):主要作用是为了消除比例环节产生的余差,提高系统的无差度。积分环节作用与积分时间常数有关系,积分时间常数越大,那么积分作用就越弱,反之则正好相反;(3)微分环节(D):主要反映了系统的偏差变化的预见性,在系统偏差还未变大时就产生抑制调节,有效减少系统的调节时间。5.3.1TSL1401线性CCD程序设计由于因线性CCD的输出信号与周围环境的光线有关系,一般情况下,晚上灯光效果比白天会使输出的电压低,当线性CCD背对光线比正对着光线输出电压低,输出电压大小和CCD曝光量大小直接相关。曝光量取决于CCD模块所选用的镜头光圈的大小和程序所控制CDD曝光时间多少,因为镜头光圈大小已经固定不能改变,因此使用软件改变曝光时间,本次设计采用了自适应曝光时间算法调节曝光量[15]。程序流程图如图5-4所示。图5-4CCD自适应曝光曝光程序框图曝光控制原理:先发送一次启动和移位时序信号,因为TSL1401每128个时钟序列的前18个周期是内部复位,先将积分电压清零,第18个周期以后才开始积分。中断程序就是根据曝光时间的大小在适合的曝光点使CCD复位。下一个20ms到达后再重采样数据,采集到数据对应的曝光时间就是系统输出内部复位序列到下一次采样的时间。例如曝光时间为7ms,则曝光点为13ms。自适应曝光程序有效解决了CCD的曝光受光线影响问题。5.3.2电机PI算法调速程序设计PI调节器是在自动控制中常常用到,该调节器主要作用是能快速进行系统反映,并且能消除系统稳态误差,结合了比例环节和积分环节两者的优点。本次设计用到了增量式PI调节器,其公式为,其中KP为比例系数,KI为积分时间,输出为位置增量。软件编写思路:进入中断后,通过正交解码获取的编码器脉冲数和给定的速度的偏差,利用PI算法输出PWM波控制电机,不断的刷新,能在短时间内控制电机速度达到预期设定的速度。流程图如图5-5所示。图5-5电机PI调速算法程序框图5.3.3舵机PD算法转向程序设计小车转向通过单片机输出PWM波占空比控制舵机打角,在数据处理过程中,使用边缘检测法检测轨迹。将CCD传感器取回的128个数据点根据阈值二值化后依次坐标化为0至127,由于白线为高电平(1),黑线为低电平(0),就可以得到左右边界值。依据“中线位置=(左边位置+右边位置)/2”,就得到中线位置。根据中线位置与中间值63的偏差,对舵机进行控制,对于一侧丢现情况(弯道)可以使用补线方法求中线位置,对于两侧都丢现(十字路口)可以采用保持上次中线位置值作为本次中线位置值使用的方法。舵机转向利用PD算法,其核心算法为,其中KP为比例系数,KD为微分系数。使用PD算法可用既能快速反映抑制偏差,又有偏差预见性,防止偏差的变大,程序流程图如图5-6所示。图5-6舵机PD转向控制算法5.3.4五向按键扫描程序部分设计使用了AD扫描按键,在PIT中断中设置4ms的按键中断,根据各按键的电压不同,判断当前被按下的是什么键,利用switch、case函数对不同的按键进行相应事件处理,比如在OLED屏幕上进行档位的调节,PID参数的调节,CCD曝光阈值的调节,具体程序流程图如图5-7所示。图5-7AD按键事件处理程序框图5.3.5终点停车程序的设计因为终点线是2条间隔的黑线段,已经计算过布局了4个ST188模块,无论什么情况,都会同时有2个检测到黑线(高电平),因此在主程序中,不断的检测4个ST188光电对管所对应的输入电压,一旦有2个引脚同时都是高电平,那么则判断出检测到了终点线,就把电机驱动的使能角拉低,不使能。程序流程图如图5-8所示。图5-8终点停车程序框图6.制作与调试硬件部分组装完毕后,接下来就是测试各个功能模块能否正常工作。用J-link仿真器给主板下载程序。首先要测试CCD能否检测跑道信息并在OLED12864上正常显示出来,问题就出来了,OLED屏幕上显示CCD的采样数据在抖动(很不稳定),起先认为是程序的采集问题,但是参考了官方的历程,程序采集没问题,最后还是从硬件开始查问题来源,用示波器开始一番测试,把问题锁定在了CCD的5V电源供电处,5V电源的纹波很大,都达到了500mv左右,在5V和GND之间加了滤波大电容还是不见成效。询问了指导老师后,老师看了画的原理图,经过一番分析,最后把问题源头指向了12V升压部分,因为那里用到了220uH的电感,有一个高频存在,直接导致了大纹波的存在,还跟PCB布线有一定的关系,由于高频布线这方面不是很了解,在老师的建议下,使用了DC-DC电源模块,5V转12V,已经产品集成化,因此纹波会比较小。然后第二次做板,换了DC-DC模块,也有80mv左右的纹波,CCD采样数据点个别在OLED液晶屏上也存在略微跳动,在老师的建议下,在5V和GND间加了一个大电容滤波,问题就基本解决了。采集到的CCD图像如图6-1所示。图6-1CCD采集的图像信息其次,需要验证SD-5舵机能否正常转向,舵机的工作原理就是内部有一个20ms周期,50Hz频率的基准脉冲,高电平在0.5ms-2.5m区间正负90度转动,因此烧写了一个测试程序:单片机输出一个50Hz的方波,按键改变占空比的大小,观察舵机转动情况,结果舵机工作正常。确定了舵机能正常工作后,软件调整舵机平衡位置并固定好。接下来就剩下电机功能的验证了,直流电机一般用PWM波调速,改变占空比的大小就能达到调速的效果了。改变占空比的大小一般用定频调宽,因此单片机输出10k频率的PWM波,按键调节改变增大占空比,观察电机能否加速,结果电机也能正常工作。确定了各模块都能正常工作后,最后就是系统整体的调试,为了减少程序下载时间,在另一片OLED上编写了一个调试界面,包括电池电压,PID参数,CCD阈值,曝光时间,速度档位设定等,可以直接通过五向按键在OLED界面上改变参数,无需电脑调试,方便快捷。调试界面如图6-2所示。图6-2调试界面PID参数调试开始时,大致设一个比例(P)参数,从小到大慢慢试,直到系统出现震荡为止,选取此时P值的60%-70%为P参数,再开始微调调积分参数(I)和微分参数(D),直到系统达到稳定为止,由于电机的P、D参数和舵机的P、I参数是相互影响的,因此需要耐心调试才能使系统达到比较稳定的效果,并且不同的不同的速度档位各自的PID参数也是不同的。图6-2调试界面的参数小车速度为1.8m/s时的各个参数。小车在跑道上试跑过程中,存在这样一个问题,已经能稳定跑的PID参数保存好后,一段时间后就又不能跑了,看了硬件也没损坏,调试了半天也百思不得其解。后来看了CCD采集上来的图像后,才知道原来CCD镜头的前瞻改变了,因此确定了一个比较合适的前瞻后(60cm距离,能准确提取边线且不失真),用热熔胶把镜头和支架固定死,然后才开始PID参数的调节,之后的调试没有出现上诉问题,前一天保存的参数,第二天还是能够稳定运行。在调试过程中,还出现了这样一个问题,由于电机速度快,小车有时冲出跑道后会侧翻,直接导致舵机堵转损坏和轮子磨损,很是损坏硬件。后来经身边同学提醒,可以在车头前加一个防撞装置,听取了同学的意见后,用废弃的pcb板割了一个防撞装置装在车头,防撞效果比较明显。经过半个多月的调试,基本能实现设计要求。7.结论本系统是设计一辆自动循迹小车,跑道是本系统场地是在一个白色地面上用黑色绝缘胶带布置两根边线,两根边线内是小车要行驶的道路。以MK60DN512VLQ10单片机最小系统作为核心控制模块,利用TSL1401线性CCD采集的128个一维图像(道路信息检测),然后通过PD算法输出PWM波控制舵机带动小车前轮转向,使小车行驶在预先架构好的跑道中间,通过500线欧姆龙编码器正交解码后获得计数值反馈给单片机通过PI算法输出PWM波控制小车电机调速。检测4个ST188模块的输入引脚,有2个同时为高电平表示检测到终点线(跟边线垂直的黑线段),则控制小车停车。在经过软件和硬件两方面的综合调试后,最后完成了本次设计要求,基本实现了小车的各项功能。本次设计积累的经验相信会在今后的设计中带给我很多的帮助和借鉴。参考文献[1]赵永利.光电式自主循迹小车控制系统设计与研究[D].四川:西南交通大学出版社,2011[2]胡海峰,史忠科,徐德文.智能汽车发展研究[J].计算机应用与研究,2004,(6),20~23[3]付梦印,邓志红,刘彤.智能车辆导航技术[M].北京:科学出版社,2009[4]邓岳.基于MC9S12DG128单片机智能车设计与实现[J].微型电脑应用,2008,24(1),67~69[5]王谛,高久淳,姚培.循迹智能车系统中光电传感器的应用[J].应用科学,2010,(11):106[6]赵万欣,陈思屹.基于TSL1401线性CCD的智能巡线小车[J].工业控制计算机,2014,27(2),121~122[7]WangXQ,LanMJ,ZhengZH.DesignandImplementationofOLEDDriversBasedonWindowsCE[J].Microcomputer&ItsApplications,2011,(20):17~20[8]张鹏飞,齐晓慧.基于N沟道MOS管H桥驱动电路设计与制作[J].科技信息,2012,(20),147~149[9]雷永锋,刘勇,黄喜恒.基于线性CCD的智能循迹小车设计[J].科技视界,2014,(21),34~35[10]王超艺.基于Cortex-M4内核的Kinetis微控制器的应用研究[D].江苏:苏州大学,2011[11]王明顺,沈谋全.基于TPS7350的智能车电源设计[J].电子产品世界,2006,(24),75~78[12]兰羽.基于红外传感器ST188的自动循迹小车设计[J].电子设计工程,2013,21(3),64~66[13]谷海寿,颜湘武,曲伟.正交解码电路和捕获单元在转角和转速测量中的应用[J].电气应用,2005,24(1),112~115[14]MATU(S)UR.CalculationofallstabilizingPIandPIDcontrollers[J].InternationalJournalofMathematicsandComputersinSimulation,2011,(03):224~231[15]董杰君,朱煦,刘思淼,潘雯钰.基于线性CCD光电智能车的路径识别方法[J].数字化用户,2013,(24),89~90谢辞这次毕业设计是我大学四年的最后一个设计制作,也可以说是成果展示。这次毕业设计能够圆满成功,首先我要感谢在理论和技术上支持和指导我的王韬老师,是他孜孜不倦的指导,使我的实物不断的完善,最后能顺利完成各项功能,还有对我毕业论文一次又一次的修改,才有这篇论文的的定稿。其次我要感谢身边同学默默的帮助支持,有几次当调试遇到瓶颈想要放弃时,是他们开导我要勇于面对,并且和我一起想解决的办法。最后我还要感谢我的母校台州学院给了我学习和实践的平台,让我在大学四年中没有虚度光阴,使我可以充分地利用实验室和图书馆的软硬件资源,充分提高自己的各项能力,为以后走出校园,踏上社会打下良好的基础。附件附件1:小车整体实物图附件2:小车主板原理图附件3:小车主板PCB附件4:元器件清单器件类别型号参数数量单片机MK60DN512VLQ101个芯片TPS73501个TPS73331个TL19631个LR78434个IRF21842个74HC021个液晶屏OLED128642片蜂鸣器贴片有源1个直流电机RS5401个按键五向按键1个两脚按键2个线性CCDTSL14011个红外对管ST1884个编码器500线欧姆龙1个舵机SD-51个车模飞思卡尔比赛B车模1个DC-DC升压模块B0512S1个电阻510欧姆6个1K3个2K1个3.9K1个5.1K1个10K15个20K1个100K1个390K2个非极性电容0.1uf10个1uf8个极性电容10uf钽电容6个470uf/50V电解电容4个680uf/50V电解电容1个LED灯红色4个蓝色3个排针20P2条FPC排线6P1条杜邦线20P1条开关钮子开关1个电池飞思卡尔7.2V可充电池1个附件5:主要程序主程序:#include"common.h"#include"include.h"#defineBAT_ADADC1_SE9_OSInituint8CCD_TIME=2;uint8ADV[128]={0};//声明数组,用于存放采集的线性数值uint16g_n1MSEventCount=0;int16Speed_Back=0;int16serve_mid=1535;int16BAT_ADV=0;externuint8flag_CCD_BX;externuint8ADJ_Flag;voidPIT0_IRQHandler();voidPIT1_IRQHandler();voidmain(void){DisableInterrupts;//关总中断uart_init(UART5,115200);tsl1401_init(10);adc_init(BAT_AD);//电池电压采集初始化PAGEPAGE37sound_init();OLED_Init();led_init(LED0);led_init(LED1);Servo_PWM_init();FTM_PWM_init(FTM1,FTM_CH1,50,20000,serve_mid);Moter_init();//电机初始化使能方向pwmMoto_PWM(150);FTM2_QUAD_init();//正交解码初始化KEY_ALL_init();pit_init_ms(PIT0,1); //10ms按键定时器扫描初始化set_vector_handler(PIT0_VECTORn,PIT0_IRQHandler);enable_irq(PIT0_IRQn);pit_init_ms(PIT1,10); //10ms按键定时器扫描初始化set_vector_handler(PIT1_VECTORn,PIT1_IRQHandler);enable_irq(PIT1_IRQn);uart_putstr(UART5,"taizhouuniversity2014\r\n");Dis_LOGO();led(LED0,LED_ON);led(LED1,LED_OFF);kaiji_fmq();EnableInterrupts;InitTasks();while(1){if(TIME1flag_20ms==1)//CCD20ms曝光控制周期{TIME1flag_20ms=0;}//*****************终点线检测*****************//if((gpio_get(PORTB,1))&&(gpio_get(PORTB,2))){gpio_set(PORTD,12,0);//关闭电机使能}if((gpio_get(PORTB,1))&&(gpio_get(PORTB,3)))gpio_set(PORTD,12,0);//关闭电机使能}if((gpio_get(PORTB,1))&&(gpio_get(PORTB,4))){gpio_set(PORTD,12,0);//关闭电机使能}if((gpio_get(PORTB,2))&&(gpio_get(PORTB,3))){gpio_set(PORTD,12,0);//关闭电机使能}if((gpio_get(PORTB,2))&&(gpio_get(PORTB,4))){gpio_set(PORTD,12,0);//关闭电机使能}if((gpio_get(PORTB,3))&&(gpio_get(PORTB,4))){gpio_set(PORTD,12,0);//关闭电机使能}}}u32pitt0;u8Time_1401=0;u8speed_time=0;voidPIT0_IRQHandler(){UpdateTimers(); PIT_Flag_Clear(PIT0);g_n1MSEventCount++;if(g_n1MSEventCount==1)//电机PI算法调速{Speed_Back=FTM2_CNT;FTM2_CNT=0;Moto_PID(SET_SPEED,Speed_Back); }if(g_n1MSEventCount==2)//CCD曝光点计算{Time_1401++;if(Time_1401>=CCD_TIME){ tsl1401_time_isr();Time_1401=0;}}if(g_n1MSEventCount==3)//舵机PD算法转向{pianyanfa();servo_PD();}if(g_n1MSEventCount==4)//按键扫描程序{key_IRQHandler(); }if(g_n1MSEventCount>=5) {g_n1MSEventCount=0;}}提取中线程序:voidmiddle_draw(void)//取中线{bytei=0;//左右中标志byteR_flag=0,L_flag=0,Z_flag=0;image();//二值化for(i=64;i>0;i--)//中间开始往左边找黑线{if((SD[i]==1)&&(SD[i-1]==0)&&(SD[i-2]==0)&&(SD[i-3]==0))//&&(SD[i-3]==0)&&(SD[i-5]==0)&&(SD[i-4]==0)//当前点为1(白)左边连续为黑(0)则为黑线{zuo_qi=i-1;//左起点标志位/*从中心向两边找如果一个点位白点向左三个点位黑点则该点位左七点*/}}for(i=64;i<129;i++)//中间开始往右寻线{if((SD[i]==1)&&(SD[i+1]==0)&&(SD[i+2]==0)&&(SD[i+3]==0))//&&(SD[i+3]==0))&&(SD[i+5]==0)&&(SD[i+4]==0){you_qi=i+1;//右边黑线标志位}/*从中心向两边找如果一个点位白点向右三个点位黑点则该点位右起点*/}midlle=(you_qi+zuo_qi)/2;//中心点用于判断注意分开middle是左右起点相加/2if(midlle<54)L_flag=1;/*左边则定义为1进入左转弯*/R_flag=0;if(midlle>74)R_flag=1;L_flag=0;if((midlle<74)||(midlle>54))Z_flag=1;/*如果中心在64*/R_flag=0;/*右边则定义为进入右转*/L_flag=0;if(L_flag==1)//左转标志位{for(i=40;i<128;i++)//40开始向右寻线,这里是左边丢线寻线{if((SD[i]==1)&&(SD[i+1]==0)&&(SD[i+2]==0)&&(SD[i+3]==0))//&&(SD[i+5]==0)&&(SD[i+4]==0))//&&(SD[i+3]==0)){Ryou_qi=i+1;//右转弯的做起点//认为左转弯右边点middle=(Ryou_qi+0)/2;//补中点(右点+0左点)/2/*从中心向两边找如果一个点位白点向右三个点位黑点则该点位左七点*/}}if(Ryou_qi>70)//判断丢左线情况下补的中线是否超过70右线丢失{for(i=90;i>0;i--)//扫描左线{if((SD[i]==1)&&(SD[i-1]==0)&&(SD[i-2]==0)&&(SD[i-3]==0)){Lzuo_qi=i-1;//左转弯的右起点//个人认为是左转弯的左起点middle=(128+Lzuo_qi)/2;//补出中线(左起点+右点128)/2}}//endforif(Lzuo_qi>10)//判断左起点{Z_flag=1;/*如果中心在64*/R_flag=0;/*右边则定义为*/L_flag=0;/*进入左转弯*/}}}/*******************右转*******************/elseif(R_flag==1)//右转{for(i=88;i>0;i--)//右线丢失,寻左线{if((SD[i]==1)&&(SD[i-1]==0)&&(SD[i-2]==0)&&(SD[i-3]==0))//&&(SD[i-5]==0)&&(SD[i-4]==0))//&&(SD[i-3]==0){Lzuo_qi=i-1;//左转弯的右起点//右转弯的左起点middle=(128+Lzuo_qi)/2;//补中线}}if(Lzuo_qi<58){for(i=38;i<128;i++){if((SD[i]==1)&&(SD[i+1]==0)&&(SD[i+2]==0)&&(SD[i+3]==0))//&&(SD[i+5]==0)&&(SD[i+4]==0))//&&(SD[i+3]==0)){Ryou_qi=i+1;//右转弯的左起点//右转弯的右起点middle=(Ryou_qi+0)/2;/*从中心向两边找如果一个点位白点向右三个点位黑点则该点位左七点*/}}if(Ryou_qi<118){Z_flag=1;/*如果中心在64*/R_flag=0;/*右边则定义为*/L_flag=0;/*进入左转弯*/}}}//end右转elseif(Z_flag==1)//在中间标志位{for(i=64;i>0;i--)//寻左线{if((SD[i]==1)&&(SD[i-1]==0)&&(SD[i-2]==0)&&(SD[i-3]==0))//&&(SD[i-5]==0)&&(SD[i-4]==0))//&&(SD[i-3]==0){Zzuo_qi=i-1;//中间条件下的左起点/*从中心向两边找如果一个点位白点向左三个点位黑点则该点位左七点*/}}for(i=64;i<128;i++)//寻右线{if((SD[i]==1)&&(SD[i+1]==0)&&(SD[i+2]==0)&&(SD[i+3]==0))//&&(SD[i+5]==0)&&(SD[i+4]==0))//&&(SD[i+3]==0)){Zyou_qi=i+1;//中间条件下的右起点}/*从中心向两边找如果一个点位白点向右三个点位黑点则该点位左七点*/}middle=(Zzuo_qi+Zyou_qi)/2;//取中点if(middle<54)L_flag=1;R_flag=0;if(middle>74)R_flag=1;L_flag=0;if((middle<74)||(middle>54))Z_flag=1;R_flag=0;L_flag=0;}}CCD自适应曝光及二值化程序:#include"common.h"#include"include.h"externfloatevv;externu16SD[128];//声明数组,用于存放采集的线性数值externu16ccdV[126];//去掉最左边两个点的126个ccd值externintzuo_qi;externintyou_qi;externintLzuo_qi;externintRyou_qi;externintZzuo_qi;externintZyou_qi;externfloatthreshold;externvolatileintmidlle;externvolatileintmiddle;externu8zhang_ai_flag;//障碍标志位externu8shi_zi_flag;//十字标志位externu8stop_flag;//isr中/*******************************功能说明:CCD初始化**************************/voidCCD_init(void){gpio_init(PORTD,14,GPO,HIGH);//ccd2SI2ptd15//ccd1SI1ptd14gpio_init(PORTC,1,GPO,HIGH);//ccd2clkftm0ch1ptc2//ccd1ftmch0ptc1adc_init(ADC1,SE7a);//ADC1_SE4b//ccd2adptc8ADC1_SE4b--PTC8//ccd1adADC1_SE7a--PTE3}/*******************功能说明:CCD启动程序********************/voidStartIntegration(void){unsignedchari;SI_SetVal();/*SI=1*/SamplingDelay();CLK_SetVal();/*CLK=1*/SamplingDelay();SI_ClrVal();/*SI=0*/SamplingDelay();CLK_ClrVal();/*CLK=0*/for(i=0;i<127;i++){SamplingDelay();SamplingDelay();CLK_SetVal();/*CLK=1*/SamplingDelay();SamplingDelay();CLK_ClrVal();/*CLK=0*/}SamplingDelay();SamplingDelay();CLK_SetVal();/*CLK=1*/SamplingDelay();SamplingDelay();CLK_ClrVal();/*CLK=0*/}/****************功能说明:采集程序8位*ImageData=ad_once(ADC1,AD6a,ADC_8bit);*************************************************************************/voidImageCapture(unsignedchar*ImageData){//数组ImageData存贮128个像素点unsignedchari;//延时用externu8AtemP;SI_SetVal();/*SI=1*/SamplingDelay();CLK_SetVal();/*CLK=1*/SamplingDelay();SI_ClrVal();/*SI=0*/SamplingDelay();//200nsfor(i=0;i<50;i++){SamplingDelay();//200ns}*ImageData=ad_once(ADC1,AD6a,ADC_8bit);//此段循环128次AD采集数据从这里开始ImageData++;CLK_ClrVal();/*CLK=0*/for(i=0;i<127;i++){SamplingDelay();SamplingDelay();CLK_SetVal();/*CLK=1*/SamplingDelay();SamplingDelay();//SamplingPixel2~128//SamplingPixel2~1282开始ccd数据这里开始采集*ImageData=ad_once(ADC1,SE7a,ADC_8bit);ImageData++;CLK_ClrVal();/*CLK=0*/}SamplingDelay();SamplingDelay();CLK_SetVal();/*CLK=1*/SamplingDelay();SamplingDelay();CLK_ClrVal();/*CLK=0*/}/*************函数名称:CalculateIntegrationTime*功能说明:计算曝光时间****************/externu8Pixel[128];/*128个像素点的平均AD值*/u8PixelAverageValue;/*128个像素点的平均电压值的10倍*/u8PixelAverageVoltage;/*设定目标平均电压值,实际电压的10倍*/s16TargetPixelAverageVoltage=30;/*设定目标平均电压值与实际值的偏差,实际电压的10倍*/s16PixelAverageVoltageError=0;/*设定目标平均电压值允许的偏差,实际电压的10倍*/s16TargetPixelAverageVoltageAllowError=2;/*曝光时间,单位ms*/u8IntegrationTime=10;voidCalculateIntegrationTime(void){//计算曝光时间/*计算128个像素点的平均AD值*/PixelAverageValue=PixelAverage(128,Pixel);/*计算128个像素点的平均电压值,实际值的10倍*/PixelAverageVoltage=(unsignedchar)((int)PixelAverageValue*25/128);PixelAverageVoltageError=TargetPixelAverageVoltage-PixelAverageVoltage;if(PixelAverageVoltageError<-TargetPixelAverageVoltageAllowError)IntegrationTime--;if(PixelAverageVoltageError>TargetPixelAverageVoltageAllowError)IntegrationTime++;if(IntegrationTime<=1)IntegrationTime=1;if(IntegrationTime>=20)IntegrationTime=20;}voidimage(){chari=0;u16ccdmax=0;u16ccdmin=255;u8whitepoint_cout=0;for(i=0;i<126;i++)//去掉左边的两个坏点{ccdV[i]=Pixel[i+2];}for(i=0;i<126;i++)//拿到最大最小值{if(ccdV[i]>ccdmax)ccdmax=ccdV[i];if(ccdV[i]<ccdmin)ccdmin=ccdV[i];}evv=ccdmax+ccdmin;//最大+最小threshold=ccdmax*0.5+6;//(max+min)*threshold_ratio0.6正常//阈值evv*0.518for(i=0;i<128;i++){if(Pixel[i]<threshold)//二值化,比阈值大是1比阈值小是0即白1,黑0{SD[i]=0;//二值化数据保存在sd【】数组中}else{SD[i]=1;}}电机PI调速程序:voidMoto_PI(int16std_speed,int16now_speed){speed_error=std_speed-now_speed;M_PWM=M_PWM+((SPEED_Kp*(speed_error-pre_speed_error))+(SPEED_Ki*speed_error)+(SPEED_Kd*(speed_error-(2*pre_speed_error)+last_speed_error)));if(M_PWM>=900){M_PWM=900;}if(M_PWM<=-900){M_PWM=-900;}Moto_PWM(M_PWM);last_speed_error=pre_speed_error;pre_speed_error=speed_error;}舵机PD转向程序:voidservo_PD(){ z_err0=(int16)(zhongjian-63); z_err=z_err0-z_err1; steerpwm2=serve_mid+(int)(SD5_kp*z_err0+SD5_kd*z_err); z_err1=z_err0;if(steerpwm2<1280)steerpwm2=1280;elseif(steerpwm2>1840)steerpwm2=1840; last_z_cha=last_z_dty-steerpwm2; Servo_PWM(steerpwm2); last_dty=steerpwm2;}目录第一章总论11、项目名称及承办单位12、编制依据43、编制原则54、项目概况65、结论6第二章项目提出的背景及必要性81、项目提出的背景82、项目建设的必要性9第三章项目性质及建设规模131、项目性质132、建设规模13第四章项目建设地点及建设条件171、项目建设地点172、项目建设条件17第五章项目建设方案251、建设原则252、建设内容253、工程项目实施33第六章节水与节能措施371、节水措施372、节能措施38第七章环境影响评价391、项目所在地环境现状392、项目建设和生产对环境的影响分析393、环境保护措施……404、环境影响评价结论……………..……………42第八章劳动安全保护与消防441、危害因素和危害程度442、安全措施方案443、消防设施…………...45第九章组织机构与人力资源配置461、组织机构462、组织机构图46第十章项目实施进度481、建设工期482、项目实施进度安排483、项目实施进度表48第十一章投资估算及资金筹措491、投资估算依据492、建设投资估算49目录第一章总论 1第一节项目概述 1第二节可行性研究的依据 PAGEREF_To

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论