武汉科技大学2024级智能汽车设计及制作论文

来源:网络收集 时间:2025-04-26 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xuecool-com或QQ:370150219 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

二○一三~二○一四学年第 一 学期

信息科学与工程学院

自动化系

课程设计计划书

班 级: 自动化1106 课程名称: 智能汽车课程设计 指导教师: 章政 学生备注: 学 号:

二○一三 年 1 月 6 日

基于红外寻迹型智能汽车设计与制作

为了方便智能汽车的结构设计,在设计的初期我们就打算采取模块化的设计原理,对智能汽车实行模块化的设计。这样不仅提高了设计的工作效率,电路的是实现也很容易,模块与模块之间只要实行简单的接口对接技术就可以了。如果出现了故障,更换模块也很方便。

论文以智能汽车的设计与制作的实现流程进行模块化的介绍: 第一节:制作技术的整体方案; 第二节:设计的思路; 1.硬件设计与实现

2.软件设计与实现

第三节:制作模块调试过程; 第四节:总结与回顾

制作技术的整体方案

全国大学生“飞思卡尔”杯智能汽车竞赛是在规定的模型汽车平台上,使用飞思卡尔半导体公司的8位、16位微控制器作为核心控制模块,通过增加道路传感器、电机驱动电路以及编写相应软件,制作一个能够自主识别道路的模型汽车,按照规定路线行进,以完成时间最短者为优胜。制作智能汽车所涉及的专业知识包括控制、模式识别、传感技术、汽车电子、电气、计算机、机械等多个学科,对大学生的知识融合和实践动手能力的培养,对汽车电子技术的发展,具有良好的长期的推动作用。 在实现智能车的过程中我们采用了各种的方案比对,对所有电路进行模块化接口化处理,大大降低了电路在实现过程中出现的错误,分为:电源接口模块,传感器模块,测速模块,电机驱动模块,数据传输与上位机模块等。然后通过接口连接在一起,实现工作稳定的智能车硬件电路。他使用了传感器,编码电机,无线模块,稳压管等作为重要的任务器件。实现了赛道识别,速度测控,赛车数据传输,电源稳压,速度控制等功能。

关键字 智能车,传感器,稳压电路,PCB设计

2通道遥控赛车车模结构

设计思路

硬件: 1、前后轮

2、舵机:舵机主要用来调节转向来达到控制车速和车身平稳。

舵机简介?舵机内部结构–舵盘、齿轮组、位置反馈电位计、直流电机、控制电路板,等。?工作原理–脉宽信号给定参考位置,舵机内部电路通过反馈控制调节舵盘角位。–舵盘角位由PWM控制信号的脉宽决定。

舵机控制方法?三线连接方式–红线:电源线+6V–蓝线:地线–黑线:PWM控制信号

3、测速码盘

速度检测部分硬件

4、传感器支架

第二步:

1.最小系统是焊接的第一个步骤,主要包括晶振(下)和复位电路(上)。

2.红外传感器:光电传感器一般有两个部分组成:发射管和接收管。发射管发射光线,光线经过赛道的反射,由接收管接受,用过不同的光强接收管的状态不同,实施赛道信息的采集,应为白色和黑色对于光线反射的系数不同,放射会傀儡的光线的强度不一样,被不同的接收单元接收后表现出不同的反应状态(电阻的变化,电流电压的变化等)

3.电源:为了使智能汽车的系统正常的工作,需要对电源电池电压进行调节,其中单片机的路径识别传感器,测速模块需要5V的电压,用LM7805组成5V稳压电路。直流电机作在7.2V直接上电。因为电机,舵机要频繁接加速减速,所以电压波动较大,5V电压还要给51单片机供电,防止意外功能给点不足重启再LM7805两端加上大电解电容。

4.舵机:

5电机驱动模块:电机驱动使用专用电机的驱动芯片ULN2803,系统利用单片机的PWM控制电机转速,充分利用PWM模块资源。电机PWM的频率8KHz。

6.指示灯拨码调试:

S12系列单片机时钟部分设计

软件:

程序的实现:

功能实现的程序与注释:

