1、摘要:本智能车系统设计以瑞萨公司开发的H8-3048为主控制器,通过红外线传感器检测小车的位置和运动方向,光电编码器检测模型车的速度。PID控制算法调节驱动电机的转速和舵机的方向,完成对模型车运动速度和运动方向的闭环控制。实验结果表明,系统设计方案可行。关键词:H8-3048;红外线传感器; PID;ABSTRACT: The design of the intelligent vehicle system with the key controler H8-3048 which was developped by Renesas Corporation,to regonize the veh
2、icles location and movement direction by an array of infrared sensors,and to direct the vehicles speed by the optical encoders.The PID algorithm are utilezed to regulate the speed of the motor-drive and the direction of the servomotor,to Complete the closed-loop control of the model vehicles speed a
3、nd direction.The experimental results show that the system design program is feasible.KEY WORDS H8-3048;Infrared sensors;PID;目录1.前言11.1设计制作思路11.2设计方案概述32.硬件部分52.1车模组装52.2传感器的设计与安装52.2.1光电传感器的选择及工作原理52.2.2光电传感器的布置方案62.2.3光电传感器信号探测及处理电路72.2.4速度传感器的安装72.3系统电路板的设计、安装与连接82.4驱动电机和舵机82.4.1工作原理82.4.2电路设计92.
4、5主要车模参数113.软件部分123.1控制算法123.1.1算法介绍123.1.2程序实现154.结论154.1主要性能164.2改进方向16致谢16参考文献17附录:程序源代码II1.前 言 随着人们生活水平的提高,人们对智能控制的需求与日俱增。智能控制五花八门,从工业控制到日常生活的边边角角都有智能控制的身影。目前,随着人们拥有轿车数量的提升,人们对轿车安全性的要求将会日益提高,轿车的智能控制系统将作为轿车安全性的重要组成部分。而对于智能车控制系统的开发还处于研究阶段,因此,基于PID闭环控制的智能车反馈系统研究与设计,具有十分重要的现实意义和应用价值。目前大批的仪表与过程工程师们都熟悉
5、PID控制,而且已经建立了一套很好的安装、整定和使用PID控制器的方法。尽管这样,发展PID控制仍然有很大的潜力,这是因为许多控制器在实际中都处在手动状态,而那些处在自动状态的控制器由于微分作用不好调整往往把微分环节去掉。PID控制器在实际中性能欠佳的主要原因一是阀门和传感器的设备问题,另外就是较差的整定实践。提高控制回路的性能,不仅需要PID控制的知识,而且需要过程方面的知识。PID参数的整定一般需要经验丰富的工程技术人员来完成,既耗时又耗力,加之实际系统千差万别,又有滞后、非线性等因素,使PID参数的整定有一定的难度,致使许多PID控制器没能整定的很好,这样的系统自然无法工作在令人满意的状
6、态,为此人们提出了自整定PID控制器。将过程动态性能的确定和PID控制器参数的计算方法结合起来就可实现PID控制器的自整定。自整定的含义是控制器的参数可根据用户的需要自动整定,用户可以通过按动一个按钮或给控制器发送一个命令来启动自整定过程。本课题主要解决PID控制算法在只能小车上的参数整定问题,使智能小车基于PID闭环控制的智能反馈系统,能在直道上保持高速移动的同时并在弯道上能加速过弯。322. 硬件部分2.1车模组装严格按照设计说明对车模进行组装。严格按照检测说明对车模进行检测,调整车模的硬件参数。参数调整中最主要的一定要调整舵机的初始化角度,使舵机的初始化角度与车模的中轴线平行。2.2传感
7、器的设计与安装2.2.1光电传感器的选择及工作原理智能车系统以一个标准的汽车模型作为载体。为了提高智能车行驶的速度和稳定性, 单片机需要将路径的判断、舵机与驱动电机的控制紧密地结合在一起。而路径识别模块是智能车系统的关键模块之一, 路径识别方案多采用红外反射式光电传感器或者CCD/CMOS图像传感器。CCD/CMOS图像传感器寻迹方案的优点是可以更远更早地感知赛道的变化, 但是信号处理比较复杂。光电传感器体积小、价格低廉、安装灵活方便且不易受可见光的干扰, 故选用红外反射式光电传感器作为路径检测元件。工作原理如图2.2所示: 图2.2 传感器工作原理图 红外反射式光电传感器由一个发射管和一个接
8、收管组成, 相应于不同的路面条件(主要是黑白度), 接收管接收到地面漫反射红外线后其两端电压将有所不同。其电压大小与路面情况有关:当路面的颜色为白色时,反射光较强, 电压较高;当路面的颜色为黑色时,反射光较弱, 电压较低。因此,可以根据传感器电压的大小获得智能车的路面信息。光电传感器使用过程中要注意几个问题。首先, 要提高器件的一致性:一是发射/接收器件两者的波长特性一致;二是发射/接收传感器组对时, 各方面性能应尽量比较接近;三是安装状态一致, 如各对传感器的间距、高低、偏角等, 因为这些因素都会影响光的反射和接收。其次, 光电传感器应尽量靠近地面, 以便减少外界光源对传感器的干扰。垂直高度
9、为5-10mm为宜, 离地面过远, 光反射信号差, 信号不强;离地面过近, 会导致反射角度太大, 加剧光漫射干扰的影响, 故应适当, 以保证传感器具有最佳的反应。2.2.2光电传感器的布置方案传感器的布置方案有单排、双排、W字形排列等。我们采用了单排一字形的排列方式。具体的布置方式如图2.3,也就是在车模的头部安装一块电路板,其底部安装8个传感器。我们用编码的形式把传感器探测到的路面信息表示出来,然后把这些路面信息输入到控制系统,通过编写的控制算法就可以控制舵机和驱动电机,实现智能车的加速、减速、左转、右转了。通过不断的实验,来进一步地调整各种编码下,智能车要转的角度的参数。我们采用PID控制
10、算法,它可以解决智能车行驶速度与转向角度大小的相关性问题,行驶轨迹的跟踪及智能车偏离预定轨迹时的调整问题等。为了最大限度地增大传感器的预描距离,在满足组委会规定的尺寸内,我们让传感器的安装位置尽量向前靠。 图2.3带传感器的电路板的布置如图2.4所示:两个相邻的传感器的中心距离位18mm;图2.42.2.3光电传感器信号探测及处理电路传感器信号探测及处理电路设计如图2.5所示:图2.5 传感器探测与处理电路图2.2.4速度传感器的安装速度传感器安装于车模后部,使取速齿轮与赛道接触,当小车跑动时通过与赛道的接触以带动取速齿轮运动,从而获得车模的速度,速度传感器的安装与固定要考虑到信号的准确性和稳
11、定性。 2.3系统电路板的设计、安装与连接我们采用主办方提供的H8-3048单片机如图2.7所示:图2.72.4驱动电机和舵机2.4.1工作原理智能车系统以H8-3048为核心, 由单片机模块、电源管理模块、传感器模块、直流电机驭动模块、舵机控制模块等组成, 如图2.10所示。单片机通过光电传感器阵列采集路径信息, 然后采用一定的控制算法控制舵机的转角和直流驱动电机的转速, 从而实现智能车自动寻迹行驶。图2.10小车工作原理原理图图2.11 车模电机驱动控制板图2.4.2电路设计电机驱动板的电路图如图2.11所示。 图2.11 电机驱动板电路图PWM( Pulse Width Modulati
12、on),又称脉冲宽度调制方式,是指通过改变输入脉冲的有效工作时间,改变输入平均电压的调节电机转速方式。PWM信号的有效工作时间和周期的比值为PWM信号的占空比a为:a= toout/T式中a占空比值tooutPWM一个周期内高低电平中有效电平时间TPWM周期本设计的舵机采用PWM脉冲控制,通过调整脉冲的占空比实现舵机的左转和右转,如图2.12所示。 图2.12 舵机工作原理图本设计用H桥芯片MC33886驱动直流电机。由于电机启动和快速加速时所需电流较大,采用两片MC33886并联工作,并且采用PWM控制电机的转速。电路图如图2.13和2.14所示。 图2.13 电机驱动电路图 图2.14 电
13、机PWM调节电路图本设计中的各个硬件模块的设计为车模的行驶稳定性和快速性提供了坚实的基础,各个功能模块的调试与功能实现都符合大赛相关规定。2.5主要车模参数a)车重:1.5kg 长:384mm 宽:185mm 高:47mm b)传感器种类:反射式红外光电传感器 数目:8个c)舵机个数:1个d)电机个数:2个113.软件部分3.1控制算法由于采集到的路面信息为离散值, 如果直接应用到转向及车速控制策略中, 势必造成转向及车速调节的阶跃式变化, 这将会使智能车的转向及车速控制僵硬, 对路径变化反应不灵敏,以及易产生超调及振荡现象。由于舵机输出转角相对于路径为阶跃式延迟响应, 对于追求高速性能的高车
14、速短决策周期的控制策略来说, 很可能因为舵机响应不及而造成控制失效。因而决定采用基于离散路面信息的连续控制算法, 即舵机的PID控制算法和驱动电机的间接PID控制算法。3.1.1算法介绍PID控制算法包括直接计算法和增量算法,所谓的增量算法就是相对于标准的相邻两次运算之差,得到的结果是增量。也就是说在上一次的控制量的基础上需要增加(负值意味着减少)控制量,例如对于智能小车控制算法,就是智能小车相对于上一次转向角度还需要增加或减少的转向角度。在本方案的设计中采用了PID增量法。(一)舵机PID控制算法: Tk=Tk-1+Tk Tk=KP(eK-ek-1)+KIe+KD(eK-ek-1)-( ek
15、-1-eK-2) 式中:Tk 和Tk-1为当前和上次操作量;Tk为当前操作微分;eK、ek-1、eK-2为当前、上次、上上次偏差;KP、KI、KD是做好控制器的关键常数,分别称为比例常数、积分常数和微分常数,不同的控制对象需要选择不同的数值,需要经过现场调试才能获得较好的效果。为了避免系统可能出现的积分饱和现象, 对PID控侧器的积分部分做了两个改进:积分分离法和遇限削弱积分法。积分分离法的思路是当被控与给定值的偏差较大时, 去掉积分, 以避免积分饱和效应的产生;当被控与给定值比较接近时, 重新引人积分, 发挥积分的作用, 消除静态误差, 从而既保证了控制的精度又避免了振荡的产生。为此在积分项
16、中乘以一个人为引人的系数, 公式可改写为Tk=KP(eK-ek-1)+PKIe+KD(eK-ek-1)-( ek-1-eK-2)式中:当|eK|S时,P=1;当|eK|S时,P=0。 S为一定值。遇限削弱积分法的思路是一旦控制量认进人饱和区, 便停止进行增大积分项的运算, 而只进行使积分减少(即所谓削弱的运算)。具体过程是:在根据PID算式计算Tk前, 先判断前一次的控制量Tk-1是否到达极限范围, 如果到达则说明已经进入饱和区, 这时再根据偏差的正负来判断控制量是使系统加大超调还是减小超调;如果是减小超调, 则保留积分项, 否则取消积分项。遇限削弱法在进人极限范围后, 有条件的去继续积分或取
17、消积分, 从而避免控制量长时间停留在饱和区。本系统的具体实现是:在积分项中再引入一个系数C, 当判断后需要保留积分项则Q=1,否则Q=0。那么最终的舵机PID控制算式如下:Tk=KP(eK-ek-1)+PQKIe+KD(eK-ek-1)-( ek-1-eK-2)(二)驱动电机间接PID控制算法:驱动电机间接PID控制算法的思想是由于智能车行驶过程中舵机的转角与驱动电机转速之间可以近似为线性关系, 因而可以将舵机控制的输出量作为驱动电机PID控制算法的输人量, 通过一定的线性运算获得驱动电机的控制量,从而达到对驱动电机做间接PID控制的目的。由于智能车自身结构的关系, 其左转行驶和右转行驶时舵机
18、转角与驱动电机转速之间的线性关系并不尽相同, 所以它们之间应该是一种分段线性关系。设N为驱动电机的输出控制量, 则计算公式如下:当Tke1)e1=e0;e2=p*e0/cnt1;sum+=e2;if(e0pmax)return pmax;if(sumpmin)return pmin;return sum;智能车控制程序:/*/ /* Basic program for the micom car racekit06.c */ /* April 2006, Japan Micom Car Rally Committee */ /*/*This program, kit06.c, has the
19、following specificationsSupports the motor driver board Vol. 3Supports lane changing*/ /*=*/ /* Include declarations */ /*=*/ #include #include h8_3048.h /*=*/ /* Symbol definitions */ /*=*/ /* Constants */#define TIMER_CYCLE 3071 /* Timer cycle: 1 ms */ /* When &/8 is used, */ /* &/8 = 325.5 ns */
20、/* TIMER_CYCLE = */ /* 1ms / 325.5ns */ /* = 3072 */#define PWM_CYCLE 49151 /* PWM cycle: 16 ms */ /* PWM_CYCLE = */* 16ms / 325.5ns */* = 49152 */#define SERVO_CENTER 4490/* Servo sensor value 4880*/#define HANDLE_STEP 26 /* Value for 1 degree */ /* Mask value setting: x: Masked (disabled) O: Not m
21、asked (enabled) */#define MASK2_2 0x66 /* */#define MASK2_0 0x60 /* */#define MASK0_2 0x06 /* */#define MASK3_3 0xe7 /* */#define MASK0_3 0x07 /* */#define MASK3_0 0xe0 /* */#define MASK4_0 0xf0 /* */#define MASK0_4 0x0f /* */#define MASK4_4 0xff #define MASK0_0 0x18 /* */#define MASK1_1 0x81 /*my d
22、efine*/ #define PID_TYPE float #define TIMER1_CYCLE 614 #define PI 3.14 #define D 45 /*后轮直径*/ /*=*/ /* Prototype declarations */ /*=*/void init( void );void timer( unsigned long timer_set );int check_crossline( void );int check_rightline( void );int check_leftline( void );unsigned char sensor_inp( u
23、nsigned char mask );unsigned char dipsw_get( void );unsigned char pushsw_get( void );unsigned char startbar_get( void );void led_out( unsigned char led );void speed( int accele_l, int accele_r );void handle( float angle );char unsigned bit_change( char unsigned in );int getlspeed();int getrspeed();v
24、oid pid_init(struct pid_unit *unit, / PID控制模块指针 PID_TYPE p, / 比例系数 PID_TYPE i, / 积分系数 PID_TYPE d); / 微分系数PID_TYPE pid_control(struct pid_unit *unit, / PID控制模块 PID_TYPE input, / 当前输入数据 PID_TYPE time); / 距离上个数据的时间间隔 /*=*/ /* Global variable declarations */ /*=*/unsigned long cnt0; /* For the timer fun
25、ctions */unsigned long cnt1; /* Used in main() */int pattern; /* Pattern number */unsigned long cnt2; /* Used in main() */unsigned char newsensor;unsigned char oldsensor;unsigned long cnt_lsec; /*左马达一个脉冲用时*/unsigned long cnt_rsec; /*右马达一个脉冲用时*/unsigned long this_cnt_lsec; /*左马达一个脉冲用时*/unsigned long
26、this_cnt_rsec; /*右马达一个脉冲用时*/float lspeed; /*左马达速度*/float rspeed; /*右马达速度*/float ltemp; /*左马达临时速度*/float rtemp;/*右马达临时速度*/int pidlspeed;int pidrspeed;/ PID控制模块(每个控制单元需要一个此结构)struct pid_unit PID_TYPE pid_sens2;/ 保存连续最新3个输入数据序列PID_TYPE pid_cpid3;/ 比例、积分、微分系数PID_TYPE pid_dpid3;/ PID变量;/变速用unsigned char
27、sw_data;int K; /*/ /* Main Program */ /*/ void main( void ) struct pid_unit unit1; /* Microcontroller function initialization */ init(); /* Initialization */ set_ccr( 0x00 ); /* Enable all interrupts */ /* Micom car state initialization */ handle( 0 ); speed( 0 ,0 ); sw_data = dipsw_get() + 5; while
28、( 1 ) switch( pattern ) /* Notes on patterns 0: Wait for switch input 1: Check whether or not the start bar is open 11: Normal trace 12: Check for the end of a wide turn to right 13: Check for the end of a wide turn to left 21: Processing for when the first crossline is detected 22: Read and jump ov
29、er the second 23: Detect a trace or sharp turn after a crossline 31: Left sharp turn clear processing: Wait briefly until clear 32: Left sharp turn clear processing: Check that the end of the turn has been reached 41: Right sharp turn clear processing: Wait briefly until clear 42: Right sharp turn c
30、lear processing: Check that the end of the turn has been reached 51: Processing when the first right half-line has been detected 52: Read and jump over the second 53: Trace following a right half line 54: Check that the right lane change has completed 61: Processing when the first left half-line has been detected 62: Read and jump over the second 63: Trace following a left half line 64: Check that the left lane change has completed */ case 0: