循迹小车(程序)

上传人:bei****lei 文档编号:203123670 上传时间:2023-04-24 格式:DOC 页数:48 大小:935KB
返回 下载 相关 举报
循迹小车(程序)_第1页
第1页 / 共48页
循迹小车(程序)_第2页
第2页 / 共48页
循迹小车(程序)_第3页
第3页 / 共48页
点击查看更多>>
资源描述
附录程序 目录 一、 前言-二、 小车功能-三、 元器件选择-四、 I/O分配及硬件连接简图-五、 相关模块、算法-六、 系统框图-七、 调试过程-八、 小车图片资料-九、 讲座所感-十、 实习总结- 一、 前言感谢生产实习能给我们这次实现自己想法的机会,虽然实验条件异常简陋、资金投入非常有限,总体感觉我的队友们灰常灰常给力啊,我感觉我是抱到大腿了-王威,夏青、峰哥,团队气氛非常好,大家一起讨论,一起分工研究模块,最后一起解决问题调试程序,而且是不同的组合在不同阶段解决了不同的问题,大家精诚合作,各显身手,在奋战中给大三学年画上了圆满的句号。之前我们本来商量是不是可以拿往年电子设计大赛的题目过来做,如果难度太大就算只实现一部分功能也算是成功完成了,结果研究一天后发现电子设计大赛的题目需要很长时间的知识积累啊,基本上都是准备一个月以上然后开工的,后来王威提议要不我们做个小车吧,超声波测距实现自动物体追踪,控制核心采用单片机,传感器采用广泛用于避障和测距的超声波传感器,前进和后退用普通伺服电机和电机驱动模块实现。在网上选购单片机最小系统的时候,发现有一家商铺的最小系统上集成了红外模块,就想着不要浪费了,就萌生了做遥控车的想法,这样系统可以实现两个功能一个是类似于“光影魔术手”一样的物体追踪功能,一个是遥控运行功能。组队之后,我们一起讨论,从原理上进行可行性分析,最后一致讨论通过,然后就分组从网上搜集相关的资料,最后周一在淘宝上确定并购买了相关的器件,周三上午收到元器件,下午我们从零开始熟悉开发环境keil uvision3、翻看器件的技术文档、搞懂模块原理及使用方法、模块的编程调试、系统功能编程调试、系统程序整合、装车、系统功能优化。这是一个发现问题和解决问题的过程,乐趣也正在于此,我们相信一切问题皆有解决的方法,我们队员四个克服种种困难最终实现了既定的系统的功能,并且在找到带有舵机新车后添加了转弯功能,实在是意外之喜。 二、 小车具体功能1、小车系统功能简述接通电源后,按下开机键,小车进入模式选择状态,按左三角键进入(超声波)物体追踪模式,小车可以与物体始终保持设定的距离,实现与手(或其它物体)同步运动,即小车随物体一起前进后退、加速减速,同时显示当下距离值。按右三角键进入红外遥控模式,可以遥控小车前进、后退、左转、右转、剎停。在两个模式下按关机键,可以终止当前模式,重新选择功能,终止当前模式后按关机键,彻底关机,必须按开机键系统才能重新工作。控制系统方框图: 超声波测距追踪: 三、元器件选择我们做的小车所用到的器件模块除了7805芯片稳压和一些基本的开关电路,主要的模块如单片机最小系统(含红外、数码管、LED电路)、超声波模块、电机驱动模块均是从网上购买。主要原因是我们电路设计能力还不足,现在还不是拥有设计电路能力的那个人,那如果是找到别人设计好的电路图然后自己买元件焊接,那么硬件电路其实就是一个体力活,失去了创新的意义。尽管硬件的焊接、调试其实也是一个比较有意思的过程,但是围着一个已经验证过功能电路团团转没有太大价值,而且我们这次生产实习的时间只有一个周多些,而且实验条件太有限,没有固定的实验室,甚至连示波器、直流电源、万用表、焊枪、螺丝刀等基本的实验条件都不能保证。我们要在短时间内实现更高的功能,就必须向硬件电路“借力”,把主要的经历放在软件调试上,硬件是“死”的,而可以把更多的想法诸如到软件中让单片机执行,以实现我们所要的功能,享受其中的乐趣。从经济方面考虑,最后算起来反而是购买比较便宜,量产的PCB电路有时是相当实惠的。如果单买单片机、面包板、LED、数码管、和一些诸如RS232 电平转换芯片、红外发射器、接收管等等。在按照电路图焊接的过程中相当费时费力费神,购置上述器件的花费也在30块钱以上,有些器件如电阻电容很便宜,不能单个购买,但是买多了又很浪费。而网购的最小系统板花费40元(虽然我们原来只想要最简单的有下载口的最小系统,发现了这个之后觉得划算就买了),上面已经将单片机(可插拔)、LED、数码管、红外模块集成,而且做好了USB下载口,并赠送了开发环境和相关例程、下载线。电机驱动模块更给力。我们本打算用两片7960芯片自己焊接驱动模块,然后用2576给单片机和超声波模块做稳压电源,这样的花费是相当大的,一片7960就要15块钱,2576的价格也在5元左右,这样整个下来就得50块钱左右,我们在网上发现了这个用L298N制作的电机驱动模块,它不但可以同时驱动两个伺服电机,还拥有一个5v稳压输出,还有PWM和全整流两种工作模式,价格是35元,所以我们果断买下了。超声波模块就没有疑问了,就算知道硬件电路图,买了器件其实在缺少相关设备的情况下调试起来也是非常困难的,我们经过货比三家,选了一个实用又比较实惠的模块。这样硬件电路置备妥当购置完备了,最小系统板、超声波模块、电机驱动模块、7805稳压芯片、4节干电池盒、由于资金限制,我们向智能汽车实验室借用了一个废旧电池(7v左右,与干电池串联使用)、电子设计留下的废旧车底盘。最小系统板可以兼容MCS-51系列单片机里的多种型号,我们没用自带的52RC而是采用了其中比较高端的STC12C5A60S2,(其实也就10块钱)它的指令执行周期更短,有AD、PCA模块(可以工作在PWM方式)、而且定时器、中断等与传统的8051基本兼容,非常容易掌握,也很适合小车的实时控制。小车本来我们想用三楼智能小车实验室废弃的小车底座,就是一个小车底座加上电机,只能简单的实现车的直线前进后退。后来偶然在创新实验室发现了另外一个小车,一试之下,发现这个小车底盘非常好用,本来我们都没打算在遥控的时候能实现转弯功能,因为用PWM控制的舵机太贵了,后来车上竟然发现了小的转向电机,我们眼前一亮,正好电机驱动可以驱动两路电机,就把ENB输入与5v短路,在用两个I/0直接控制这个简陋的“舵机”,阴差阳错的实现了遥控模式下的转弯功能。但是由于电机驱动要求输入电压在7.2v-12v之间,我们的旧电池很明显力不从心,导致出现了很多意外问题,耽误了不少进度,后来用旧电池与干电池串联供电,单片机采用7805单独稳压供电,虽然问题有点缓解,还是显得不够给力,新电池又比较贵,我们及将就着用了,这也是系统设计的一大遗憾。另一个遗憾就是没有实现物体的全方位追踪,只能实现前后方向的直线追踪,因为要实现转弯,超声波传感器就要求有多个,而且要求有能精确控制角度的PWM舵机,所借的小车转向角度不能控制,如果购置躲个超声波传感器和一个PWM舵机,花费就在300以上,所以我们考虑了一下就放弃了。 四、I/O分配及硬件连接简图1、 I/O分配如下:IO功能头文件定义IO功能头文件定义P11超声波发送使能端口TXP00电机正反转控制In1P12超声波接收检测端口RXP01电机正反转控制In2P13PWM输出无P02转向控制In3P10正转标志位zhengP03转向控制In4P17反转标志位FanP14剎停标志位TingP0数码管数据端口 无P15左右转向标志位、系统开关标志位无P20-3数码管驱动无P16同上无(注:最小系统板上P1口连接了LED) 2、系统硬件连接简图: 五、相关模块、算法 1.单片机最小系统:型号STC12C5A60S2,选用此型号的重要原因是它自带PWM功能,不同占空比的方波给L298N驱动芯片后能对电机实现调速。本系统使用的STC12C5A60S2功能模块有:定时器0红外解码用定时器1超声波测距用PWM电机调速用P0口数码管数据位P2_0 P2_1 P2_2 P2_3数码管使能P1口连接LED ,显示小车的不同状态外部中断1红外解码用 2、PCA模块及其在系统中的应用STC12C5A60S2内部集成了两路可编程计数器阵列(PCA),每个模块均有软件定时器、外部脉冲捕捉、高速脉冲输出和PWM模块,也就是说这款单片机有两路PWM输出,分别在P1.3和P1.4。(我们只用了一路,P13).3、定时器模块及其在系统当中的应用STC12C5A60S2拥有4个定时器模块,其中定时器0和1与传统的8051完全兼容(意思就是不光用法,连相关寄存器的地址也一样,这样开发环境中的52RC的头文件还是可以使用的),每个模块均可工作在定时器和计数器模式(通过P34,P35输入脉冲),定时器有四种工作方式:16位定时计数、13位定时计数、8位自动重装、两个8位计数。与之相关的特殊功能寄存器有:控制寄存器TCON(其中比较重要的是TF和TR分别是中断标志和计数开关,很奇怪的外部中断的设置IE IT也在该寄存器中)。工作模式设置寄存器TMOD(可以设置定时器还是计数器,工作于哪个方式?)TL,TH中装着当前计数值,非常重要。AUXR可以设置定时器方式下计数频率是等于系统时钟还是等于1/12系统时钟。系统中用到了定时器0和1,定时器0用于红外模块,通过外部中断测定信号周期(TL0/TH0)以确定其携带的信息是0还是1。定时器1用于超声波模块,测定从发出超声波到超声波返回之间经过的时间,乘以声速除以2来得到距离值。 4、中断模块及其在系统中的应用中断是CPU处理外界紧急事件的机制,STC12C5A60S2拥有10个中断源,它们有规定好的优先级,有中断嵌套机制,可以对中断进行允许和屏蔽。中断采用两级控制模式,有总开关EA和寄存器中IE单独的开关(默认是0,即禁止)。10个中断中常用的是:定时器0、1;两个外部中断(P32/P33)、AD中断、串口中断,他们都有规定好的中断向量地址,使用那个中断就将总开关打开,在IE中将专用开关打开,对应中断号interrupt x编写中断服务子程序(不用声明)。系统中红外模块用到了外部中断INT0(下降沿触发),其原理是红外发射器将按键码按0和1调制成不同周期长度的红外波形,红外接收头将这些波形接收后调制成不同周期长度的方波,每个每个下降沿都将触发外部中断,中断服务子程序中取一个计数值以确定其周期长度,进而知道它是0是1。5、IO模块及其在系统中的应用。STC12C5A60S2比传统的8051增添了P4和P5两个端口,系统中均未对IO口进行初始化,即工作在默认的双向模式。2v以上为高电平,0.8v一下为低电平,每个口的驱动能力都在20mA以上,但要求总体不超过120mA.因为P1口接了LED所以被当作标志位用的较多。P0口是数码管的数据端口,P20-3是数码管数据端口,详细内容参见上文中的I/O分配图。(数码管的使用是先用P0口发送8位译码数据,然后用P2口发送4位控制信号,点亮四个数码管中的一个,LED与P1口直接连接,低电平的时候点亮LED,而且具有自保持功能)。 6、超声波模块超声波模块有TX,RX,VCC,两个GND共计5个端口,使用5V电压供电,系统中使用最小系统板上的5v电压输出。工作时:当TX端口收到一个持续时间在10us以上的脉冲,超声波模块将发射一组特定超声波,并RX置1超声波遇到障碍物反射回来,当接收装置收到反射回来的信号,将RX置0。系统设计中我们将TX与RX分别与I0口连接,用I0口发送10us以上脉冲,同时将定时器打开,并开始检测RX,当RX为0时停止计数,取出计数值并计算距离。 7、电机驱动模块(含PWM算法)电机驱动模块采用L298N元件,输入电压为7.2-12v,同时IN1和IN2可以控制out1和Out2所接电机的正反转,IN3和IN4可以控制out3和ou4所接电机的正反转。10为正转,01为反转,00停止,11剎停。其中ena和enb可以控制输出的电流大小,若用短路帽与+5v短接,则是全整流,若与PWM线连接则使用占空比整流。系统中,IN1和IN2控制电机,并用PWM(P13)控制电流以调速。IN3和IN4控制转向电机,使用ENB和5v短接。PWM就是脉宽调制,就是可以通过设置参数,输出任意占空比的方波,这些高电平时间不一的方波经过电机驱动电路(双桥整流)可以输出大小的不同的电流,用于电机调速。PCA模块的时钟源可以选择是来自于系统时钟的几分频还是来源于定时器,系统中采用了1/12的系统时钟源频率。因为PWM是8位的,所以PWM输出的波形频率是PCA时钟/256。PWM的占空比调节是比较器的作用,当计数值CL小于设定值CCAPnL时(单片机的计数与定时器均是加计数)输出为低电平,当计数值超过时,输出高电平,所以我们可以通过设置CCAPnL来改变占空比。(因为每次溢出均需要重新赋值,所以同时给CCPAnH赋相同的值)。与之相关的特殊功能寄存器寄存器有CCON、COMD、CCAPM0、CCAP0L、CCAP0H.。系统中用pwminit();对该模块进行初始化,程序中改变占空比用pwm_set()给CCAP0H和CCAP0L赋不同值,用于驱动电机。 PWM模块的工作原理图如下。 8、红外解码遥控模块 红外遥控中我们买的遥控器采用HT6221遥控器芯片 解码的关键是如何识别0、1,从位的定义我们可以发现0、1均以0.56ms的低电平开始,不同的是高电平的宽度不同 ,0为0.56ms, 1为1.68ms,所以必须根据高电平的宽度区别0和1,如果从0.56ms低电平过后开始,延时0.56ms以后若读到的电平为低说明该位为0,反之则为1。 为了可靠起见延时必须比 0.56ms长些但又不能超过 1.12ms,否则如果该位为0。读到的已是下一位的高电平因此取1.12ms+0.56ms /2=0.84ms最为可靠一般取 0.84ms左右均可。根据码的格式应该等待9ms的起始码和4.5ms的结果码完成后才能读码 。红外发射器将按键码按0和1调制成不同周期长度的红外波形,红外接收头将这些波形接收后调制成不同周期长度的方波,每个每个下降沿都将触发外部中断,中断服务子程序中取一个计数值以确定其周期长度,进而知道它是0是1。发送的信息中包括前导码、识别码、用户码、用户反码(用于校验),其中信息接收完毕且正确后(IROK=1),32位信息均存储在IM数组中,我们需要的码值在IM【2】中,取出来判断要进行的操作即可。 其中我们用到的键码有: 按键功能键码按键功能键码开机系统开0x09右箭头右转0x1e声音开关系统关0x03Ok键舵机摆正0x05上箭头前进0x0e左三角红外模式0x0c下箭头后退0x1a右三角物体追踪0x02左箭头左转0x0aPause键剎停0x549、PID算法 1.标准的直接计算法公式:Pout(t)=Kp*e(t)+Ki*e(t)+Kd*(e(t)-e(t-1); 2. 基本偏差e(t),表示当前测量值与设定目标间的差,设定目标是被减数,结果可以是正或负,正数表示还没有达到,负数表示已经超过了设定值。这是面向比例项用的变动数据。 3. 累计偏差(e)= e(t)+e(t-1)+e(t-2)+e(1),这是我们每一次测量到的偏差值的总和,这是代数和,考虑到他的正负符号的运算的,这是面向积分项用的一个变动数据。 4. 基本偏差的相对偏差e(t)-e(t-1),用本次的基本偏差减去上一次的基本偏差,用于考察当前控制的对象的趋势,作为快速反应的重要依据,这是面向微分项的一个变动数据。 5. 三个基本参数:Kp,Ki,Kd.为比例常数、积分常数和微分常数 6.积分的处理 本程序所用的积分没有把之前时刻所有的误差都考虑在内,而是用了一个10维的数组err10,每次测量距离得到当前误差之后就会更新一次数组(在下面的程序中有具体体现),将最新的误差数据置入err0,然后利用循环语句把数组求和,最后乘以积分常数得到积分部分的输出。 7.微分的处理 本程序中的微分所具有的特色是把在第二点中提到的err10数组中前5个和后5个分别求和,之后再做减运算,最后乘以微分常数得到微分部分输出。 六、系统框图 七、调试过程从上周三下午在图书馆讨论室熟悉编程环境开始,一直到这周二上午解决最后一个小问题,完成最终的调试,全程历时7天,工作时间大概在4天左右。 周一上午在智能小车实验室找到了一个废弃的小车底座带发动机,下午在淘宝上购置元器件,周三元器件上午到货,下午大家一起熟悉编程环境Keil uvision3和烧录工具Stc_Isp,周四大家一起研读单片机STC12C5A60S2的技术文档,然后分配任务,王威负责-电机驱动&PWM模块,裴夏青&陈如峰-超声波测距模块,我负责红外解码模块,周四晚上各自模块调试完毕。周五晚上王威完成超声波模式的整合,试车成功。周六上午大家一起调PID算法,由简单的P控制改成PID控制,消除了余差,减小了超调量,增快了反应速度。超声波模式调试完工,工作进度45%。周日上午找到另外一辆带有电机的车底座,居然还带舵机!于是我们换上了新的车底座,将原来的简单控制小车直线前进后退改为前后左右共9种模式,有了超声波模式编程的经验,红外遥控模式的编程变得相当顺利,大家一起群策群力,王威主写程序、调试,程序写完编译完毕后却在试车时遇到了巨大的困难,车总是在电机转然后再让舵机转是停车、单片机死机,将前面的简单程序烧录后却又没有问题,几经分析之后依然一筹莫展。在用万用表依次测量各部件电压之后,锁定原因-单片机输入电压不够,借来的旧电池严重不给力啊。最后我们决定串联四节干电池给大电池,并且给单片机用7805稳压(直接接电池电压)供电,问题得到基本解决。晚上红外遥控模式正式调试完毕。而后裴夏青提议将两种模式定义成两个函数,在主程序中调用即可,这样主程序变得非常简洁清晰,大家一致通过。由于超声波检测跟踪以及红外遥控模式的程序是分开写的,头文件中许多定义地址重复,需要大量的删改,十分繁琐,晚上王威完成了两种模式的整合,工作进度90%。周一早晨王威带着编译无误的程序过来烧录到单片机里,小车却出现诸多问题:只能进入红外遥控模式,不能进入超声波测距跟踪模式,当然两个模式也不能自由切换了;在红外模式下退出模式后不能重新选择,陷入死机状态,按暂停键和退出键效果相同,陷入死机状态。上午暂停键调试完毕,工作进度95%。下午王威缺席,夏青分析程序后觉得可能是每次判断按键码标志位Irok没有清零,我和夏青尝试性的在所有判断按键码后将Irok清零,结果成功进入超声波模式并能实现超声波/红外模式的自由切换,基本完工,仅剩下一个小问题-超声波模式下舵机乱摆,暂且放下。工作进度99.9%。周二早晨我早早到了实验室,被放假一天的峰哥也来了,闲着没事于是我俩分析并且调试其程序起来,我在超声波测距每次判断距离误差后将舵机转向控制口In3、In4口清零,烧录之后试车发现在超声波模式下舵机不再乱摆,最后一个问题得以解决,大功告成!工作进度100%!在调试的过程当中在一些小错误中学到了不少零碎的知识,如:复用引脚第二功能优先、LED自保持、IO口不如不初始化直接工作在双向模式、在各个模块连接的时候一定要共地,在开发环境下中断服务子程序的写法、超声波由于IO端口问题问题不能数码管显示距离(P2口换到P1口)、舵机在超声波模式剧烈震动(在每次判断误差时让IN3/IN4归零)、在PID运算中加入微分之后,震荡更加厉害(数组求差值求反了)、单片机头文件的写法等。一些小问题的解决比如头文件缺少、复杂,PWM赋值函数适应PID,当然有时也犯诸如线忘了插、键值写错的很低级的错误,但是经过一步步排查总能找出来。调试过程中耗时长、并且当时百思不得其解的问题有:1单片机在工作的过程当中总是死机?必须重启才能工作,而且死机更加频繁在超声波模块调试过程中我们发现了这个问题,我们首先从程序中查找错误,用了之前已经调试通过的简单程序,工作一段时间后还是会死机,我们把注意力转移到硬件上,在反复排查后,我们把问题锁定在了单片机电压上,经过测试,我们发现电机工作一段时间后,由电机驱动输送给单片机的电压降到了3.5V以下,单片机复位,停止工作。我们的解决方法是用了三节干电池串联主电池。问题暂时得到解决。当我们加上红外遥控,两个电机一起工作的时候,同样的问题再次出现,我们决定串联四节干电池,并且给单片机用7805稳压(直接接电池电压),问题得到基本解决。因为7805要求电压在5v以上,所以在系统长时间工作的情况下单片机还是会复位。2、系统不能进行功能切换,而且在一个模式下工作极不稳定在开始进行两个模块的程序整合的时候,总是不能相互切换,而且在红外模式下工作很不稳定,按关机键一次就可以彻底关机,经过排查,我们发现红外取值有效的标志位IROK=1之后,判断并执行完一步之后,没有清零,导致程序中一直读取IM【2】中的数据(乱码),而且关机键之后在IROK=1的情况下,数组中的0x03可以直接让系统停止工作。在每次键值判断之后都给IROK清零之后,问题得到了圆满的解决。八、小车图片资料 整车图片 整车侧面图片 单片机最小系统板图片 超声波模块图片 红外线遥控器(采用HT6221遥控器芯片)红外接收管图片 电机驱动模块图片 九、讲座所感 第一个报告是东方电子的刘总给我们做的,主要介绍物联网基础以及发展,主题为“物联网感知世界”。自从IBM提出“智慧地球”创想之后,物联网在全世界范围内蓬勃发展,RFID标签已经在全世界范围内得到广泛应用。在温总理在无锡考察提出我国要大力建设物联网之后,我国的物联网产业开始进入高速发展期,现在已经建成了较为完整的产业链。和其他电子产业一样,物联网技术的主导者为美国和日本,而我国在物联网产业标准、技术方面离世界一流尚有一定差距。刘总在介绍了物联网的基本原理之后重点介绍了RFID电子标签,RFID由于其非接触感知性、唯一性、稳固性使其已被广泛应用于各行各业,例如智能图书馆、智能高速路收费、服装业应用、婴儿放报错、动物饲养、汽车制造应用、电子支付、电子车票电力智能巡检系统、变电站运行检修人员安保定位系统等等。物联网产业中利润最大的两个环节为芯片制造以及系统集成。芯片制造的领跑者为美国以及日本,中国有两个科研所有所斩获但尚未量产根本无力竞争。烟台东方电子的强项为系统集成,下属子公司东方英伟达主要做系统集成,已经有很多成熟的的产品问世例如烟台港集装箱货运、张裕葡萄酒的电子标签、张裕博物馆门票等等。刘总谈东方电子的发展战略时提到中国研发的无奈,当你花费大量人力物力苦心孤诣研发出来一款产品,却发现已经远远落后于市场、收不回回报时,下次你做研发还会这么有勇气么?所以东方电子在芯片这方面不得不和微软、IBM、日立等等国际厂商合作,用他们已经成熟的芯片来占领市场,这也是中国厂商巨大的无奈吧。 第二个讲座由数学院的吴昭景博士所做,题目为控制论及通才硕学。吴老师在控制领域最高学术机构IEEE AC和IFAC上所办刊物上都发表了两篇论文,应该能代表烟大控制理论发展的最前沿。吴老师主要给我们介绍维纳、钱学森、陈翰馥、郭雷、彭实戈、朱位秋等大家的成长历程,继而引出控制论是一门横断科学,横跨各学科,以前的大师们基本上都是横跨数学、物理、机械各学科的牛人。这就对立志要从事本专业我们提出了通才硕学的要求,要求我们视野要开阔、涉猎范围要广、所学要博。吴老师给我列举了好几十种控制算法,给我们举了个例子:假如你设计好一个控制系统,你就需要了解诸多控制方法然后才能择优取之,这对你的学识就提出了极高的要求,不博学不行。吴老师表现得非常诚恳,他最后讲述自己人生经历也给了我很大的启发。“人可以波折,但必须站起来”,两次高考失利导致吴老师颓废不已、混沌度日,师范毕业后被分配到老家的乡村中学教书,极度失意。在教书7年后吴老师走出雾霭,决定考研,2年后考上研究生,然后研究生提前毕业,考上东北大学博士研究生,继而至烟大教学,在烟大教学、科研成果斐然。这绝对是发生在我们身边的现实版励志故事。吴老师最后给了我们一些建议:年轻人要有理想,有抱负,有求知欲,善于归纳,勤于思辨,面对现实,在应试中提高学习能力,适应社会,努力实现自身抱负和价值。 最后一个讲座请来了东方电子工程部门出身的刘总。刘总的讲座实用性非常强。首先以东方电子给企业做的几个系统为例给我们介绍了工业控制系统。刘总从底层讲起、按层次依次将各个元件进行介绍,让我们实实在在见识到了控制网络是怎么样由一个个部件组成起来的。刘总给了我们一种整体的、全局的理念,将来进企业或者做研发你非常可能只是从事其中很小的一个环节,但你必须有整体意识,善于分析,把握全局,这样才能真真正正将自己的工作完成到优秀并且脱颖而出。作为招聘的领导,刘总给我们提了一些要求和建议,一定要善于总结、见多识广,不能仅仅知道课本上的一些知识,课本上的知识很可能是过时的、小众的,而你必须与时俱进,统揽全局。 十、实习总结 这是我第一次做专业方面的比较大型的设计,比较幸运的我加入了一个相当强悍的队伍,然后完成了一个感觉还比较成功的作品,所学的知识也得到了相当多的应用。从大一的C语言、大二的微机原理、单片机、大三的嵌入式中关于定时/计数器、I/O口、串/并行通讯、中断等等各模块的介绍,大二模拟电子技术到这学期过程控制课程刚学的PID算法,都得到了应用,也相当于将所学知识进行了一次小小的整合和综合性应用吧。看我们的自己小车功能越来越多,跑得越来越流畅,真真切切的感觉到什么叫“知识就是力量”。首先感谢老师的指导和支持,给我们这次实现自己想法的机会,并给我们提供了实验室和必要的实验条件。感谢创新实验室里的同学们以及我们的特别技术顾问-来自计092-3的梁陈同学,帮我们找到了带有舵机的小车底座,帮我们顺手焊了一个7805稳压电路,给我们提供电池盒、杜邦线以及各种小器件-多谢你的支持!最后一定要提的是我们精诚合作齐心协力的队伍,大家群策群力完成主程序后,最后时刻由于各种原因各种缺席,居然是不同的人员组合完成了不同的纠错、调试任务,不同的组合将程序从90%、95%推进到99.9%以及最后的100%,大家一起见证了最后小车的流畅运行。感谢我强大的队员们:王威-我们队伍当之无愧的核心,将我们各自的模块组合起来以及完成了最后繁琐的两种控制模式的结合;夏青-经常抬头望天进行云计算的才女,几乎分析出了所有出现故障时的前因后果,不得不佩服你的专业基础;峰哥-张飞也能绣花,粗犷的外表下却有着一双灵巧的双手,细腻程度令人惊叹! 这次实习因为有你们而格外美丽!O(_)O 附:系统程序: /*系统功能说明* /*接通电源后,按下开机键,单片机进入模式选择状态,按左三角键进入(超声波)物体追踪模式,小车可以与物体始终保持设定的距离,按右三角键进入红外遥控模式,可以遥控小车前进、后退、左转、右转、剎停在两个模式下按关机键,可以终止当前模式,重新选择功能,此时按关机键,直接关机,必须按开机键才能重新选择*/ /1111*IO分配详细说明*/系统IO分配/p1_1、p1-2,超声波模块发送和接受信号线tx rx/p1_3,pwm输出线/p1_0、p1_7,电机正反转的标志位zheng fan/p0数码管数据口/p2_0/1/2/3数码管驱动/p0_0、p0_1电机驱动正反转控制/p0_1、p0_2转向电机(舵机)正反转控制位/p1_4剎停标志位/p1_5、p1_6左右方向标志位,红外功能开关标志位/2222*头文件区*#include /系统头文件#include /IO口、定时器、中断、串口等相关特殊寄存器头文件#include /自定义功能IO头文件#include /自编stc12csa60s的pwm模块头文件 /AT89X51.H中除了IO口 和中断的定义,其余的都与reg52.h的定义重合。 /3333*公共变量区* /下面是关于红外遥控模块的公共变量区unsigned char f; /找到起始码开始取值的标志#define Imax 14000 /此处为晶振为11.0592时的取值, #define Imin 8000 / 用来识别起始码#define Inum1 1450 /周期取值范围,代表0 和1 #define Inum2 700 #define Inum3 3000 /不同的周期所对应的计数值,代表不同的信息unsigned char Im4=0x00,0x00,0x00,0x00; /起始码、用户码、校验码的存储数组unsigned long m,Tc; /位计数、信号周期计数值unsigned char IrOK; /读码有效标志位 /下面是关于超声波模块的公共数据 #define SETVALUE 15 /设定值为15厘米#define P 15#define I 0.5#define D 10unsigned char code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /数码管的0-9译码值long S=0; /获取距离值(当前值)int OFFSET=0; /偏差int pwm_kong=0;/PID运算后的占空比控制因子0-255int SUM_OFFSET=0; /上一次的偏差int err10;int I_OFFSET=0;int qian_sum=0;int hou_sum=0;int D_OFFSET=0;unsigned int time=0; /从发送到接受所经历的计数值unsigned int ge=0; /距离值的个位(厘米计)一下以此类推unsigned int shi=0;unsigned int bai=0;unsigned int qian=0; int flag_chao=0;int flag_hong=0;/进入两个模块的标志位int flag=0; /红外模式下定义的系统总的开关/4444*函数声明区(中断服务子程序不参与声明(外部1)* /下面是超声波物体追踪模块的相关函数声明void display(); /数码管显示函数void delayus(unsigned int us); /微秒级延时函数void delay(unsigned char i); /延时函数void StartModule(void) ; /通过p1-1发送一个10us以上的脉冲void Count() ;/将计数值转化成距离值void pwminit() ; /PWM模块初始化函数void PWM0_set (unsigned int a); /占空比调节函数void chaoshengbo();/物体追踪模式下的控制函数 /下面是红外遥控模块的相关函数声明 /void delay(unsigned i); /延时函数 (公用)/void pwminit(); /PWM模块初始化函数 (公用)void hongwai(); /红外遥控模式的控制函数 /5555*主函数区* main()/两个模块均要用到定时器(超声波用来计算距离值,红外用来根据信号周期确定信息类型),/为了防止干扰,用两个定时器模块,前1后0,都用到了PWM模块/且要红外控制 以决定进入物体追踪还是红外遥控,所以,需要公共定义的变量如下:/*两个模块公共需要 / pwminit(); /PWM初始化 75%占空比 TMOD=0x11; TH0=0;TL0=0; /定时器0和1为方式1,16位计数 ,计数值清零 TR0=1; /红外模块需要马上开启定时器工作 TH1=0;TL1=0;/定时器1计数值清零等待超声波模块使用 /*需要从红外控制进入两个模块,定义如下: EA=1; /开启所有中断 IT1=1; /外部中断为下降沿触发 EX1=1; /开启外部中断 红外控制依赖于外部中断 m=0; f=0; /红外控制标志位清零 in1=0; in2=0; /初始化使电机停转,防止开机开车 in3=0; in4=0; /防止开机乱摆/修改flag_chao=0;flag_hong=0; /*主干程序如下: while(1) if(IrOK=1) /红外取值有效,开始判断 if(Im2=0x09) /开机,p1_5、6全亮 p1_5=0; p1_6=0; flag=1; /修改 IrOK=0; if(Im2=0x03 ) /关机,p1_5、6全灭 /两级退出模式,在模块运行中按关机键可进入主函数循环重新选择模块 /在主函数循环中按关机键,直接退出系统,必须重新开机,才能操作。 p1_5=1; p1_6=1; flag=0; in1=0; in2=0; in3=0; in4=0;/修改 IrOK=0; if(Im2=0x0c & flag=1) /左三角号键,代表进入超声波物体追踪模块 flag_chao=1;flag_hong=0;/修改 IrOK=0; if(Im2=0x02 & flag=1) /右三角号键,代表进入红外遥控模块 flag_chao=0;flag_hong=1;/修改 IrOK=0; /模块选择; if(flag_chao=1 & flag_hong=0) chaoshengbo();/修改p1_5=1;fan=1; if(flag_chao=0 & flag_hong=1) hongwai();/修改p1_5=1;fan=1; /6666*所调用的功能函数区* /下面是关于超声波物体追踪模块的功能函数区void delay(unsigned char i) unsigned char j,k; for(j=i;j0;j-) for(k=125;k0;k-);/* void display() /通过p0口发送数据并且通过p2的0-3发送是使能信号 P0=tableqian; P2_0 = 0; delay(2); P2_0 = 1; P0=tablebai; P2_1 = 0; delay(5); P2_1 = 1; P0=tableshi; P2_2 = 0; delay(5); P2_2 = 1; P0=tablege; P2_3 = 0; delay(5); P2_3= 1; /* void delayus(unsigned int us)unsigned char j;for(;us;us-) j=10;while(-j); void Count(void) time=TH1*256+TL1; /获取计数值 TH1=0; TL1=0; /计数值清零 S=time*1.87/100; /通过计数值和系统频率、声速来计算距离 ge=S%1000%100%10; /依次获取距离值的各个位 shi=S%1000%100/10; bai=S%1000/100; qian=S/1000; display(); /* void StartModule() /通过p1-1发送一个10us以上的脉冲 TX=1; delayus(10); TX=0; /*void pwminit() /PWM模块初始化函数 CCON=0;/关闭PCA计数器,清除模块0、1的中断标志位 CL=0; CH=0;/计数值清零 /CMOD=0x02;/PCA模块输入时钟为系统时钟的1/2,通过此寄存器改变方波频率 CMOD=0; /12分之1的系统频率/CCAP0H=CCAP0L=0x80; /占空比为50%,256/2 / CCAP0H=CCAP0L=0xC0;/占空比25% CCAP0H=CCAP0L=0x3f; /初始占空比0,输出0 /CCAP0H=CCAP0L=0x00; /初始占空比100%,输出1 CCAPM0=0x42;/允许9位比较器功能,PCA模块0为8位无中断PWM方式 在p1.3输出 CR=1;/开启PCA模块计数器。/ CCON=0x40;/*/void PWM0_set (unsigned int a) /占空比调节函数 a=255-a; /这样的写法是为了适应PID算法 CCAP0L= a; /设置值直接写入CCAP0L CCAP0H= a; /设置值直接写入CCAP0H/*void chaoshengbo()int i;in1=0;in2=0; /误差数组计数变量in3=0;in4=0;p1_5=0;fan=1;pwminit();while(1)if(IrOK=1) /判断当前有无退出模式的信号 if(Im2=0x03 ) flag_chao=0; flag_hong=0; /修改IrOK=0;in1=0;in2=0; return;/若有关机键按下则退出 /修改IrOK=0; StartModule(); /发送一个10us的发送使能信号 while(!RX); /当(p1-2)RX为零时等待 TR1=1; /开启定时器1计数 while(RX); /当RX为1计数并等待 TR1=0; /关闭定时器1计数 Count(); /计算并发送到数码管 /*一下开始PID运算 OFFSET=S-SETVALUE; /获取偏差 if(OFFSET0) /偏差大于零,大于设定值,电机正转 前进 in1=1;in2=0;in3=0;in4=0;/防止转向电机抖动zheng=0;fan=1;/电机驱动正转模式,正转LED亮 p1-0ting=1;for(i=0;i9;i+)erri+1=erri;err0=OFFSET; /误差数组更新for(i=0;i=9;i+)SUM_OFFSET+=erri; /误差数组求和for(i=0;i=4;i+)qian_sum+=erri; for(i=5;i255) I_OFFSET=255;pwm_kong=P*OFFSET+I_OFFSET+D*D_OFFSET;/PID运算if(pwm_kong255)pwm_kong=255;/PWM为8位,总的计数值为0-255if(pwm_kong0)pwm_kong=0;/PWM为8位,总的计数值为0-255PWM0_set(pwm_kong); else if(OFFSET0)/偏差小于零,小于设定值 电机反转 后退 OFFSET=-OFFSET; in1=0; in2=1; in3=0; in4=0;/防止抖动 zheng=1; fan=0;/电机驱动反转模式,反转LED亮 p1-7 ting=1; for(i=0;i9;i+)erri+1=erri;err0=OFFSET; /误差数组更新 for(i=0;i=9;i+)SUM_OFFSET+=erri; /误差数组求和 for(i=0;i=4;i+)qian_sum+=erri; for(i=5;i255) I_OFFSET=255;
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!