//晶振 24MHz 6T模式,总线频率4MHz 指令0.25us

#include //89C52的头文件 #define uchar unsigned char //宏定义 #define uint unsigned int

#define T0_HIGH 0xff //T0计时器寄存器初值

#define T0_LOW 0xaf //溢出计数80个,定时周期80*0.25us=20us

//为了保证主程序正常运行,定时器计数最好不要小于80个

#define MOTOR_MAX_PWM_COUNT 100 //PWM计数器最大值 20us*100=2000us,500Hz #define SERVO_MAX_PWM_COUNT 1000//20us*1000=20ms,50HZ//舵机控制高电平0.5~2.5ms对应PWM的25~125

//舵机控制频率在50~100Hz之间,这里选50Hz

#define MOTOR_MAX_PWM 100 //电机PWM最大最小值 #define MOTOR_MIN_PWM 0 //

#define SERVO_LEFT_MAX_PWM 50 //min 48 //舵机左打最大角度时的PWM #define SERVO_RIGHT_MAX_PWM 84 //max 84 //这个值需要自己根据舵机实

际角度调试

#define SERVO_MID_PWM 67 //舵机中心值

//注意,舵机打角过大会打在底盘上,请立即断电,以免损害舵机

#define ERROR_HISTORY_NUM 3 //历史偏差记录个数 #define MAX_ERROR_SUM 120 //积分幅值

sbit LEFT_MOTOR_PWM_PORT=P3^7; // 电机PWM控制端口 sbit RIGHT_MOTOR_PWM_PORT=P3^6;

sbit SERVO_PWM_PORT=P3^5; //舵机PWM控制端口

sbit BOMA1=P1^0; //拨码开关输入端口 sbit BOMA2=P1^1; sbit BOMA3=P1^2; sbit BOMA4=P1^3; sbit BOMA5=P1^4; sbit BOMA6=P1^5; sbit BOMA7=P1^6; sbit BOMA8=P1^7;

//--------------------------

bit control_period_finished=0;//控制周期结束标志位,控制周期选择20ms

//也可自己确定控制周期,但是要保证主程序在控制周期内可以运行完

char motor_PWM_counter=0;//生成电机PWM的计数器

char left_motor_PWM=0; //左右电机的PWM //由于数值在128以内,所以定义为char char right_motor_PWM=0;

int servo_PWM_counter=0;//生成舵机PWM的计数器

char servo_PWM=0;//舵机PWM //由于数值在128以内,所以定义为char

//注意数据类型的选择,如果实际的值大于128,就不能使用char型

int error=0; //本次偏差

int error_history[ERROR_HISTORY_NUM]={0}; //小车相对于黑线的偏差 int error_sum=0; //偏差的积分

int servo_P=10; //PID系数 int servo_I=2; int servo_D=25;

int PID_out=0; //PID输出

char speed_expect=40; //给定速度

//-----------------------------------------------------------------------

void delay(unsigned int i)//延时函数 {

unsigned char j; for(;i>0;i--)

for(j=0;j<250;j++); }

//-----------------------------------------------------------------------

int ABS(int i) //绝对值函数 {

if (i>=0) return i; else return -i; }

//----------------------------------------------------------------------- void sys_init(void) {

//------IO口设置------------

P0=0xff; //指示灯,共阳极,设置为高电平,全灭 P1=0xff; //拨码开关,设置为高电平,检测输入

P2=0xff; //红外管状态输入,设置为高电平,检测输入

P3=0x00; //PWM输出口,需要外加上拉电阻,否则无法驱动

LEFT_MOTOR_PWM_PORT=0; //PWM口设为低电平,电机不转 RIGHT_MOTOR_PWM_PORT=0;

left_motor_PWM=0; //占空比设置为0 right_motor_PWM=0;

servo_PWM=SERVO_MID_PWM;//舵机打角到中心 //------定时器设置------------

TMOD=0x11; //定时器0方式1 TH0=T0_HIGH; //定时器赋初值 TL0=T0_LOW ;

TR0=1; //定时器运行 ET0=1; //开定时器中断 EA=1; //开总中断 }

//-------------------------------------------------------------

----------

