通过阅读文献对现代汽油缸内直喷技术(GDI)的简单总结
大前提:相对于PFI汽油发动机(其上所用的汽油电控喷射系统,是将汽油喷入进气歧管或进气管道上,与空气混合成混合气后再通过进气门进入气缸燃烧室内被点燃作功)的比较
一、GDI的相关优点
1、可实现分层稀燃,提高压缩比和容积率。
2、可通过采用质调节避免了节流阀的节流损失,实现燃油经济性的大幅改善。
3、可实现循环热量利用,热效率高。
4、具有高充气效率和抗爆震特性。
5、具有良好的加速响应性及优异的瞬态驱动特性。
6、冷启动时,未燃碳氢化合物排放低等等...
二、GDI的工作原理
GDI发动机是在适当的曲柄转角,通过喷油器将汽油直接喷入气缸中,通过组织合理的气流运动和控制精确的喷射时间、燃油喷射量及喷射压力(其油滴的蒸发主要依靠从空气中吸热而不是从壁面吸热),在不同的工况下实现不同的混合气制备,从而实现更好的分层燃烧(FSI),以提高燃油的经济性和降低排放。
三、GDI的关键技术及其主要组成系统
1、燃油供给系统
下图为一种直喷式汽油机供油系统油路
2、燃油喷射系统(GDI发动机油气混合质量主要依赖于喷雾质量和气缸内的空气运动)
喷油器的选择:空气辅助喷油器、高压旋流喷油器...等。
其中一种被认为是满足缸内喷射要求的喷射系统——高压共轨喷射系统加电磁驱动喷射器,该系统由低压输油泵、燃油压力传感器、喷油压力控制阀、高压油泵、蓄压燃油轨、喷油器等组成。
下图为常用内开式旋流喷油器喷嘴的结构简图
2、缸内流场结构(气缸内的空气流动对喷雾和燃烧的影响很大)
滚流(三菱有研究采用);涡流(现在主要采用);挤流。
3、燃烧系统结构
燃烧系统的设计是GDI发动机的关键技术。要成功实现中小负荷时的分层稀燃和大负荷时的均质预混,就需要进行燃油喷束、气流运动和燃烧室形状的优化合理配合。
壁面控制燃烧系统(壁面引导法)(三菱、丰田、Nissan等公司采用);气流控制燃烧系统(气流引导法);喷束(雾)引导法;三种类型。
??燃烧方式将如何选择??
4、主要控制系统ECU及ECM(从冷起动到全负荷各种工况需要复杂的供油和燃烧控制)
注:ECM为发动机控制模块
① 油气混合系统:按工况模式控制;喷油定时控制;两种控制模式
② 排放控制系统和控制策略
③ 电控系统
四、GDI功能技术难点及制约因素
1、GDI的排放问题:UBHC(未燃碳氢化合物);NOx
中、小负荷下UBHC的排放增多:
① 雾化时间不足、油气不充分混合、局部混合浓度高
② 不均质混合气过稀导致燃烧熄灭
③ 缸内温度偏低,不利于UBHC随后的氧化
④ 压缩比高,残留的HC增多
⑤ 缸壁温度过低导致燃油不完全蒸发,引起UBHC较多排放
NOx的排放处理:(转化器受硫S含量的影响而降低净化能力)
① EGR催化转化器
② 稀燃NOx催化转化器
注:三元催化器(处理NOx、CO、HC)在GDI中受诸多因素影响无法使用。
2、颗粒物的排放增多:在低负荷、过渡工况、冷启动的情况下,局部浓度高、缸内温度过低引起
3、缸内混合气不充分燃烧,产生积碳的问题
4、喷油器喷嘴沉积物的处理,其无自洁功能、抵抗能力弱
5、GDI不同负荷下,喷射油压及喷油量的控制问题,在要求的范围内控制混合气分层燃烧较为困难
6、由于提高了系统的压力,降低了燃油的润滑性,增加了供油系统及缸套的磨损
7、GDI燃烧系统的优化和喷油系统的开发复杂,电控系统精确控制难,开发成本高等等
关于四中提到的难点与制约因素的一些理论上的解决方法
1、控制策略
① 降低NOx排放技术——开发稀燃催化器;控制EGR系统比率
② 降低HC排放技术——二次燃烧等
③ 减少积炭——二次混合技术
2、燃烧方式
① 均质混合燃烧方式
② 非均质分层进气(分层燃烧)
③ 实现GDI发动机的HCCI(均质混合压燃)燃烧
3、“分层燃烧起动”与“两次喷射加热”相结合的方法
五、GDI现状及其发展方向
GDI现状:缸内直喷技术的关键技术现状
缸内直喷发动机的关键技术包括燃油供给与喷射系统、燃烧系统的优化设计、GDI的燃油喷射和燃烧过程控制策略等。
GDI燃油供给系统主要依靠高精度快速响应的电控系统,燃油喷射系统则主要采用高压共轨系统与电磁驱动喷油器相结合的形式,其中高压油泵、高压油轨、喷油器、发动机控制模块(ECM)是喷射系统的关键部件。ECM是直喷发动机的大脑并由软件、执行器、芯片等组成,其主要作用是采集发动机数据,并按照预定程序控制喷油时机和喷油量,从而实现最佳燃烧效率。
高压油泵和高压油轨对于制造精度和工作环境的要求很严格,高压油泵通过油压调节器控制燃油的压力并实现平衡喷油嘴压力的作用,通常可给燃油加压到15MPa,并最终将燃油送入油轨。
燃烧系统的优化设计是GDI发动机开发的关键技术,只有通过合理配置燃烧室形状、燃油喷束、气流运动等,特别是优化活塞顶部的设计,才能实现在中小负荷时的分层稀薄和大负荷时的均质预混的要求,其中进气行程和压缩行程中缸内瞬时流场的组织尤为重要,可促进燃料与空气的有效混合,同时控制气流的流动以生成稳定的分层混合气。
按照可燃混合气形成的控制方式以及火花塞和喷油器的相对位置,缸内直喷燃烧系统包括气流导向型、壁面导向型、喷射导向型。研究表明,喷射导向型系统燃烧效率损失和泵气损失相对较小,比气流导向型和壁面导向性有着更好的燃油经济性。
为了提高燃烧的稳定性,降低氮氧化物(NOx),现在主采用燃油喷射定时与分段喷射技术,即将喷油分成两个阶段,进气初期喷油,燃油首先进入缸内下部随后在缸内均匀分布,进气后期喷油,浓混合气在缸内上部聚集在火花塞四周被点燃,实现分层燃烧。
目前世界主要汽车制造商对GDI汽油直喷技术是应用情况。
GDI发展方向:
1、燃烧方式:稀薄燃烧{?均质混合燃烧;?非均质分层进气(分层燃烧)}等
2、燃烧控制技术
3、燃油复合喷射技术
4、发动机小型化
5、采用分层充气或者均质充气涡流增压技术
6、优化燃烧系统扩大分层稀燃区域
7、实现GDI发动机的HCCI(均质混合气压燃)燃烧[此技术需要解决?点火时刻的有效控制;?发动机整个工况内的燃烧速率的控制]
8、直喷技术和双喷设计技术、新一代可变进排气正时技术、变排量技术、增压技术、智能启停技术的综合应用
六、现在GDI研究机构及公司(一些)
三菱、丰田、大众/奥迪、奔驰、通用、本田、日产、福特、菲亚特、宝马、现代、马自达。 博世、德尔福、无锡油泵油嘴研究所。
第二篇:GDI+技术
GDI+技术
随着Windows 2000的推出,上述情况有了极大的改观: 程序员不必了解每种图像格式的具体含义,照样可以写出多格式图像浏览或转换程序,这一切全都依赖于Windows 2000及后继版中所使用的GDI+技术。
和传统的GDI不同,GDI+中引入了对COM(组件对象模型)技术的支持,通过COM技术,GDI+简化了对图像文件的访问(打开、保存)。它是通过调用COM组件来实现的,GDI+扮演的只是指挥者,而非操作员。对于图像文件,GDI+所关心的不是图像文件的文件头信息,不论要打开的文件格式是什么类型,GDI+首先要做的是在注册表中查看该图像格式的编码(或解码)信息是否已经注册(HKEY_CLASSES_ROOT\MIME\Database\Content Type)。如果已经注册,就通过该编码信息调用COM组件,就这么简单。这种技术早就在微软的其他软件中使用了(如IE)。“体验”过Nimda病毒的朋友可能对“audio/wav”这段代码并不陌生,Nimda就是靠它来伪装自己的:让IE认为附件是WAV文件而自动打开可执行程序,这其实也是IE使用COM技术的一个突出表现。
配合GDI+的推出,微软也同时发布了相应的SDK,如果已经安装了最新的Microsoft PlatForm SDK或已经开始使用VS.NET,GDI+的SDK就已经在系统中了。如果没有的话,可以到http:
///progtool上去下载GDI+的头文件和库文件。有了GDI+之后,只需简单地创建一个图形对象(Graphics object),然后直接调用该对象的方法(methods)进行绘图即可。图形对象是GDI+中的核心,正如DC之于GDI那样。图形对象和DC有许多相似的地方,在使用上遵循着相同的使用规则,但是两者在本质上已经有很大的区别。一个是基于句柄的GDI,一个是基于组件对象模型的GDI+。使用GDI+的SDK编程,必须按照下面的规范来进行:使用GDI+的命名空间(namespace Gdiplus),在使用GDI+函数时必须进行GDI+的初始化,使用完毕要销毁GDI+,这些规范在下面所列的程序中有详细的说明。
访问注册表编码信息
上面说到GDI+是通过在注册表中查看编码信息来访问图像文件的,在GDI+的SDK中,编码信息是存储在 ImageCodecInfo类中的,在这个类中,有编码的CLSID(COM组件的GUID标识码)、编码方式描述等。对于GDI,在注册表中访问编码信息通常使用以下两个函数来实现:
1. 查看系统中可用的图像编码信息(数量及大小)
Status GetImageEncodersSize(
UINT* numEncoders,
//存储编码器数量的地址
UINT* size //存储编码信息所需内存大小
);
2. 得到所有的编码信息
Status GetImageEncoders(
UINT numEncoders,//可用编码器数量
UINT size,//存储编码器信息所需内存(由ImageCodecInfo类组成的数组的大小)
ImageCodecInfo* encoders//编码器信息指针
);
在GetImageEncoders函数中,参数numEncoders和size都是由GetImageEncodersSize返回的。下面的代码在注册表中查找具体格式图像的编码方式:
int GetImageCLSID(const WCHAR* format, CLSID* pCLSID)
{ //得到格式为format的图像文件的编码值,访问该格式图像的COM组件的GUID值保存在pCLSID中
UINT num = 0;
UINT size = 0;
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if(size == 0)
return FALSE; // 编码信息不可用
//分配内存
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return FALSE; // 分配失败
//获得系统中可用的编码方式的所有信息
GetImageEncoders(num, size, pImageCodecInfo);
//在可用编码信息中查找format格式是否被支持
for(UINT i = 0; i < num; ++i)
{ //MimeType:编码方式的具体描述
if( wcscmp(pImageCodecInfo
.MimeType, format) == 0 )
{
*pCLSID = pImageCodecInfo
.Clsid;
free(pImageCodecInfo);
return TRUE;
}
}
free(pImageCodecInfo);
return FALSE;
}
实现多格式的图像浏览和转换
有了前面的知识,实现多格式的图像的浏览与转换就不是什么难事了。
1.在VC中创建一个SDI项目ImageShow,对GDI+声明和初始化及销毁进行代码编制,具体代码如下:
#i nclude “Gdiplus.h”
using namespace Gdiplus;
CImageShowView::CImageShowView()
{
//初始化GDI+
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
}
CImageShowView::~CImageShowView()
{
//销毁GDI+
ULONG_PTR gdiplusToken;
GdiplusShutdown(gdiplusToken);
}
2. 通过类向导(Class Wizard),重载“文件”菜单中的“打开”和“另存为”两项。为了编程的简单,本程序只将当前打开的图像文件直接存为BMP文件(实际上保存为其他格式的文件也很简单,只不过是对文件名进行分析而已)。另外,为了在打开和保存文件时进行文件名的传递,还应在CImageShowView类中加入一全局变量“CString strOpenFileName”。“打开”和“另存为”两菜单的对应代码如下:
WCHAR* ToWChar(char * str)
{
//在GDI+中,有关字符的参数类型全部都是WCHAR类型
//该函数是将传统字符串进行转换
static WCHAR buffer[1024];
wcsset(buffer,0);
MultiByteToWideChar(CP_ACP,0,str,strlen(str),buffer,1024);
return buffer;
}
void CImageShowView::OnFileOpen()
{
//本程序能够打开各类常见格式的图像文件 static char szFilter[]=“常见格式图像文件(*.*)|*.*|”;
CFileDialog dlgChoseImage(1,NULL,NULL,NULL,szFilter);
if(dlgChoseImage.DoModal()==IDOK)
{
strOpenFileName=dlgChoseImage
.GetPathName();
//打开文件后立即在窗口中显示(重绘客户窗口)
this->Invalidate();
}
}
void CImageShowView::OnFileSaveAs()
{
if(strOpenFileName.IsEmpty())
{
AfxMessageBox(“当前没有打开图像文件,不能进行保存!”);
return;
}
//建立图形对象
Graphics graphics(GetDC()->m_hDC);
//装入当前已经打开的图像文件
Image image(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength())));
CString strFileSave;
//将其他格式的图像全部另存为BMP文件
static char szFilter[]=“位图(*.BMP)|*.BMP|”;
CFileDialog dlgChoseImage(0,“BMP”,NULL,NULL,szFilter);
if(dlgChoseImage.DoModal()==IDOK)
{
strFileSave=dlgChoseImage.GetPathName();
CLSID clsid;
if(GetImageCLSID(L“image/bmp”,&clsid))
{
image.Save(ToWChar(strFileSave.GetBuffer(strFileSave.GetLength())), &clsid, NULL);
//将保存后的图像进行显示
strOpenFileName=strFileSave;
this->Invalidate();
}
}
}
3.为了浏览图像转换前后的效果,还应该在窗口中分别绘制转换前后的图像,这需要在OnDraw函数中添加绘制代码,如下所示:
void CImageShowView::OnDraw(CDC* pDC)
{
CImageShowDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//如果没有选择显示图像文件,则不用重绘
if(strOpenFileName.IsEmpty())
return;
//显示当前打开的图像文件的全名
this->GetParent()->SetWindowText(strOpenFileName);
//建立图像对象
Graphics graphics(pDC->m_hDC);
//装入图形文件
Image image(ToWChar(strOpenFileName.GetBuffer(strOpenFileName.GetLength())));
Point destPoints[3] =
{
Point(0, 0),
Point(image.GetWidth(), 0),
Point(0, image.GetHeight())
};
Point* pdestPoints = destPoints;
//在指定区域pdestPoints显示图像
graphics.DrawImage(&image, pdestPoints, 3);
}
在编译上面的程序之前,应该将Gdiplus.lib文件连编到项目中去,否则将会出现“LINK
2001”编译错误。上述程序在Visual Studio 6.0、Windows 2000/XP下调试通过,它能够显示或转换的图像格式有BMP、GIF、JPEG、Exif、PNG、TIFF、ICON、WMF、EMF等等。需要说明的是,本文只就GDI+编程的基本原理进行了阐述,事实上,GDI+的应用远不止此。
还有,我在onpaint加入
Image image(L"Blue hills.jpg"); graphics.DrawImage(&image, 60, 10);来load一副图片,该图片是放在project的目录下,可以运行
image可不可以不放在工程的目录下呢,那样的话Image image(L"Blue hills.jpg"); 该怎么写,那个L是什么意思???Top
9 楼asett1(asett1)回复于 2003-10-28 16:01:38 得分 0
基础太差,建议好好补一下vc和mfc,c++.
image就是个构造函数啊。需要WCHAR* 类型的数据,怎么从CString --> WCHAR*? 用 WideCharToMutiByte()
MultiByteToWideChar()
随便怎么打开一个文件都可以啊
如果只要加载常量,就用 image(L"c:\\Blue hills.jpg");
如果加载变量,就用 MultiByteToWideChar(..,strFileName,NewWchar);
image(NewWchar);
void CGdiexampleDlg::OnImage()
{
// TODO: Add your command handler code here
CClientDC dc(this);
//创建Graphics对象
Graphics graphics(dc);
Image image(L "d:\\1.jpg");
//在矩形区域内显示jpg图像
Point destPoints1[3] =
{
Point(10, 10), Point(220, 10), Point(10, 290) };
graphics.DrawImage(&image, destPoints1, 3); //在平行四边形区域内显示jpg图像 Point destPoints2[3] =
{
Point(230, 10), Point(440, 10), Point(270, 290) };
graphics.DrawImage(&image, destPoints2, 3); }