肁用C语言设计智能车的方案
荿一、需求与设计目标
1、
2、蒅实现电动车的驱动模块功能
莄2、实现传感器模块控制电动车的基本驱动功能
膁3、实现显示模块功能
螀4、实现语音控制模块功能
膇5、合理设计实现电路,外观、布局、布线美观
膃二、车体硬件功能设计方案
芁1、成品电动车的外观改造
膁2、电动车驱动模块设计
蚅3、传感器控制模块设计
膆4、显示模块设计
莀5、中心控制电路模块设计
芈6、语音识别控制模块设计(备选功能)
莇三、车体硬件功能实施方案
羅1、车体介绍
莀供电:电池(四节AA)
虿工作电压:直流4-6V
聿工作电流:200mA
蚄小车驱动结构:双侧履带驱动
蒀2、行走原理
肀直行:两侧履带同时前进
蒇后退:两侧履带同时后退
蒃左转:右侧履带前进,左侧履带后退
薀右转:左侧履带前进,右侧履带后退
蒁3、系统方案选择与论证
艿(1)电机的选择
蒆方案一:采用步进电机控制。步进电机的优点是步数可以精确控制;缺点
是步进电机低转速时会产生振动,振动幅度过大则会影响车体的平衡,因此不适
于此题过跷跷板的要求。
蚀方案二:采用左右双直流驱动电机控制。直流电机的优点是具有优良的调
速特性,带负载能力强,便于电动车在有限的场地内灵活运动。
薈考虑到用左右电机的转速差来控制电动车转向比步进电机有较大的优势且
电路相对简单方便控制,本设计采用了方案二。
蚆(2)单片机的选择
芅方案一:采用可编程逻辑器件CPLD。这种器件的功能强大,运算速度快、
集成度高,但是其价格相对比较昂贵。因此这种器件比较适用于较高级和传感器
数量非常多的设计中。
螀方案二:采用单片机。单片机已经发展了30多年,其技术已非常成熟,应
用也非常广泛,从高端的嵌入式系统到我们生活中的日常家电都有它的身影。众
所周知,单片机本身就是一个计算机系统,这对于实现本设计的各项功能都十分
方便,并且其价格与CPLD相比要便宜许多,有很高的性价比。
羈这两种方式各有特点,在目前的相关研究中都有广泛应用。鉴于电动车过
跷跷板所实现的功能有限,规模较小,考虑到端口数量、所需的存储器的容量、
成本等因素后,决定采用单片机作为本次设计的控制系统核心部件。
莈最后选择了Atmel公司开发的AT89C51型单片机作为主控元件,AT89C51有32个可编程I/O口,有四个I/O口P0~P3,其中P0~P2为普通I/O口,而P3口有其他功能,如外部中断(INT0,INT1)、记数(T0,T1)。AT89C51外型及引脚如图F-1所示。
肃
肄
荿(3)显示系统
袆方案一:采用LCD液晶显示器。从显示信息的容量来看比较理想,但是价格比较昂贵,大量的显示数据也不符合本设计的智能移动机器人的情况。
肆方案二:采用LED数码管显示器。LED数码管亮度高、醒目,且性价比很好。
膄基于上述讨论,我们采用了方案二。
螀4、系统的设计与实现
薈
袅图F-2系统硬件结构框图
芄
膁系统可分为三大部分,即信号检测部分(传感器电路),控制部分(控制电
路)和执行部分(电机驱动电路)。其中信号检测部分通过传感器检测黑色轨迹,
并将信号传回控制器处理。控制部分的作用是接收并处理输入的控制信息以及检
测信号,通过控制电机来改变电动车的行进方向和速度,并将电动车行使所用的
时间实时显示出来。
肆本设计基于单片机及传感器,完成了一个电动车跷跷板的制作。
蚄(1)使用单片机AT89C51作为系统控制核心,实现对电动车的智能控制。
莃(2)采用直流电机作为驱动。
莈(3)为了检测路面黑线,在车底安装了一组三个反射式光电传感器,在车
尾安装了一个。利用该模块探测路面黑线的原理是:光线照射到路面并反射,根
据黑线和白纸的反射系数不同,通过以光电传感器为核心的光电检测电路将路面
两种颜色进行区分,转化为不同电平信号,将此电平信号传送至单片机,由单片
机控制转向电机作相应的转向,保证电动车沿引导线行驶。
螈电动车工作在光源较充足的环境时,光电传感器就会受到很大影响,导致系统误动作,无法正常工作。为了减少环境干扰,应在光电传感器的发射管和接收管周围用黑胶布裹上,避免光照,而且应尽量让系统工作在光线较弱的场合。
莃(4)通过LED数码管显示器分阶段实时显示电动车行使所用的时间。
蒃经试验测试表明,该系统各项功能都已满足题目的要求。
蝿从总的方面来考虑,传感器的使用数量应该尽量减少单片机的信号处理量,但是又必须能使电动车行使自如。控制电路要根据选用的电机和传感器来设计,主要考虑稳定性和抗干扰性。
膆四、理论分析与计算
蒆1、测量与控制方法
薃(1)传感器寻迹测量
膀根据实际情况,选择在电动车底部安装三个反射式光电传感器。分别将两个传感器对称置于电动车前端轴线的两侧,再将一个传感器安装在电动车前端轴线上,即前两个传感器的中间位置,这样,中间传感器将始终检测到黑线。如果除中传感器之外,左、右传感器中的任意一个检测到黑线,则该传感器将输出“有线”信号,根据信号来驱动电机改变电动车的运行方向,以次来达到校正行进方向的目的。
袈(2)LED数码管显示控制
膅显示部分的电路如图F-3所示。
薃
薁图F-3共阴极数码管动态现实电路
莅
羄2、理论计算
蚃(1)电动机PWM驱动模块的电路设计与实现
蚇由四个大功率晶体管组成的H桥电路组成,四个晶体管分为两组,交替导
通和截止,由于电机平均功率满足如下关系
| P | | 1 | AT | P | dt | | AP |
肇 | | | T | 0 | max | | | max |
螂其中P为电机的平均功率,Pmax为电机全速运转的功率。A为脉宽,可见,
电机的平均功率与脉宽成正比。
螃电动车行使后其平均功率:P=fv
肈则APmax=Af=fv
薅式中v=Avmax
螅所以电动车的速度与脉宽成正比。单片机发出脉冲信号的宽度即可决定
PWM放大器输出的电压平均值的大小。
袃(2)跷跷板的处理
葿根据题目的要求,我们选择了三合板加木梁的结构作为跷跷板。为了增大
磨擦力,防止电动车行进时打滑,还在上面铺了一层素描纸。
芇为使电动车能够自动驶上跷跷板,我们在1cm厚的板的两端,以距离地面
5度倾角的位置锯掉些木板,使跷跷板任一端落地时可以与地面很好地贴合。另
外,在保证跷跷板中心轴两端与支架圆滑接触、灵活转动的前提下,我们在支架
底座钉上了防滑橡胶垫来加大与地面的摩擦力,增强了跷跷板的稳定性。
薄(3)角度传感器测试角度的计算
羃
袀
蚅根据题目给出的示意图及相关数据,可得到跷跷板半径AC长为800mm,又因为跷跷板中心点C距离地面的高度CD长为70mm,所以计算出直角三角形ADC中角β的度数约为[arcsin(70/800)]5°,即角度传感器的测试调整角度。
芃3、电路设计
肂(1)总体电路图
芁本系统采用单片机作为控制核心,对控制信号和传感器送来的信号进行分析处理,然后电动车沿指定黑线运动,并通过LED显示器显示电动车行驶所用的时间。详细电路图如图F-4所示。
蒇
莆图F-4总体电路图
膂
蒈(2)检测与驱动电路设计
腿直流电机驱动电路使用最广泛的就是H型全桥式电路,这种驱动电路可以
很方便实现直流电机的四象限运行,分别对应正转、正转制动、反转、反转制动。
桥式电路以及电机原理图如图F-5所示。
肅考虑到电机启动和制动时较大的电流会造成电源电压不稳定,从而出现电
磁兼容性(EMC)问题,对单片机和传感器的工作产生干扰,所以,在单片机
与电机驱动电路之间采用光耦隔离的措施来解决电磁兼容性问题。光耦的电路连
接图如图F-6所示。
膂
衿图F-5 桥式电路以及电机原理图
薇
图F-64N25的连接示意图
袄这极大地减小了系统可能受到的电磁干扰,为控制电路的可靠性及安全性提供了保证。两路电机的驱动电路图如图F-7 所示。
节
芀图F-7电机驱动部分电路图
芈
蚃五、模块报价清单和工具清单
莂(1)模块报价
蚀1、车体及改造费(150元)
螆2、核心控制模块(50元)
蚅3、驱动电路模块(50元)
蒂4、显示模块(30元)
螇5、传感器模块(300元)
蒈6、语音备选模块(待议)
蒄7、消耗性材料(焊锡、导线等,100元)
薂合计:680元
膈(2)设备与工具
羆1、电脑(1台,有c语言编程软件)
膃2、单片机试验箱(1部,5000-7000元,此设备借用,须经校方同意)
蚂3、烧录机(1台,700-1500元)
蕿4、焊接工具及材料(1套,包括电烙铁、螺丝刀、电钻、吸锡器、尖嘴嵌、拨
线嵌、锉刀、剪刀等,500元,此设备借用,须经校方同意)
蚈
芆软件设计
螁#include<reg51.h>
羀#defineuchar unsigned char
肆#defineuint unsigned int
肅voidzhu(); //主函数
螁voidzheng(); //正向前进函数
莁voidzuo(); //左转函数
袈voidyou(); //右转函数
螄voidhou(); //反向倒退函数
袁voidting(); //停车函数
蒈voiddaoche(); //倒车函数
芆voiddelay(uint k); //延时函数
薃voidtime();
羁voidinit_timer();
罿voidshijian(); //时间函数
羇unsignedint a;
薆unsignedchar y;
肁unsignedchar c;
荿unsignedchar v;
蒅unsignedchar r;
莄charDATA_7SEG[10]={0x3f,0x06,0x5b,0x4f,0x66,
膁 0x6d,0x7d,0x07,0x7f,0x6f,};
螀ucharsec=0;
膇uchardeda=0;
膃bitd_05s=0;
芁voiddelay(uint k);
膁voidconv();
蚅voiddisp();
膆voidmain()
莀{
芈init_timer();
莇zhu();//主函数
羅}
莀voidzhu() //主函数
虿 {
聿 unsignedchar z;
蚄 P3=0xff;
蒀 while(1)
肀 {
蒇 z=(P3&0x07);
蒃 if((z&0x01)==0x01)
薀 {
蒁 zheng();//正向前进函数
艿 }
蒆 elseif((z&0x02)==0x02)
蚀 {
薈 zuo();//左转函数
蚆 }
芅 elseif((z&0x04)==0x04)
螀 {
羈 you();//右转函数
莈 }
肃 else
肄 {
荿 gensui();//正向跟随函数
袆
肆 | } | } |
膄 |
螀 }
薈voidzheng() //正向前进函数
袅{
芄P1=0x05;
膁for(a=0;a<23;a++)
肆{
蚄time();
莃}
莈P1=0x00;
螈for(a=0;a<12;a++)
莃{
蒃time();
蝿}
膆return;
蒆}
薃voidzuo() //左转函数
膀{
袈P1=0x04;
膅for(a=0;a<23;a++)
薃{
薁time();
莅}
羄P1=0x00;
蚃for(a=0;a<12;a++)
蚇{
肇time();
螂}
螃return;
肈}
薅voidyou() //右转函数
螅{
袃P1=0x01;
葿for(a=0;a<23;a++)
芇{
薄time();
羃}
袀P1=0x00;
蚅for(a=0;a<12;a++)
芃{
肂time();
芁}
蒇return;
莆}
膂voidhou() //反向倒退函数
蒈{
腿P1=0x0a;
肅delay(150);
膂P1=0x00;
衿P2=0xff;
薇sec=0;
袄init_timer();
节for(a=0;a<1000;a++)
芀{
芈time();
蚃}
莂sec=0;
蚀P2=0xff;
螆P3=0xff;
蚅while(1)
蒂{
螇 r=(P3&0x0f);
蒈 if((r&0x01)==0x01)
蒄 {
薂 daoche();//倒车函数
膈 }
羆 else
膃 {
蚂 P1=0x0a;
蕿 for(a=0;a<23;a++)
蚈 {
芆 time();
螁 }
羀 P1=0x00;
肆 for(a=0;a<12;a++)
肅 {
螁 time();
莁 }
袈 }
螄}
袁}
蒈
芆voidting() //停车函数
薃{
羁while(1)
膆{
膅P1=0x00;
螃P2=0x00;
艿}
薇}
蚃voiddaoche() //倒车函数
薂{
荿 P3=0xff;
羈 while(1)
莅 {
莁 v=(P3&0x0f);
蒈 if((v&0x0fe)==0x0e)
荿 {
袃 P1=0x05;
莄 delay(150);
薈 ting();//停车函数
蒆 }
薅 elseif((v&0x08)==0x08)
膃 {
薈 P1=0x0a;
袇 for(a=0;a<23;a++)
芇 {
袂 time();
蚈 }
芈 P1=0x00;
蚅 for(a=0;a<12;a++)
蚁 {
螈 time();
虿 }
蒆 }
蚃 elseif((v&0x02)==0x02)
袈 {
螅 P1=0x08;
袄 for(a=0;a<23;a++)
蒂 {
羈 time();
膆 }
薆 P1=0x00;
芁 for(a=0;a<12;a++)
节 {
薇 time();
肄 }
芄 }
莁 elseif((v&0x04)==0x04)
羈 | } | { | P1=0x02; |
螆 | |||
肃 | } | ||
for(a=0;a<23;a++) | |||
蒁 | { | ||
荿 | time(); | ||
芄 | } | ||
袂 | P1=0x00; | ||
薁 | for(a=0;a<12;a++) | ||
薆 | { | ||
羆 | time(); | ||
薁 | } | ||
蚁 | |||
羇 | |||
莃 | |||
} |
蚄
螁voidinit_timer()
莈{
肅TMOD=0x01;
莂TH0=-(2400/256);
袁TL0=-(2400%256);
螈IE=0x82;
薃TR0=1;
膁 }
袁
袅voidT0_srv(void) interrupt 1
芅{
羀TH0=-(2400/256);
羁TL0=-(2400%256);
芆deda++;
螃}
羃
肀
蚇voidconv()
蒅{
螂if(deda<=100)d_05s=0;
膀 elsed_05s=1;
肈if(deda>=200){sec++;deda=0;}
袃if(sec==60){sec=0;}
蒁}
芀
葿
蚅
薄voiddisp()
莀{
蚆P0=DATA_7SEG[sec/10];P2=0xfd;delay(1);
莇P0=DATA_7SEG[sec%10];P2=0xfe;delay(1);
芃}
莀
肇voidshijian() //时间函数
螄{
肁 init_timer();
蒀 while(1)
蒇{
薆time();
袀}
薀}
袈
羄
袃voidtime()
蚀{
羅conv();
蚆disp();
蚂}
蝿
莆
膄voiddelay(uint k) //延时函数
蒁{
衿uinti,j;
螇for(i=0;i<k;i++){
袆for(j=0;j<121;j++)
蒄{;}}
罿}
以下无正文
仅供个人用于学习、研究;不得用于商业用途。
Forpersonal use only in study and research; not for commercial use.
仅供个人用于学习、研究;不得用于商业用途。
Nurfür den persönlichen für Studien, Forschung, zu kommerziellenZwecken verwendet werden.
Pourl 'étude et la recherche uniquement à des fins personnelles; pas àdes fins commerciales.
仅供个人用于学习、研究;不得用于商业用途。
толькодля людей, которые используются дляобучения, исследований и не должныиспользоваться
вкоммерческих целях.