void BOMA_chioce(void) //拨码开关调节参数 //使用51单片机IO口需要初始化为高电平

{

if(BOMA1==0){ servo_P=servo_P+5; } if(BOMA2==0){ servo_P=servo_P+5; } if(BOMA3==0){ servo_P=servo_P+10; }

if(BOMA4==0){ servo_D=servo_D+5; } if(BOMA5==0){ servo_D=servo_D+5; } if(BOMA6==0){ servo_D=servo_D+10; }

if(BOMA7==0){ speed_expect=speed_expect+20; } if(BOMA8==0){ speed_expect=speed_expect+30; } }

//-----------------------------------------------------------------------

void get_black_position(void) //寻找黑线位置 {

switch(P2 & 0x7f) //使用了7个红外管,屏蔽无用的一位,根据硬件电路设计编写 { //case表示红外管的状态,最多会有两个红外管在黑线上(根据硬件红外管焊接的距离而定,黑线宽度2.5cm)

case 0x01: error=6; break; //00000001 0x01 //右 case 0x03: error=5; break; //00000011 0x03 case 0x02: error=4; break; //00000010 0x02 case 0x06: error=3; break; //00000110 0x06 case 0x04: error=2; break; //00000100 0x04 case 0x0c: error=1; break; //00001100 0x0c

case 0x08: error=0; break; //00001000 0x08

case 0x18: error=-1; break; //00011000 0x18 case 0x10: error=-2; break; //00010000 0x10 case 0x30: error=-3; break; //00110000 0x30 case 0x20: error=-4; break; //00100000 0x20 case 0x60: error=-5; break; //01100000 0x60

case 0x40: error=-6; break; //01000000 0x40 //左

case 0x00: error=error_history[ERROR_HISTORY_NUM-1]; break; //00000000 0x00

default: error=error_history[ERROR_HISTORY_NUM-1]; break; //其他情况时,保持上一次偏差 }

}

//-----------------------------------------------------------------------

void servo_control(void) //舵机控制 {

char i=0;

if(ABS(error-error_history[ERROR_HISTORY_NUM-1])>7)//如果两次的偏差过大,则保持上一次的偏差

error=error_history[ERROR_HISTORY_NUM-1]; //防止不确定情况(如红外管冲出跑道)造成的偏差跳变

if(error/error_history[ERROR_HISTORY_NUM-1]<0) //如果黑线从左边到右边或者从右边到左边, {

error_sum=0;//则将历史积分清零,提高响应速度 } else {

error_sum=error_sum+error; //积分

if(error_sum>MAX_ERROR_SUM) //限幅,防止积分越积越大 error_sum=MAX_ERROR_SUM; if(error_sum<-MAX_ERROR_SUM) error_sum=-MAX_ERROR_SUM; }

//根据偏差计算舵机角度输出

