二○一三~二○一四学年第 一 学期
信息科学与工程学院
自动化系
课程设计计划书
班 级: 自动化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
#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; } 调试:在烧制程序后不是开始直接上赛道,而是分块的开始调试个个模块的功能,基本功 能是否可以实现,检查硬件的焊接,接口的连接,在保证个个模块的基本性能是好的以后再开始满足测速和平稳性。改变算法或则改变机械组装的方式达到改善性能的目的。总之,小小的只智能汽车会有很多问题的出现,通过不断地调试次啊能不断地的调试方法不能一举。 结束语:信息融合技术给智能汽车带来了更加光明的前景,信息融合技术使得车辆能够利 用多传感器集成技术以及融合技术,结合环境信息、交通状况信息做出一个最优决策,实现车辆自动感知前方的障碍物,及时采取措施进行避让;通过对前方信号的识别,自动停车或继续运行;通过对路标的自动识别,避免违章行为等,从而可以大大降低车辆事故的发生,同时减轻司机驾驶的负担,尽量降低司机疲劳驾驶的可能性。但需说明,车辆的智能化功能包括很多方面,而本文仅仅阐述了基于信息融合技术在实现智能车系统的应用领域,也仅仅介绍了与信息融合技术相关的车辆智能化功能模块,并就相关融合方法的引入做了简单描述。 尽管车载信息技术的发展前景非常广阔,但要将它们彼此无缝地链接还有一些技术问题有待解决,如软件和硬件技术方面还需实现技术的飞跃,多媒体的接口问题,电子设备的物理连接,改进无线电通讯系统,解决无线电通讯的带宽问题,以及开发价格相对合理的软件技术等。另外,为了实现彼此设备的兼容,还要制定统一的工业标准。虽然技术的障碍还不少,但攻克这些难关的日子已经指日可待。