5.1系统的控制方法与选取
5.1.1系统的控制方法[9][10]
控制车轮的滑转率是通过控制车轮上的驱动力矩实现的。汽车驰动轮的滑转是由于驱动力矩超过轮胎与路面的附着极限,所以合理减小汽车发动机扭矩或施加驱动轮制动力能够达到驱动防滑的目的。而在这个控制过程中,采用何种控制方法决定了控制效果的好坏。目前,主要的控制方法有逻辑门限值控制,滑模变结构控制,PID控制,最优控制,模糊控制等。
逻辑门限值控制是一种传统的控制方法,目前,大多数防滑控制系统仍然采用逻辑门限控制方法。逻辑门限控制方法通常将车轮的减速度(或加速度)作为主要控制门限,而将车轮的滑动率作为辅助控制门限。如果在汽车行驶过程中,车轮的某一参数超过设定的正的门限值,则控制系统就产生动作,调节发动机的输出扭矩和对驱动轮施加制动力使其降低,直至达到负的门限值,控制系统又产生动作,增加驱动力,如此循环实现滑转率的控制。其门限值是要经过反复试验而获得的经验数据。逻辑门限值控制的优点是:首先,它不涉及到具体的数学模型,免去了大量的数学计算,在一定程度上可以提高系统的实时响应。其次,它需要的控制参量较少,使系统简化,成本降低。另外,它的执行机构相对来说比较容易实现。其缺点是:控制逻辑复杂,控制过程不平稳,控制过程中,车轮速度波动
较大,控制系统的门限值是经过试验得到的数据,没有充分的理论依据,各类车型之间互换性差。
采用PID控制方法对ASR系统进行控制,通常是将实际车轮滑转率与理想滑转率构成的误差,由PID控制器算法算出需要进行控制的牵引力值反馈给发动机或者制动器,从而调节发动机输出的扭矩或者制动器制动力,使车轮的滑转率接近或等于理想滑转率。PID控制器的控制参数要通过对车辆系统进行分析计算进行调节设定。
滑模变结构控制是一类特殊的非线性控制方法,它根据系统当时的状态、偏差及其导数值,在不同的控制区域,以理想开关方式切换控制量的大小和符号,使系统在切换线邻近区域来回运动,直到系统状态的运动成了沿切换线的滑动。
模糊控制方法是模仿人的思文方式和人的控制经验,把人的经验形式化引入控制工程,再运用较严密的数学处理,实现模糊推理,进行判断决策,以达到满意的效果。它首先将精确的数字量转换成模糊集合的隶属函数,然后根据控制器制定的模糊控制规则,进行模糊推理,得到一个模糊输出隶属函数。用不同的方法找出一个具有代表性的精确值作为控制量,加到执行器上实现控制。
5.1.2控制方法的选择
本文选用Toyota Crown轿车所采用的控制算法:
设汽车的行驶速度为 ,驱动轮期望的滑转率为 ,则驱动轮的理想速度应为
(5.1)
为了把驱动轮转速控制在目标值 的小范围内,节气门闭环控制规律可由下式计算:
(5.2)
式中, 、 为反馈控制增益; 为驱动轮的实际速度; 为驱动轮的目标速度; 为节气门的开度角; 为节气门的初始角。其实这就是PID控制器。[11]当传感器输入车速 和驱动轮速 ,利用公式(2.1)计算滑转率,然后选择控制模式,其具体流程图如下:
图5.1软件程序框图
根据程序框图所编写的控制源程序如下:
#include<pic.h>
#include<pic1687x.h>
#include<math.h>
#define PORTIB (adi.bit)((undesigned)(&adr)*8+(bit))
static PB1 GO @PORTIB(PORTB,1);
static PB2 GO @PORTIB(PORTB,2);
int i,j,k,m,n1,n2;
double s;
int time=0; //节气门工作时间
double rads=0;
double Data[10240];
double Data1[10240];
double Data2[10240];
long Frequency = 10240*3; //采样频率
double PI=3.1415926;
int Start = 0,End = 0; //计算起始和结束点
short Channel = 2; //通道数
void main()
{
/* OPTION_REG=0x20;
INTEDG=0x00;
TRISA4=1;
INTION=0x00;
TICON=0x06;
TMRION=1;*/
www.751com.cn
Data1[i] = Data[3*i+1]+9000*sin(320*PI*i/1024); //车速波形
Data2[i] = Data[3*i+2]+7000*sin(640*PI*i/1024); //驱动轮速波形
}
double door=0; //计算车速
for (int m=10;m<1000;m++)
{
if(Data1[m]>door)
{
door=Data1[m] ;
}
}
door/=2;
for(int i = 0;i<1024;i++)
{
if(Data1[i] >door)
{
break;
}
}
for(;i<1024;i++)
{
if(Data1[i] < door)
{
break;
}
}
Start = i;
for(;i<1024;i++)
{
if(Data1[i] > door)
{
break;
}
}
for(;i<1024;i++)
{
if(Data1[i] <door)
{
break;
}
}
End = i;
T = (1.0 / (Frequency / 3.0)) * (End - Start);
n1 = 1.0/T;
UpdateData(FALSE);
for (int m=10;m<1000;m++) //计算驱动轮速
{
if(Data2[m]>door)
{
door=Data2[m] ;
}
}
door/=2;
for(int i = 0;i<1024;i++)
{
if(Data2[i] >door)
{
break;
}
}
for(;i<1024;i++)
{
if(Data2[i] < door)
{
break;
}
}
Start = i;
for(;i<1024;i++)
{
if(Data2[i] > door)
{
break;
}
}
for(;i<1024;i++)
{
if(Data2[i] <door)
{
break;
}
}
End = i;
T = (1.0 / (Frequency / 3.0)) * (End - Start);
n2 = 1.0/T;
UpdateData(FALSE);
for(i=0;i<100;i++)
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页