PID_out = ( servo_P*error_history[2] //比例 + servo_I*error_sum/10 //积分

+ servo_D*(error_history[2]-error_history[1])//微分 )/10; //这里使用乘以一个大的系数再除以一个数的方法

//将小数计算转换成整数计算,如*0.1可转换为*10/100。以减轻单片机的负担

servo_PWM = SERVO_MID_PWM + PID_out; //控制舵机

if(servo_PWM

servo_PWM=SERVO_LEFT_MAX_PWM; //防止超过极限值 if(servo_PWM>SERVO_RIGHT_MAX_PWM)

servo_PWM=SERVO_RIGHT_MAX_PWM;

for(i=0;i

error_history[i]=error_history[i+1]; }

error_history[ERROR_HISTORY_NUM-1]=error;

//servo_PWM=SERVO_MID_PWM;//舵机打角到中心

//调试舵机时可以用这个语句观察舵机角度,更改SERVO_MID_PWM的值即可 }

//-----------------------------------------------------------------------

void motor_control(void) //电机控制 {

left_motor_PWM=speed_expect; //速度控制

right_motor_PWM=speed_expect; //可以直接给定,也可以根据赛道情况计算得出

if(left_motor_PWM>MOTOR_MAX_PWM) //限幅 left_motor_PWM=MOTOR_MAX_PWM; if(left_motor_PWM

if(right_motor_PWM>MOTOR_MAX_PWM) right_motor_PWM=MOTOR_MAX_PWM; if(right_motor_PWM

//----------------------------------------------------------------------- void main(void) {

sys_init(); //初始化

BOMA_chioce(); //拨码开关扫描

delay(1500); //开机延时,调试时可以去掉

while(1)

{

get_black_position(); //判断黑线位置 motor_control(); //控制舵机 servo_control(); //控制电机

P0 = P2;//led灯显示状态

while(control_period_finished==0); //等待控制周期20ms到达,保证每次控制的时间间隔都相同

control_period_finished=0; //标志位清零 } }

//-----------------------------------------------------------------------

void TIME_BASE(void) interrupt 1 using 1 //定时器生成PWM //不清楚的可以参考PWM的定义 {

TH0=T0_HIGH; //赋初值 TL0=T0_LOW ;

motor_PWM_counter++; //计数器+1 ,每+1表示20us servo_PWM_counter++;

if(motor_PWM_counter>MOTOR_MAX_PWM_COUNT) //PWM比较、生成 {

motor_PWM_counter=1; //从1开始计数 }

if(servo_PWM_counter>SERVO_MAX_PWM_COUNT) //PWM比较、生成 {

servo_PWM_counter=1; //从1开始计数

control_period_finished=1; //20ms控制周期到达,标志位置1,这里借用了舵机控制周期20ms(50Hz),

//如果更改主程序控制周期,可定义一个类似于servo_PWM_counter的计数器计时 }

if(left_motor_PWM>=motor_PWM_counter) //左右PWM LEFT_MOTOR_PWM_PORT=1; //端口输出高电平 else

LEFT_MOTOR_PWM_PORT=0; //端口输出低电平

if(right_motor_PWM>=motor_PWM_counter) RIGHT_MOTOR_PWM_PORT=1; else

RIGHT_MOTOR_PWM_PORT=0;

if(servo_PWM>=servo_PWM_counter)//舵机PWM SERVO_PWM_PORT=1; else

SERVO_PWM_PORT=0; }

调试:在烧制程序后不是开始直接上赛道,而是分块的开始调试个个模块的功能,基本功

能是否可以实现,检查硬件的焊接,接口的连接,在保证个个模块的基本性能是好的以后再开始满足测速和平稳性。改变算法或则改变机械组装的方式达到改善性能的目的。总之,小小的只智能汽车会有很多问题的出现,通过不断地调试次啊能不断地的调试方法不能一举。

结束语:信息融合技术给智能汽车带来了更加光明的前景,信息融合技术使得车辆能够利

用多传感器集成技术以及融合技术,结合环境信息、交通状况信息做出一个最优决策,实现车辆自动感知前方的障碍物,及时采取措施进行避让;通过对前方信号的识别,自动停车或继续运行;通过对路标的自动识别,避免违章行为等,从而可以大大降低车辆事故的发生,同时减轻司机驾驶的负担,尽量降低司机疲劳驾驶的可能性。但需说明,车辆的智能化功能包括很多方面,而本文仅仅阐述了基于信息融合技术在实现智能车系统的应用领域,也仅仅介绍了与信息融合技术相关的车辆智能化功能模块,并就相关融合方法的引入做了简单描述。 尽管车载信息技术的发展前景非常广阔,但要将它们彼此无缝地链接还有一些技术问题有待解决,如软件和硬件技术方面还需实现技术的飞跃,多媒体的接口问题,电子设备的物理连接,改进无线电通讯系统,解决无线电通讯的带宽问题,以及开发价格相对合理的软件技术等。另外,为了实现彼此设备的兼容,还要制定统一的工业标准。虽然技术的障碍还不少,但攻克这些难关的日子已经指日可待。

百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库武汉科技大学2024级智能汽车设计及制作论文在线全文阅读。

武汉科技大学2024级智能汽车设计及制作论文.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.70edu.com/wenku/201591.html(转载请注明文章来源)
Copyright © 2020-2025 70教育网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:370150219 邮箱:370150219@qq.com
苏ICP备16052595号-17
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:7 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219