用C语言设计智能车的方案.docx
《用C语言设计智能车的方案.docx》由会员分享,可在线阅读,更多相关《用C语言设计智能车的方案.docx(16页珍藏版)》请在冰豆网上搜索。
![用C语言设计智能车的方案.docx](https://file1.bdocx.com/fileroot1/2023-1/31/f66fe170-a7f9-4c5e-9c6d-d104073f3ca3/f66fe170-a7f9-4c5e-9c6d-d104073f3ca31.gif)
用C语言设计智能车的方案
用C语言设计智能车的方案
一、需求和设计目标
1、实现电动车的驱动模块功能
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为电机的平均功率,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
#defineucharunsignedchar
#defineuintunsignedint
voidzhu();//主函数
voidzheng();//正向前进函数
voidzuo();//左转函数
voidyou();//右转函数
voidhou();//反向倒退函数
voidting();//停车函数
voiddaoche();//倒车函数
voiddelay(uintk);//延时函数
voidtime();
voidinit_timer();
voidshijian();//时间函数
unsignedinta;
unsignedchary;
unsignedcharc;
unsignedcharv;
unsignedcharr;
charDATA_7SEG[10]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,};
ucharsec=0;
uchardeda=0;
bitd_05s=0;
voiddelay(uintk);
voidconv();
voiddisp();
voidmain()
{
init_timer();
zhu();//主函数
}
voidzhu()//主函数
{
unsignedcharz;
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)interrupt1
{
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(uintk)//延时函数
{
uinti,j;
for(i=0;ifor(j=0;j<121;j++)
{;}}
}