第一篇:电磁智能小车设计报告
标题:电磁感应智能电动车
摘要:本系统以AVR单片机MEGAl6为核心器件,实现对驱动电路的控制,使电动小车自动行驶。利用电磁原理,在车模前上方水平方向固定两个相距为L的电感,通过比较两个电感中产生的感应电动势大小即可判断小车相对于导线的位置,进而做出调整,引导小车大致循线行驶。用PWM技术控制小车的直流电动机转动,完成小车位置、速度、时间等的控制。利用干簧管来检测跑道的起始和终点位置从而完成小车的起步及停车。
系统总体设计:
AVR单片机MEGAl6(该芯片能够不需要外围晶振和复位电路而独立工作,非常适合智能寻迹车模的要求。)为核心,由单片机模块、路径识别模块、直流电机驱动模块、舵机驱动模块等组成,如下图所示。基于电磁感应的智能寻迹车模系统以
直流电动机为车辆的驱动装置,转向电动机用于控制车辆行驶方向。智能寻迹车模利用电磁感应在跑道上自主寻迹前进,转向。
单片机模块(控制模块):
寻迹车模采用AVR内核的ATMEGAl6。该芯片能够不需要外围晶振和复位电路而独立工作,非常适合智能寻迹车模的要求。
路径识别模块:
本方案就是在车模前上方水平方向固定两个相距为L的电感。左边的线圈的坐标为(x,h,z),右边的线圈的位置(x-L,h,z)。由于磁场分布是以z轴为中心的同心圆,所以在计算磁场强度的时候我们仅仅考虑坐标(x,y)。由于线圈的轴线是水平的,所以感应电动势反映了磁场的水平分量。计算感应电动势:
图 1 线圈中感应电动势与它距导线水平位置x 的函数
如果只使用一个线圈,感应电动势E 是位置x 的偶函数,只能够反映到水平位置的绝对值x 的大小,无法分辨左右。为此,我们可以使用相距长度为L 的两个感应线圈,计算两个线圈感应电动势的差值:
对于直导线,当装有小车的中轴线对称的两个线圈的小车沿其直线行驶,即两个线圈的位置关于导线对称时,则两个线圈中感应出来的电动势大小应相同、且方向亦相同。若小车偏离直导线,即两个线圈关于导线不对称时,则通过两个线圈的磁通量是不一样的。这时,距离导线较近的线圈中感应出的电动势应大于距离导线较远的那个线圈中的。根据这两个不对称的信号的差值,即可调整小车的方向,引导其沿直线行驶。
对于弧形导线,即路径的转弯处,由于弧线两侧的磁力线密度不同,则当载有线圈的小车行驶至此处时,两边的线圈感应出的电动势是不同的。具体的就是,弧线内侧线圈的感应电动势大于弧线外侧线圈的,据此信号可以引导小车拐弯。
另外,当小车驶离导线偏远致使两个线圈处于导线的一侧时,两个线圈中感应电动势也是不平衡的。距离导线较近的线圈中感应出的电动势大于距离导线较远的线圈。由此,可以引导小车重新回到导线上。
由于磁感线的闭合性和方向性,通过两线圈的磁通量的变化方向具有一致性,即产生的感应电动势方向相同,所以由以上分析,比较两个线圈中产生的感应电动势大小即可判断小车相对于导线的位置,进而做出调整,引导小车大致循线行驶。
驱动模块:
简易智能小车有两个电动机。其中一个小电动机控制前轮转向,给电动机加正反向电压,实现前轮的左右转向;另一电动机控制后轮驱动力。控制转向电动机需要较小的驱动力,经过实验,选L293作为驱动芯片;由于后轮驱动功率较大,所以选用L298N,经过实验发现小车行使过程中负载较大,导致L298N发热较大,故给芯片添加散热片以保护芯片正常工作。为了优化控制性能,采用PWM脉宽调速,并利用数模转换芯片产生 模拟电压,控制555生成占空比可调的脉冲从而控制L293B与L298N进行脉宽调速。
具体设计方案:
本设计使用一普通玩具小车作为车模,采用P W M 信号驱动,当PWM信号脉宽处于(1ms,1.5ms)区间时舵机控制小车向左行驶,脉宽处于(1.5ms,2ms)时小车向右行驶,脉宽约为1.5ms时小车沿直线行驶。本方案使用两个10mH的电感置于车模头部作为确定小车位置的传感器。然后,设计了一个模拟电路,采集、调理、放大由电感得到的电动势信号。具体电路如图2所示。
该电路采用电压并联负反馈电路,电感信号从PL进入。考虑到单独电感感应出的电动势很小,本设计使用电感和电容谐振放大感应电动势。由于使用的是10mH的电感,导线中电流频率为20kHz,因此使用6.3nF的电容。这样在电容上得到的电压将会比较大,便于三极管进行放大。整个电路的具体放大倍数需要根据实际负载进行计算。本设计的小车控制电路如图3所示。
首先,把由两个电感得到的感应电动势经调理、放大后得到的电压输出u1和u2送入由运放组成的减法器中进行减法运算,然后再经由运放组成的电压跟随器送给下一级电路。经过分析,这一级电路的输出大致可由下式进行计算:
后一级电路由两个555定时器组成,其中下方的555构成一个占空比非常接近于1的脉冲发生器,作为上方555的触发脉冲。因为此触发脉冲的低电平信号非常窄,所以能很好的保证上方555构成的单稳态电路正常运行。该脉冲信号频率为:
上方的555定时器构成一个单稳型压控振荡器,它的脉宽受输入V1的控制,输出即PWM信号。当V1较大时,即两个电感线圈中的感应电动势相差较大时,亦即小车偏离导线向左行驶时,则脉宽较大,舵机将控制小车向右行驶;当V1适中时,接近,即小车沿导线行驶时,则脉宽接近1.5ms,小车按直线行驶;当V1较小时,即小车偏离导线向右行驶时,则脉宽较小,舵机将控制小车向左行驶。从而,控制小车大致循着导线行驶。另外,改变构成减法器的电阻的值,可以调整小车反应的灵敏度,进而防止出现小车以导线为中轴线左右摇摆的现象。
补充说明:跑道上的起始位置及终点位置用干簧管来检测。
程序设计流程图:
第二篇:智能小车设计报告
机器人控制技术
实验设计报告书
题
目:基于STC89C52的智能小车的设计 姓
名:李如发 学
号:073321032 专
业:电气工程及其自动化 指导老师:李东京 设计时间:2010年 6 月
目
录
1.引 言..............................................1 1.1.设计意义......................................1 1.2.系统功能要求..................................1 1.3.本组成员所做的工作............................1 2.方案设计...........................................1 3.硬件设计...........................................2 4.软件设计...........................................7 5.系统调试...........................................7 6.设计总结...........................................8 7.附 录A;源程序.....................................8 8.附 录B;作品实物图片...............................10 9.参考文献..........................................11
16×16点阵LED室内电子显示屏的设计
单片机原理及应用课程设计
基于STC89C52的智能小车的设计
1.引 言
1.1.设计意义
本智能小车的设计,首先针对大学所有学习的知识是一个很好的回顾和总结。此智能小车是基于单片机所设计的,具有自动寻迹能力,在实际的很多方面有应用。当我们进一步的改进机器人系统时,可实现更重要的功能,如可设计出自动扑火机器人等。1.2.系统功能要求
此智能小车是基于STC89C52设计的具有自动寻迹能力的小车。系统可实现跟随黑色引导线行走的能力,在行驶过程中,并能用测速传感器和光电码盘对小车速度实现实时监测。小车在行驶过程中并能实现播放美妙的音乐。1.3.本组成员所做的工作
本组成员有李如发,汪航,黄建安,韩文龙,罗莹,明菲菲,邹珊,江锐,邵进。
李如发:驱动 073321032 汪航: 电源 073522036 黄建安:最小统 073521013 韩文龙:源程序 073522007 罗莹: 传感器 073522038 明飞菲:调试 073522012 邹芬 : 数码显示 073521025 邵琎 : 焊接 073522017 江锐 : 蜂鸣器 073522032
2.方案设计
智能小车主要分为传感器部分,最小系统部分,电机驱动部分,电源部分。根据功能要求,提出合理的设计方案,画出方案方框图,并对系统工作原理进行阐述。
原理,本系统的重要部分是传感器,它对整个小车的定位起到很重要的作用,由传感器检测黑线的位置,其中黑线对光能吸收,白线对光反射。利用此原
16×16点阵LED室内电子显示屏的设计
单片机原理及应用课程设计
理将红外线传感器采集到的信号转换为数字信号并送入单片机,单片机根据收到的信号实时的控制小车的方向。控制小车的方向主要是运用pwm原理来控制电机的平均电压,从而来控制电机的转速,实现小车对黑线的实时跟踪。
3.硬件设计
硬件设计各模块电路图及原理描述 传感器模块
方案1:用光敏电阻组成光敏探测器。光敏电阻的阻值可以跟随周围环境光线的变化而变化。当光线照射到白线上面时,光线发射强烈,光线照射到黑线上面时,光线发射较弱。因此光敏电阻在白线和黑线上方时,阻值会发生明显的变化。将阻值的变化值经过比较器就可以输出高低电平。
但是这种方案受光照影响很大,不能够稳定的工作。因此我们考虑其他更加稳定的方案。
方案2:用RPR220型光电对管。RPR220是一种一体化反射型光电探测器,其发射器是一个砷化镓红外发光二极管,而接收器是一个高灵敏度,硅平面光电三极管。
方案3:用红外发射管和接收管自己制作光电对管寻迹传感器。红外发射管发出红外线,当发出的红外线照射到白色的平面后反射,若红外接收管能接收到反射回的光线则检测出白线继而输出低电平,若接收不到发射管发出的光线则检测出黑线继而输出高电平。我们选择了此方案。
传感器是整个系统的眼睛,这部分主要运用红外线传感器采集信号送给单片机处理。由于黑色车道对红外线传感器发出的光有吸收能力,白色地方对发出的光反射,从而当传感器在不同的地方产生不同的信号,传送个单片机。单片机根据采集的信号做出实时的处理。
16×16点阵LED室内电子显示屏的设计
单片机原理及应用课程设计
最小系统
最小系统是整个系统的心脏,我们采用的是AT89C52芯片。
80C52单片机是把那些作为控制应用所必需的基本内容都集成在一个尺寸有限的集成电路芯片上[2]。如果按功能划分,它由如下功能部件组成,即微处理器、数据存储器、程序存储器、并行I/O口、串行口、定时器/计数器、中断系统及特殊功能寄存器。它们都是通过片内单一总线连接而成,其基本结构依旧是CPU加上外围芯片的传统结构模式。但对各种功能部件的控制是采用特殊功能寄存器的集中控制方式。
驱动模块
方案1:采用专用芯片L298N作为电机驱动芯片。L298N是一个具有高电压大电流的全桥驱动芯片,它相应频率高,一片L298N可以分别控制两个直流
16×16点阵LED室内电子显示屏的设计
单片机原理及应用课程设计
电机,而且还带有控制使能端。用该芯片作为电机驱动,操作方便,稳定性好,性能优良。
方案2:对于直流电机用分立元件构成驱动电路。由分立元件构成电机驱动电路,结构简单,价格低廉,在实际应用中应用广泛。但是这种电路工作性能不够稳定。
因此我们选用了方案1。
由于最小系统和电机驱动部分的电压幅值不一样,而且电机是感性负载,在制动时可能反馈电流,因此要在最小系统和驱动模块之间采用光电隔离,所以用到了光电隔离芯片,TPL521-4
由于光耦芯片的引脚不够所以在之后采用了一片反相器74HCT14,反相器图如下
L298是双H桥高电压大电流功率集成电路,直接采用TTL逻辑电平控制,可用来驱动继电器、线圈、直流电动机、步进电动机等电感性负载。它的驱动电压可达46V,直流电流总和可达4A。其内部具有2个完全相同的PWM功率放大回路。由L298构成的PWM功率放大器的工作形式为单极可逆模式。12个H桥的下侧桥晶体管发射极连在一起,其输出脚(1和15)用来连接电流检测电阻。第9脚接逻辑控制部分的电源,常用+5V,第4脚为电机驱动电源,本系统中为40V,第5,7,10,12脚输入标准TTL逻辑电平,用来控制H桥的开和关,16×16点阵LED室内电子显示屏的设计
单片机原理及应用课程设计
第6,II脚则为使能控制端。当Vs=40V时,最高输出电压可达35V,连续电流可达2A。
L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机,本实验装置我们选用驱动两台电动机。5,7,10,12脚接输入控制电平,控制电机的正反转。EnA,EnB接控制使能端,控制电机的停转。电动 机的转速由单片机调节PWM信号的占空比来实现。
L298驱动电路图
16×16点阵LED室内电子显示屏的设计
单片机原理及应用课程设计
PWM调速器的硬件组成
在整个PWM调速器中,CPU既是运算处理中心,又是控制中心,是最关键的器件。本系统中选用与MCS-51系列完全兼容的AT89C52单片机,它是一种低功耗、高性能、CMOS八位微处理器。片内具有8K字节的在线可重复编程快擦快写程序存储器,128x8位内部RAM,AT89C52可构成真正的单片机最小应用系统,缩小系统体积,提高系统可靠性,降低系统成本。
电源模块
电源中我们采用LM7805稳压芯片将12v直流电源稳压成5v直流源。方案1: 采用10节1.5V干电池供电,电压达到15V,经7812稳压后给支流电机供电,然后将12V电压再次降压、稳压后给单片机系统和其他芯片供电。但干电池电量有限,使用大量的干电池给系统调试带来很大的不便,因此,我们放弃了这种方案。
方案2:采用3节4.2V可充电式锂电池串联共12.6V给直流电机供电,经过7812的电压变换后给支流电机供电,然后将12V电压再次降压、稳压后给单片机系统和其他芯片供电。锂电池的电量比较足,并且可以充电,重复利用,因此,这种方案比较可行。但锂电池的价格过于昂贵,使用锂电池会大大超出我们的预算,因此,我们放弃了这种方案。
方案3:采用12V蓄电池为直流电机供电,将12V电压降压、稳压后给单片机系统和其他芯片供电。蓄电池具有较强的电流驱动能力以及稳定的电压输出性能。虽然蓄电池的体积过于庞大,在小型电动车上使用极为不方便,但由于我们的车体设计时留出了足够的空间,并且蓄电池的价格比较低。因此我们选择了此方案。下:
16×16点阵LED室内电子显示屏的设计
单片机原理及应用课程设计
4.软件设计
程序流程图
5.系统调试
本系统的设计是首先完成每一小部分的设计,因此我们在没完成一个模块时就回检测调试该模块。在初次调试时我们采用的电源是又单片机开发板所带的的电源来调试的。调试过程中我们就发现了很重要的问题,由于对本设计的很多模块的没有共同的接地使得很多模块无法工作,我们的解决办法是12v的直流源稳压来供给所以的模块,然后将所以的模块连接共同的地。在驱动模块的调试中发现当光耦芯片给定信号时对lm298的输出没有反应。我们在检验时发现是由于在光耦芯片后部焊接没有焊好,出现了虚焊。在重新焊接好后,芯片正常工作。分
16×16点阵LED室内电子显示屏的设计
单片机原理及应用课程设计
块调试传感器时,我们将传感器导通,用黑色物体将传感器发射部分盖住检测输出,在将黑色物体移开,再检测输出。
6.设计总结
本文是关于基于单片机的智能小车的设计,在共同的努力下,各部分的设计均成功,在调试过程中都无误。本次设计最终实现了直流电机的动态调压,电源正常输出供电,数码管动态显示数据,蜂鸣器播放美妙的音乐,小车实现简单的转弯功能。由于本次设计中尚存在些缺陷和对寻迹程序编写困难,实现的功能不是很完美,但要求的所有功能基本实现。
本次设计中,从中的体会很多
1、本次的设计可以说设计到大学所学到的所有专业知识,是对大学所学知识的一个整体的回顾。
2、在设计中,不能一气呵成,因为所有的电路图都是自己设计的,图中尚存在不足,所以要反复的琢磨和修改。
3、设计中要注意对每焊完一部分,都要独立的进行检查调试,及时的发现错误,及时的修改
4、本次最重要的收获是从中我们看到了团队合作的重要性,任何事都不是一个人所能完成的,需要大家的共同努力才能获得最后的成功。
7.附 录A;源程序
源程序代码(主要语句要有注释)。循迹的程序 #include
sbit R=P2^0;//右边传感器 sbit L=P2^1;//左边传感器 sbit RM1=P1^1;sbit RM2=P1^2;//右边电机 sbit LM1=P1^3;sbit LM2=P1^4;//左边电机 void main(){
16×16点阵LED室内电子显示屏的设计
单片机原理及应用课程设计
RM1=1;
RM2=0;
LM1=1;
LM2=0;
delay(5);
while(1)
{
if((L==1)&&(R==1))//小车前进 {
RM1=1;
RM2=0;
LM1=1;
LM2=0;
delay(5);
}
else if((L==1)&&(R==0))//小车右偏
{
RM1=1;
RM2=0;
LM1=0;
LM2=1;
//左边的电机停止转动,右边的电机转动,这样就实现了左转
delay(10);
}
else if((L==0)&&(R==1))//小车左偏
{
RM1=0;
RM2=1;
LM1=1;
LM2=0;
//右边的电机停止转动,左边的电机转动,这样就实现了右转
delay(10);}
else if((L==0)&&(R==0))//小车停车
{
RM1=0;
RM2=1;
LM1=0;
LM2=1;delay(5);
}
16×16点阵LED室内电子显示屏的设计
单片机原理及应用课程设计
else
//左右两个电机同时启动,直线前进
{
RM1=1;
RM2=0;
LM1=1;
LM2=0;
}
}
delay(10);
}
void delay(uint z)
{
uint a,b;for(a=z;a>0;a--)for(b=120;b>0;b--);}
8.附 录B;作品实物图片
16×16点阵LED室内电子显示屏的设计
单片机原理及应用课程设计
9.参考文献
[1] Mark Nelson著.潇湘工作室译.串行通信开发指南[M].中国水利水电出版社,2002.[2] 王宜怀.单片机原理及其嵌入式应用教程[M].北京希望电子出版社,2002.[3] 张毅刚.单片机原理及应用.高等教育出版社,2009 [4] 康华光.电子技术基础(模拟部分).高等教育出版社.2006
第三篇:智能小车设计报告
智能小车设计报告
魏旭峰、孔凡明、陈梦洋
(河北科技大学 电气信息学院)摘要:
AT89S52单片机是一款八位单片机,他的易用性和多功能性受到了广大使用者的好评。该设计是结合科研项目而确定的设计类课题。本系统以设计题目的要求为目的,采用89S52单片机为控制核心,利用红外线传感器检测道路上的黑线,控制电动小汽车的自动寻路,快慢速行驶。整个系统的电路结构简单,可靠性能高。实验测试结果满足要求,本文着重介绍了该系统的硬件设计方法及测试结果分析。
采用的技术主要有:
通过编程来控制小车的速度及方向; 传感器的有效应用; 1602液晶显示的应用;
关键词: 89S52单片机、光电检测器、PWM调速、电动小车
第一章 方案设计与论证
一 供电系统
二 光电检测系统
三 单片机最小应用系统设计
四 液晶显示1602的应用
五 电机驱动
第二章 软件设计
第二章 方案设计与论证
根据要求,小车应在规定的赛道上行驶,赛道中央黑线宽为25MM,确定如下方案: 在现有玩具电动车的基础上,加装光电检测器,实现对电动车的位置的实时测量,并将测量数据传送至单片机进行处理,然后由单片机根据所检测的各种数据实现对电动车的转向和速度的智能控制.这种方案能实现对电动车的运动状态进行实时控制,控制灵活、可靠,精度高,可满足对系统的各项要求。
一 供电系统
本模块使用LM2940芯片输出+5V的电压,为89S52单片机光电检测电路供电,采用LM1117可控变压芯片输出+6V电压为舵机供电.而电机则由单片机来控制,当单片机输出的电压不同时,电机的转速不同,以此来达到控制小车速度的目的.电路如图:
二 光电检测系统
本模块采用七对红外线发射和接收对管,来检测小车前方黑线位置和模拟车站停车位置.发射管发射管出红外线,当对管正下方为白色跑道时,发射管发射出去的红外线会被反射回来, 接收因接收到红外线而导通,两端电压为零,当对管正下方为黑色线时,黑线将吸收红外线,接收管因接收不到红外线而无法导通,两端电压为+4V左右,将接收管端电压与一个给定电压经LM324比较后输出0和+5V两固定个值,当对管正下方为白色时输出+5V电压,当对管正下方为黑线时输出0V,输出的电压交给单片机,以此来确定黑线的位置.电路如图:
三 单片机最小应用系统设计
89S52单片机是本系统的核心所在,自动寻迹和调速都是它控制, 七对光电对管经比较器输出的电压输入单片机,单片机根据电压的高低来判断黑线位置,进而调整速度和方向,电路如下:
四 舵机的应用
舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。
其工作原理是:单片机放的控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。
五 电机驱动
电机驱动电路是根据单片机的控制型号来控制电机的转动的,电路如下:
第二章 软件设计 #include
#define uchar unsigned char//宏定义 uchar duoj,dianj,time0=0,time1=0,L=0,e=30;void timer0()interrupt 1 //定时器零 控制舵机 { time0++;
if(time0==duoj)moto=0;if(time0==80){ time0=0;
moto=1;} TH0=(65536-313)/256;TL0=(65536-313)%256;} void timer1()interrupt 3 ///定时器一 控制电机 { time1++;if(time1==dianj)in1=1;if(time1==80){
time1=0;
in1=0;} TH1=(65536-340)/256;TL1=(65536-340)%256;}
void main()/////主函数开始 { TMOD=0x11;TH0=(65536-313)/256;TL0=(65536-313)%256;TH1=(65536-340)/256;TL1=(65536-340)%256;EA=1;ET0=1;
ET1=1;in1=0;moto=1;TR0=1;TR1=1;while(1)//////检测黑线位置
{
while(1)
{
if(P1==0xff){duoj=8;dianj=55;break;} 全白时缓进
if(L1==0){duoj=10;dianj=37;L=1;break;} //L1
if(L7==0){duoj=6;dianj=37;L=7;break;} //L7
if(L2==0){duoj=10;dianj=22;L=2;break;} //L2
if(L6==0){duoj=6;dianj=22;L=6;break;} //L6
//
if(L3==0){duoj=9;dianj=27;L=3;break;} //L3
if(L5==0){duoj=7;dianj=27;L=5;break;}
//L5
if(L4==0){duoj=8;dianj=70;L=4;break;}
//l4
//else {duoj=8;dianj=17;break;}
}
while(P1==0xff)当检测不到信号时保持最后的状态
{
switch(L)
{
case 1:duoj=10;dianj=39;break;
case 2:duoj=10;dianj=22;break;
// case 3:duoj=9;dianj=25;break;
// case 4:duoj=8;dianj=70;break;
// case 5:duoj=7;dianj=25;break;
case 6:duoj=6;dianj=22;break;
case 7:duoj=6;dianj=39;break;
}
} } }////////主函数结束
第四篇:智能循迹小车___设计报告
智能循迹小车设计
专 业: 自动化 班 级: 自动化132 姓 名:罗植升 莫柏源 梁桂宾 指导老师:
2014年4月——2010年6月
摘要: 本课题是基于STC89C52单片机的智能小车的设计与实现,小车完成的主要功能是能够自主识别黑色引导线并根据黑线走向实现快速稳定的寻线行驶。小车系统以 STC89C52单片机为系统控制处理器; 采用红外传感获取赛道的信息,来对小车的方向和速度进行控制。此外,对整个控制软件进行设计和程序的编制以及程序的调试,并最终完成软件和硬件的融合,实现小车的预期功能。
引 言 当今世界,传感器技术和自动控制技术正在飞速发展,机械、电气和电子信息已经不再明显分家,自动控制在工业领域中的地位已经越来越重要,“智能”这个词也已经成为了热门词汇。现在国外的自动控制和传感器技术已经达到了很高的水平,特别是日本,比如日本本田制作的机器人,其仿人双足行走已经做得十分逼真,而且具有一定的学习能力,还据说其智商已达到6岁儿童的水平。
作为机械行业的代表产品—汽车,其与电子信息产业的融合速度也显著提高,呈现出两个明显的特点:一是电子装置占汽车整车(特别是轿车)的价值量比例逐步提高,汽车将由以机械产品为主向高级的机电一体化方向发展,汽车电子产业也很有可能成为依托整车制造业和用车提升配置而快速成为新的增长点;二是汽车开始向电子化、多媒体化和智能化方向发展,使其不仅作为一种代步工具、同时能具有交通、娱乐、办公和通讯等多种功能。
无容置疑,机电一体化人才的培养不论是在国外还是国内,都开始重视起来,主要表现在大学生的各种大型的创新比赛,比如:亚洲广播电视联盟亚太地区机器人大赛(ABU ROBCON)、全国大学生“飞思卡尔”杯智能汽车竞赛等众多重要竞赛都能很好的培养大学生对于机电一体化的兴趣与强化机电一体化的相关知识。但很现实的状况是,国内不论是在机械还是电气领域,与国外的差距还是很明显的,所以作为机电一体化学生,必须加倍努力,为逐步赶上国外先进水平并超过之而努力。
为了适应机电一体化的发展在汽车智能化方向的发展要求,提出简易智能小车的构想,目的在于:通过独立设计并制作一辆具有简单智能化的简易小车,获得项目整体设计的能力,并掌握多通道多样化传感器综合控制的方法。所以立“智能循迹小车”一题作为尝试。
此项设计是在以杨老师提供的小车为基础上,采用AT89C52单片机作为控制核心,实现能够自主识别黑色引导线并根据黑线走向实现快速稳定的寻线行驶。
一、实验目的:
通过设计进一步掌握51单片机的应用,特别是在嵌入式系统中的应用。进一步学习51单片机在系统中的控制功能,能够合理设计单片机的外围电路,并使之与单片机构成整个系统。
二、设计方案:
该智能车采用红外传感器对赛道进行道路检测,单片机根据采集到的信号的不同状态判断小车当前状态,通过电机驱动芯片L9110发出控制命令,控制电机的工作状态以实现对小车姿态的控制。
三、报告内容安排:
本技术报告主要分为三个部分。第一部分是对整个系统实现方法的一个概要说明,主要内容是对整个技术原理的概述;第二部分是对硬件电路设计的说明,主要介绍系统传感器的设计及其他硬件电路的设计原理等;第三部分是对系统软件设计部分的说明,主要内容是智能模型车设计中主要用到的控制理论、算法说明及代码设计介绍等。
技术方案概要说明
本模型车的电路系统包括电源管理模块、单片机模块、传感
器模块、电机驱动模块。
工作原理:
利用红外采集模块中的红外发射接收对管检测路面上的轨迹 将轨迹信息送到单片机
单片机采用模糊推理求出转向的角度和行走速度,然后去控制 行走部分
最终完成智能小车可以按照路面上的轨迹运行。
硬件电路的设计
1、最小系统:
小车采用STC89C52单片机作为控制芯片,图1是其最小系统电路。主要包括:时钟电路、电源电路、复位电路。其中各个部分的功能如下:
1、时钟电路:给单片机提供一个外接的12MHz的石英晶振。
2、电源电路:给单片机提供5V电源。
3、复位电路:在电压达到正常值时给单片机一个复位信号。
图1
单片机最小系统原理图
2、电源电路设计:
模型车通过自身系统,采集赛道信息,获取自身速度信息,加以处理,由芯片给出指令控制其前进转向等动作,各部分都需要由电路支持,电源管理尤为重要。在本设计中,51单片机使用5V电源,电机及舵机使用6V电源。考虑到电源为充电电池组,额定电压为7.2V,实际充满电后电压则为6.5-6.8V,所以单片机及传感器模块采用7805稳压后的5V电源供电,舵机及电机直接由电池供电。
3、传感器电路:
光电寻线方案一般由多对TCRT5000红外收发管组成,通过检测接收到的反射光强,判断黑白线。原理图由红外对管和电压比较器两部分组成,红外对管输出的模拟电压通过电压比较器转换成数字电平输出到单片机。
图2
赛道检测原理图:
4、电机驱动电路:
电机驱动芯片L9110,内部包含4通道逻辑驱动电路。是一种二相和四相电机的专用驱动器,即内含二个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可驱动46V、2A以下的电机。其引脚排列如图1中U4所示,1脚和15脚可单独引出连接电流采样电阻器,形成电流传感信号。L9110可驱动2个电机,OUT1、OUT2和OUT3、OUT4之间分别接2个电动机。5、7、10、12脚接输入控制电平,控制电机的正反转,ENA,ENB接控制使能端,控制电机的停转。也利用单片机产生PWM信号接到ENA,ENB端子,对电机的转速进行调节。L9110的逻辑功能:
表1 SHARP GP2D12实物图
外形及封装:
图3 L9110实物图
L9110电路原理图:
由于一片L298N可以直接驱动两个电机,但是为了加大驱动力,我们采用两路并联的方式来驱动电机。
图3.3 L9110电路图
小车循迹规则:
若小车偏左的时候,车轮将向右偏转;若小车偏右,车轮将向左偏转;若没有偏移,小车将继续向前;若小车完全偏离黑色轨迹,小车后退以寻找黑色轨迹。小车程序:
#include
sbit chongshua=P3^6;//定义单片机控制冲刷的引脚 sbit tuodi=P3^7;//定义单片机控制拖地的引脚
//--------//1602液晶相关I/O设置
sbit E=P2^3;//1602液晶的E脚接在P2.3口上 sbit RW=P2^4;//1602液晶的RW脚接在P2.4口上 sbit RS=P2^5;//1602液晶的RS脚接在P2.5口上
//HC-SR04相关I/O设置 sbit TIRG=P3^4;sbit ECHO=P3^2;
bit flag =0;
//定义IO口,具体可以去查看原理图 //定义IO口,具体可以去查看原理图 uchar k;uchar a=0;//定义一个变量a,用来读取串口的数据
void delay(uint z)//一个带参数的延时程序 {
}
void init()//初始化子程序 {
} TMOD=0x20;//设置定时器T1为工作方式2 TH1=0xfd;TL1=0xfd;//T1定时器装初值 TR1=1;//启动定时器T1 REN=1;//允许串口接收 SM0=0;SM1=1;//设置串口工作方式1 EA=1;//开总中断 ES=1;//开串口中断 int i,j;//定义两个变量 for(i=10;i>0;i--)for(j=z;j>0;j--);//将参数z赋值给j void qian()//左右轮协同前进子函数 {
} void zuo()//左右轮协同左转子函数 {
you1=0;you2=1;zuo1=1;zuo2=0;delay(9);//pwm调速 此为pwm有效值 you1=1;you2=1;you1=0;you2=1;zuo1=0;zuo2=1;delay(6);//pwm调速 此为pwm有效值 you1=1;you2=1;zuo1=1;zuo2=1;delay(4);
} zuo1=1;zuo2=1;delay(1);
void mzuo()//左右轮协同左转子函数 {
} void you()//左右轮协同右转子函数 {
you1=1;you2=0;zuo1=0;you1=0;you2=1;zuo1=1;zuo2=0;delay(10);//pwm调速 此为pwm有效值 you1=1;you2=1;zuo1=1;zuo2=1;delay(5);
} zuo2=1;delay(9);//pwm调速 此为pwm有效值 you1=1;you2=1;zuo1=1;zuo2=1;delay(1);
void myou()//左右轮协同右转子函数 {
} you1=1;you2=0;zuo1=0;zuo2=1;delay(10);//pwm调速 此为pwm有效值 you1=1;you2=1;zuo1=1;zuo2=1;delay(5);void hou()//左右轮协同前进子函数 {
}
void ting()//左右轮都停止转动 {
} you1=1;you2=1;zuo1=1;zuo2=1;you1=1;you2=0;zuo1=1;zuo2=0;delay(9);//pwm调速 此为pwm有效值 you1=1;you2=1;zuo1=1;zuo2=1;delay(1);
void Delay1602(unsigned int t){ unsigned int k;//定义一个16位寄存器用来做延时用 for(k=0;k void LCD1602_busy(void){ P0_7=1;// RS=0;//RS=0读入 RW=1;//RS=0读入 E=1;//RS=0读入 while(P0_7==1);// E=0;//} 延时 将P0.7置1,为读状态做准备、RW= 1、E=1时,忙信号输出到DB7,由P0.7、RW= 1、E=1时,忙信号输出到DB7,由P0.7、RW= 1、E=1时,忙信号输出到DB7,由P0.7由P0.7读入1,表示1602液晶忙,需要等待 读完以后,恢复E的电平void LCD1602_Write_com(unsigned char combuf){ RS=0;//选择指令寄存器 RW=0;//选择写状态 P0=combuf;//将命令字通过P0口送至DB E=1;//E高电平将命令字写入1602液晶 E=0;//写完以后,恢复E的电平} void LCD1602_Write_com_busy(unsigned char combuf){ LCD1602_busy();//调用忙检测函数 LCD1602_Write_com(combuf);//调用忙检测函数 } void LCD1602_Write_data_busy(unsigned char databuf){ LCD1602_busy();//调用忙检测函数 RS=1;//选择数据寄存器 RW=0;//选择写状态 P0=databuf;//将命令字通过P0口送至DB E=1;//E高电平将命令字写入1602液晶 E=0;//写完以后,恢复E的电平} void LCD1602_Write_address(unsigned char x,unsigned char y){ x&=0x0f;//列地址限制在0-15间 y&=0x01;//行地址限制在0-1间 if(y==0)//如果是第一行 LCD1602_Write_com_busy(x|0x80);//将列地址写入 else //如果是第二行 LCD1602_Write_com_busy((x+0x40)|0x80);//将列地址写入 } void LCD1602_init(void){ Delay1602(1500);//调用延时函数 LCD1602_Write_com(0x38);//8位数据总线,两行显示模式,5*7点阵显示 Delay1602(500);//调用延时函数 LCD1602_Write_com(0x38);//8位数据总线,两行显示模式,5*7点阵显示 Delay1602(500);//调用延时函数 LCD1602_Write_com(0x38);//8位数据总线,两行显示模式,5*7点阵显示 LCD1602_Write_com_busy(0x38);//8位数据总线,两行显示模式,5*7点阵显示 LCD1602_Write_com_busy(0x08);//显示功能关,无光标 LCD1602_Write_com_busy(0x01);//清屏 LCD1602_Write_com_busy(0x06);//写入新的数据后,光标右移,显示屏不移动 LCD1602_Write_com_busy(0x0C);//显示功能开,无光标 } void LCD1602_Disp(unsigned char x,unsigned char y,unsigned char buf){ LCD1602_Write_address(x,y);//先将地址信息写入 LCD1602_Write_data_busy(buf);//再写入要显示的数据 } void Timer0(void)interrupt 1 { } flag=0;void xunji(){ qian();//调用前进子函数,使小车光电管不满足以下几个条件时都处于前进状态 while((z==0)&&(y==1)&&(q==1))//判断当左边光电管遇到黑线,{ } while((z==1)&&(y==0)&&(q==1))//判断当右边光电管遇到黑线,{ } while((z==0)&&(y==0)&&(q==1))//判断当左边光电管遇到黑线,右边 //左边和前边的光电管遇到白线时右转 //右边和前边的光电管遇到白线时左转 zuo();//调用左转函数 zd=1;you();//调用右转函数 yd=1;光电管也遇到黑线 { //前边的光电管遇到白线时停止 ting();//调用停止函数 } hd=1;while((z==0)&&(y==0)&&(q==0))//判断当左边、右边、前边光电管同时遇到黑线 } void csb(){ long S;unsigned int i;unsigned int Timeout; { } //即遇到十字路口,小车前进 qian();//调用前进函数 LCD1602_init();//调用1602液晶初始化函数 //***定时器Timer0初始化*** TMOD&=0xF0;//将TMOD的低4位定时器0控制部分清零 TMOD|=0x01;//设置定时器0为方式1 TMOD=0x01;TL0=0;//设置定时器0初值低8位 TH0=0; //设置定时器0初值高8位 TR0=0;//停止定时器0 ET0=1;//Timer0中断允许 //***开全局中断设置**** //定时器Timer0设置了中断允许,此处要开全局中断 EA=1;//开全局中断 TIRG=1; //发一个脉冲触发信号 //维持约17US,符合不低于10US的要求 //维持约17US,符合不低于10US的要求 i=4; while(i>0)i--; TIRG=0;TR0=0; //维持约17US,符合不低于10US的要求 //撤销触发信号 //关闭定时器 //设置定时器0初值低8位为0 TL0=0; TH0=0; //设置定时器0初值高8位为0 //清除溢出标志 k=0;flag=0;Timeout=0;while((ECHO==0)&&((Timeout++)<50000)); //等待回响高电平 TR0=1;//回响高电平来后启动定时器 Timeout=0;while((ECHO==1)&&((Timeout++)<50000)); //等待回响高电平结束后 TR0=0; //关闭定时器 S=((TH0*256+TL0)*1)/58; if(flag==1||S>400)//超出测量范围显示“-” { LCD1602_Disp(0, 0, '-'); LCD1602_Disp(1, 0, '-'); LCD1602_Disp(2, 0, '-'); LCD1602_Disp(3, 0, 'C'); LCD1602_Disp(4, 0, 'M'); } else { LCD1602_Disp(0, 0, S%1000/100+'0'); LCD1602_Disp(1, 0, S%1000%100/10+'0');// LCD1602_Disp(2, 0, S%1000%100%10+'0'); LCD1602_Disp(3, 0, 'C'); LCD1602_Disp(4, 0, 'M'); } i=18000; while(i>0) //显示百位- //显示十位- //显示个位- //显示C //显示M //显示百位 显示十位 //显示个位 //显示C //显示M //维持约77400US,符合不低于60MS的要求 //维持约77400US,符合不低于60MS的要求 i--; } void main()//主程序 { //维持约77400US,符合不低于60MS的要求 init();//调用初始化子程序 while(1)//死循环 { switch(a)//判断a从串口读取到的数据 { case 0x00://如果是0x1f就前进 xunji();break;case 0x01://如果是0x2f就后退 qian();break;case 0x02://如果是0x3f就左转 csb();break; case 0x03://如果是0x4f就右转 mzuo();zd=1;break; case 0x04://如果是0x00就停止 hou();break; case 0x05://如果是0xa0车灯打开 myou();yd=1;break; case 0x06://如果是0xb0车灯关闭 chongshua=1;break; case 0x07://如果是0xc0蜂鸣器鸣响 } ting();hd=1;break; case 0x08://如果是0xc0蜂鸣器鸣响 tuodi=1;break;} } void chuan()interrupt 4//串口中断服务程序 { } RI=0;//软件清除串口响应 a=SBUF;//读取单片机串口接受的蓝牙模块发送的数据 结论 根据本次设计要求,我们小组系统地阅读了大量的资料,并认真分析了设计课题的需求,还系统学习了51系列单片机的工作原理及其使用方法,并独自设计智能小车的整个项目。 虽然条件艰苦,但经过不懈钻研和努力,购买到了所有所需的元器件,并系统的进行了多项试验,最终做出了整个小车的硬件系统,然后结合课题任务和小车硬件进行了程序的编制,本系统能够基本满足设计要求,能够较快较平稳的是小车沿引导线行驶,但由于经验能力有限,该系统还存在着许多不尽人意的地方有待于进一步的完善与改进。 通过本次课题设计,不仅是对我们课本所学知识的考查,更是对我的自学能力和收集资料能力以及动手能力的考验。本次毕业设计使我们对一个项目的整体设计有了初步认识,还认识了几种传感器,并能独立设计出其接口电路,再有对电路板的制作有了一定的了解,并学会了使用Protel设计电路。本次毕业设计使我们意识到了实验的重要性,在硬件制作和软件调试的过程中,出现了很多问题,最终都是通过实验的方法来解决的。还有以前对程序只是一个很模糊的概念,通过这次的课题设计使我对程序完全有了一个新的认识,并能使用C熟练的进行编程了。通过本次课题设计,极大的锻炼了我们的思考和分析问题的能力,并对单片机有了一个更深的认识。 总之,在课题设计的过程中,无论是对于学习方法还是理论知识,我们都有了新的认识,受益匪浅,这将激励我们在今后再接再厉,不断完善自己的理论知识,提高实践运作能力。 目录 一.学分认定书 …… …………………………………………XX 二.实验报告 …… ………………………………………………XX 三.智能车制作研究报告 ……………………………………… XX 四.心得体会 ………………………………………………… XX 五.附录:程序源代码………………………………………… … XX (要求:给出一级目录,宋体加粗,四号字,1.5倍行距。) 一.学分认定书(每个队员1份)二.实验报告 实验一.通用输入输出口和定时中断 一、实验目的 1.掌握 MC9S12XS128 汇编语言对通用端口的操作指令。2.掌握程序中指令循环和跳转的方法。 3.学会使用程序延时,并会大概估算延迟时间。 二、实验任务 1.将 PORTA 口接八位DIP 开关,PORTB口接七段数码管显示,PORTK控制四个数码管其中某一个显示。 2.采用定时中断方式,利用八位DIP 开关输入二进制数,数码管显示其十进制数。 三、实验内容 实验中每个通用输入输出端口要用到的寄存器都有两个,端口定义寄存器和端口方向寄存器。以 A 端口为例,端口定义寄存器为PORTA和端口方向寄存器为DDRA。在MC9S12XS128的DATASHEET 上可以查到DDRA的地址是0x00(输入), DDRB的地址是0xFF(输出), DDRK的地址是0xFF(输出)。则初始化端口PORTA、PORTB、PORTK的语句为: void initGPIO(void){ DDRA = 0x00;DDRB = 0xFF;DDRK= 0xFF;} 置0 表示该位为接受输入位,置1 表示该位为输出位。 MC9S12DP256/DG128 中可以使用实时时钟或增强型定时器来完成定时功能,二者是相互独立的。本实验中用实时时钟定时。实时时钟的可以通过对外部晶振分频而得到一个定时中断。RTICTL 是实时时钟控制寄存器,向该寄存器写入内容,通过查表会得到一个分频因子,外部晶振除以分频因子就是中断的频率了。因为外部晶振频率是16MHz,要得到1ms中断一次,需要16000分频。在MC9S12XS128的DATASHEET 上可以查到RTICTL设置为0x8F, 中断允许寄存器CRGINT设置为0x80(开中断)。则初始化中断程序为: void InitRTI(void){ RTICTL = 0x8F;CRGINT = 0x80;} 一但进入中断,即开始读PORTA口的二进制数,并转换为十进制,通过PORTB口显示出来。由于是数码管动态显示,PORTK口控制四个数码管轮流显示。具体程序见开发板例程中——SevenSegmentDigitalTube。 四、思考题 1.如果不用PORTA口做输入,直接让单片机内部从0—9999自动计数,并在PORTB口显示出计数过程,PORTK口控制四个数码管轮流显示,程序该如何改? 对程序的修改如下: void interrupt 7 RTI_INT(void){ time++;if(time >=50){ 2 time=0;Count_Num++;LedData[0] = Count_Num/1000%10;LedData[1] = Count_Num/100%10;LedData[2] = Count_Num/10%10;LedData[3] = Count_Num%10;if(Count_Num >=9999){ Count_Num=0;} } PORTK = 0x01 << LedNum;PORTB = LedCode[LedData[LedNum]];LedNum++;if(LedNum >= 4)LedNum = 0;CRGFLG = 0x80;} 这样便可以在数码管中显示动态显示0000—9999,经试验检测该方法正确。 实验二.A/D转换实验 一、实验目的 了解 S12 单片机ADC 模块的使用方法。 二、实验任务 用 S12 的ADC 模块将一路(或多路)模拟电平转换成数字量,并将转换结果显示在数码管上,或者通过SCI 发送到PC 终端显示出来。 三、实验内容 1、与 S12 的ADC 模块相关的寄存器如下,各寄存器的详细定义可参阅datasheet。ATDCTL2:控制寄存器。主要设置A/D 标志位清除方式、A/D 采样触发方式、是否允许A/D 采样完成中断等。 ATDCTL3:控制寄存器。主要设置每次A/D 转换采样几路电平、采样结果的存储方式等。 ATDCTL4:控制寄存器。主要设置A/D 转换精度、A/D 转换时钟频率等。 ATDCTL5:控制寄存器。主要设置A/D 转换结果的对齐方式和数据类型,以及A/D 的采样模式(连续采样/单词采样,顺序转换/单通道转换等) ATDSTAT0:状态标志寄存器。包括A/D 转换完成标志,出错标志、转换结果存储索引等标志位。 ATDTEST1:测试寄存器。 ATDSTAT1:标志寄存器。标识一次A/D 转换中各通道的完成情况。 以上寄存器的具体内容和其他与 ADC 模块相关的寄存器请参看datasheet 相应章节。 2、本实验采取AN14单通道连续AD转换模式,且结果存放在ATD0DR0L中, 转换序列长度为1,转换精度为8位,在freeze模式下继续转换。通过查看datasheet,得出ATD0初始化程序如下:void ATD0_init(void){ ATD0CTL1=0x0e;//转换精度为8位,从AN14通道转换 ATD0CTL2=0x40;//禁止外部触发, 中断禁止 ATD0CTL2_ASCIE = 1;//允许中断 ATD0CTL3=0x88;//转换序列长度为1,在freeze模式下继续转换 ATD0CTL4=0xFF;ATD0CTL5=0x2E;//单通道连续AD转换模式 } 具体程序见开发板例程中——testAN14。 四、预习要求 (1)参考datasheet 明确ADC 各寄存器的作用,主要思考以下问题: 1.A/D 转换的时钟应该是多少?如何设置分频因子? 答:A/D 转换的时钟应该是如下: 其中PRS为ATDCLT4中的后五位。 2.A/D 转换如何启动?有几种启动方式?分别如何设置相关寄存器? 答:可以用ATD0CLT2去给ATD模块上电,有五种上电(触发方式)分别如下:设置ATD0CLT2中的10~12位。第10位为0时忽略外部触发,为1时则使用内部触发。但第十位为1时,前两位为00,01,10,11,分别对应下降沿触发,上升沿触发,低电平触发,高电平触发。3.每次A/D 转换启动那几路电平采样?采样结果如何存储(注意FIFO 的A/D 转换模式)?采样结果的数据类型(8 位/10 位?左对齐/右对齐?有符号数/无符号数?)? 答: 每次启动那一路转化得看ATD0CTL5中的设置。采样结果的储存也是在该寄存器控制的。采样结果的位数也是该寄存器控制。如ATD0CTL5 = 00110000时该结果为左对齐无符号型数据是连续转化,多通道转化。并且从0通道开始转化。4.如何判断A/D 转换是否结束?如何清标志位? 答:从ATD0START1_CCF0 = 0 时转化完成。(2)如何实现多通道转换? 答:ATD0CTL5中的第四位置1。 五、实验现象 开发板通电后,用起子旋转电位器,发现数码管上数字从0—255连续变化。 实验 三、PWM 模块实验 一、实验目的 1. 学习使用 PWM 模块。 2. 用 PWM 实现小型直流电机调速和舵机转向。 二、实验任务 1、使用单片机内部PWM 模块调制产生不同脉宽的方波,实现小型直流电机调 速和舵机转向。 2、将 PORTA 口接八位DIP 开关,PORTB口接七段数码管显示,PORTK控制 四个数码管其中某一个显示,数码管动态显示原理同实验1。拨码开关高两位控 制舵机,当为00,11代表舵机转到正中央,为10,01代表舵机分别左转右转。拨 码开关低六位控制电机,表示PWM占空比。数码管第一位显示舵机控制方向,后 两位显示电机占空比。 三、实验内容 1.PWM 模块共有28 个寄存器,其中8 个为系统保留寄存器,具体介绍如下: PWM 启动寄存器(PWME) 本寄存器的 8 个bits 分别用来开关8 路PWM 的通道。PWM 极性寄存器(PWMPOL) 本寄存器的 8 位bits 分别用来设定8 路PWM 通道输出波形的起点电平。PWM 预分频寄存器(PWMPRCLK) 本寄存器用来设定 ClockA 和ClockB 的预分频因子。ClockA 分频寄存器(PWMSCLA) 本寄存器提供 PWM 模块操作时的几个控制位。PWM 通道周期寄存器(PWMPERx) 此 8 个寄存器分别为8 个通道设定方波的周期。PWM 通道脉宽寄存器(PWMDTYx)此 8 个寄存器分别为8 个通道设定脉宽。PWM初始化程序如下: void initPWM(void){ PWME=0x00;//关闭所有PWM通道 PWMPOL = 0xFF;//PWM极性选择,选择一个周期开始时为高电平 PWMPRCLK = 0x22;//CLOCK A,B时钟分频,均选择从总线四分频 10M PWMSCLA = 5;//CLOCK SA从CLOCK A十分频,1M PWMSCLB = 5;//CLOCK SB从CLOCK B十分频,1M PWMCTL = 0xF0;//01级联,23级联,45级联,67级联 PWMCLK = 0xFF;//PWM始终选择,选择CLOCK SA SB为PWM时钟 PWMPER01=1000;//电机PWM正转频率1k PWMDTY01=0;PWMPER23=1000;PWMDTY23=0;//电机反转频率为1k PWMPER45=20000;//舵机PWM频率为50Hz PWMDTY45=STEER_CENTER;//舵机占空比 PWME_PWME3=1;PWME_PWME1=1;//电机PWM波开始输出 PWME_PWME5=1;//舵机PWM波开始输出 } 参考程序参见实验例程——motorpwm 四、实验现象 拨码开关高两位控制舵机转向,当为00,11舵机在中央,为10,01舵机分别左转右转。拨码开关低六位控制电机,表示PWM占空比。数码管第一位显示舵机控制方向,后两位显示电机占空比。占空比越大,转速越大。 四、电磁组实验——信号处理 一、实验步骤 1、电磁传感器检测到信号 2、单片机处理这些信号——判断是否需要转向、减速 二、实验内容 1、电磁感器检测处理后为一模拟电平,需用到AD 转换程序。将光信号转换为数字量存在单片机中。接下来由单片机处理这些数,判断是否要转向。最简单的两个传感器布局,当导线在传感器中央时,相应的AD数值相同,导线偏向右边的传感器时,右边传感器的值变大,左边传感器值变小。本实验关键在于如何确定导线位置。 2、输入输出口和ATD 的初始化同前面的实验一和实验二,将程序运行后,打 开Data1 窗口,找出AD 转换后的数字值,应该在0-255 之间。将车子的左边电感对准黑色牵引线,观察两个传感器。理论上应该该电感的值最大,调解好放大器的应在160左右记录该数值(159),再将黑线想又移动,发现右边传感器的值逐渐增大,左边传感器的值逐渐减小。黑线一动到右边电感正下方时,将此电感的值调解到160左右,记录该数值(150)。而黑线偏出两个电感的范围时,两个传感器的值同时减小。 正常情况下小车检测中心线程序如下: //计算Line_center 6 if(ad_data[0]+ad_data[1]<100){ Line_center =(int)(ad_data[0])*160/159-(int)(ad_data[1])*160/150;//归一化,差值计算中心线 Get_Line = 1;} else{ Get_Line = 0;} 根据检测到黑线的位置可以判断行车方向。参考程序见电磁基本程序。 三.智能车制作研究报告 1.原理介绍 可以确定电感相对于导线的位置,或者说可以确定导线相对于小车的分布 2.电磁传感器 1首先由LC回路检测磁场○,输出信号Singal1。 2通过放大电路INA128将信号放大 ○ 3通过○获得负电源。 4因为放大后的电路频率依然为20KHz的周期信号,所以我们通过下面电路转换为稳○定输出。 5在起跑线检测上我们用干簧管电路。○6幅值测量 ○可以不使用检波电路,而直接将上述单管放大电路中,三极管集电极电压接入单片机的AD 端口,使用单片机直接采样交变电压信号 只要保证单片机的 AD 采集速率大于20kHz 的5-10 倍,连续采集5-10 个周期的电压信号(大约100 数据左右),就可以直接从采集的数据中最大值减去最小值获得信号的峰峰值。假设采集了128 个数据: , 1,2, ,128 i x i=,计算信号的峰峰值p p V − 可以有下式计算: 上面计算计算方法由于只用应用了数据的最大值、最小值,所得结果容易受 到噪声的影响,所以还可以通过计算数据交流信号的平均值、有效值反映信号的 幅值: 上面所计算得到的 , ave e x x 等都与信号的峰峰值成单调关系,所以也可以用来 进行计算位置差值信号。 7软件设计 ○程序主要用到 S12 芯片中的PWM 模块,TIM 模块、PIT 模块、AD 模块、I/O 模块 以及 SCI 模块等。PWM 模块主要用来控制舵机和电的运转; TIM 模块主要是用在了测速模块,捕捉中断并计算瞬时度。PIT模块用于设置定时中断; AD 模块主要用于读取传感器信息以判断黑线位置; I/O 模块主要是用来读取按键信息和控制数码管显示; SCI 模块只要用在无线串口传送模块。 源码后附 四.心得体会(每个队员都要提交心得体会) 五.附录:程序源代码 #include #include “derivative.h” /* derivative-specific definitions */ /********************************************************************************* * * * * *********************************************************************************/ #define StrCnr 1500 /**********************************/ //初始化锁相环 //将总线频率调整到40M /**********************************/ void InitPLL(void){ CLKSEL=0x00;//禁止锁相环,时钟由外部晶振提供,总线频率=外部晶振/2 PLLCTL_PLLON=1;//打开锁相环 SYNR=0x49;REFDV=0x43;// pllclock=fvco=2*osc*(1+SYNR)/(1+REFDV)=80MHz;POSTDIV = 0x00;_asm(nop);//BUS CLOCK=40M _asm(nop);while(!(CRGFLG_LOCK==1));// 等待锁相环初始化完成 CLKSEL_PLLSEL =1;// 使用锁相环 2012东南大学智能车竞赛电磁组Demo程序 电感信号分别接0,1口 } /**********************************/ //初始化通用IO口 //A口输入B口和K口输出 /**********************************/ void InitGPIO(void){ DDRA = 0x00;//A口输入 DDRB = 0xFF;//B口输出 DDRK = 0xFF;//K口输出 } /**********************************/ //初始化PWM /**********************************/ void InitPWM(void){ PWME=0x00;PWMPOL = 0xFF;PWMPRCLK = 0x22;PWMCLK = 0xFF;PWMSCLA =5;PWMSCLB =5;PWMCTL = 0xF0;PWMCAE=0;PWMPER01=100;PWMDTY01=0;PWMPER23=100;PWMDTY23=0;PWMPER45=20000;PWMDTY45=StrCnr;PWME_PWME3=1;PWME_PWME1=1;PWME_PWME5=1;} /**********************************/ //初始化AD /**********************************/ void InitATD(void){ ATD0CTL0 = 0x0f;ATD0CTL1_SRES = 2;ATD0CTL1_SMP_DIS=1;ATD0CTL2_AFFC = 1;//ATD0CTL2_ASCIE = 1;//10 //关闭所有PWM通道 每位对应一个端口 //PWM极性选择,选择一个周期开始时为高电平//CLOCK A,B时钟频率为10M //选择CLOCK SA SB为PWM时钟 //CLOCK SA频率为1M //CLOCK SB频率为1M //设定PWM通道两两级联使用 //电机正转频率10k //电机反转频率10k //设定舵机控制线的频率为50Hz //设定舵机初始位置 //电机PWM波开始输出 //舵机PWM波开始输出 //多路转换时转换 //转换精度为12位 //中断标志位自动清零 一个序列传唤结束触发中断 //ATD0CTL3 = 0xC0;//结果寄存器对齐方式右对齐(ATD0CTL3_DJM=1),转换序列长度为8(8路),循环转换,freeze模式下继续转换 ATD0CTL3 = 0x80;ATD0CTL4_SMP = 0;// 采样周期为4个周期 ATD0CTL4_PRS = 19;//atdclk=busclk/(2*(19+1))=1M ATD0CTL5_SCAN = 1;//连续转换模式 ATD0CTL5_MULT = 1;//多通道采样 } /**********************************/ //初始化实时中断 /**********************************/ void InitRTI(void){ RTICTL =0x9F;//2ms中断一次 } void main(void){ /* put your own code here */ InitPLL();InitGPIO();InitPWM(); { _FEED_COP();/* feeds the dog */ } /* loop forever */ /* please make sure that you never leave main */ } float StrP=0.1;float StrD=0.01;float StrPCtl;float StrDCtl;float StrCtl; #pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt 7 RTI_INT(void){ DisableInterrupts;11 InitRTI();InitATD();EnableInterrupts;CRGINT_RTIE = 1;for(;;)CRGFLG = 0x80; //可以在此加入合适的数码管显示代码,让其中两位显示左边电感的AD值(显示不下可以显示其中 //部分二进制位),让另外两位显示右边电感的AD值,方便调试。注意需要合适的初始化操作。 StrCtl=(ATD0DR1-ATD0DR0)*StrP;//如果需要更加精确可以使用ATD中断,对这两个值进行取平均值,低通滤波等操作。 /* 如果使用PD控制的伪代码: StrPCtl=(Right-Left)*StrP; StrDCtl=((Right-Left)-LastValueOf(Right-Left))*StrD;StrCtl=StrPCtl+StrDCtl;*/ //对舵机控制输出限幅,避免烧坏舵机 if(StrCtl>1800)StrCtl=1800;else if(StrCtl<1200)StrCtl=1200;PWMDTY45=StrCtl; //请加入合适的速度控制 //如果不确定,可以使用拨码控制速度。这时请注意相关初始化操作 EnableInterrupts;}第五篇:智能车电磁组报告