分类: 嵌入式
2009-11-18 22:48:01
OBD是英文On-Board Diagnostics的缩写,中文翻译为“车载自动诊断系统”。这个系统将从发动机的运行状况随时监控汽车是否尾气超标,一旦超标,会马上发出警示。当系统出现故障时,故障(MIL)灯或检查发动机(Check Engine)警告灯亮,同时动力总成控制模块(PCM)将故障信息存入存储器,通过一定的程序可以将故障码从PCM中读出。根据故障码的提示,维修人员能迅速准确地确定故障的性质和部位。
从20世纪80年代起,美、日、欧等各大汽车制造企业开始在其生产的电喷汽车上配备 OBD,初期的OBD没有自检功能。比OBD更先进的OBD-Ⅱ在20世纪90年代中期产生,美国汽车工程师协会(SAE)制定了一套标准规范,要求各汽车制造企业按照OBD-Ⅱ的标准提供统一的诊断模式,在20世纪90年末期,进入北美市场的汽车都按照新标准设置OBD。
OBD-Ⅱ与以前的所有车载自诊断系统不同之处在于有严格的排放针对性,其实质性能就是监测汽车排放。当汽车排放的一氧化碳(CO)、碳氢化合物(HC)、氮氧化合物(NOx)或燃油蒸发污染量超过设定的标准,故障灯就会点亮报警。
虽然OBD-Ⅱ对监测汽车排放十分有效,但驾驶员接受不接受警告全凭“自觉”。为此,比OBD-Ⅱ更先进的OBD-Ⅲ产生了。OBD-Ⅲ主要目的是使汽车的检测、维护和管理合为一体,以满足环境保护的要求。OBD-Ⅲ系统会分别进入发动机、变速箱、ABS等系统ECU中去读取故障码和其它相关数据,并利用小型车载通讯系统,例如GPS导航系统或无线通信方式将车辆的身份代码、故障码及所在位置等信息自动通告管理部门,管理部门根据该车辆排放问题的等级对其发出指令,包括去哪里维修的建议,解决排放问题的时限等,还可对超出时限的违规者的车辆发出禁行指令。因此,OBD-Ⅲ系统不仅能对车辆排放问题向驾驶者发出警告,而且还能对违规者进行惩罚。
那什么是欧III标准呢?
2000年,我国开始实施严格的汽车排放标准,要求汽油车必须装备电喷发动机和三原催化转化器;柴油机必须装备增压器和改进喷油泵。其实这只相当于欧洲90年代初期的排放控制水平,即欧Ⅰ排放标准。在国家四部委局联合发布的低污染排放小汽车减征消费税的管理办法中,低污染排放指的是达到欧Ⅱ排放标准,相当于欧洲90年代中期的排放控制水平。
目前欧洲、美国正在实施真正意义上的低污染排放标准,即欧Ⅲ排放标准或美国Ticr标准。他们在前一阶段的基础上,削减了一半的污染排放量。到2004年左右,还将对排放限值再减低一半,达到超低污染排放要求。这就要求进一步提高汽车排放控制技术和改善燃油品质,要求开发更新的排放控制装置和排放测试装置。
执行新的排放标准对环境有什么特殊贡献呢?北京市环境保护局大气环境管理处处长冯玉桥给记者做了一个形象的比喻:“7辆执行欧Ⅱ标准的汽车,相当于1辆化油器车的污染物排放量;14辆执行欧Ⅲ标准的汽车,才相当于1辆化油器车的污染物排放量;而欧Ⅳ标准要求更高,更臻完美。”
STM32里的CAN 支持2.0A,2.0B, 带有FIFO,中断等, 这里主要提一下内部的时钟应用.
bxCAN挂接在APB1总线上,采用总线时钟,所以我们需要知道APB1的总线时钟是多少. 我们先看看下图,看看APB1总线时钟:
APB1时钟取自AHB的分频, 而AHB又取自系统时钟的分频, 系统时钟可选HSI,HSE, PLLCLK, 这个在例程的RC设置里都有的,
然后再看看有了APB1的时钟后,如何算CAN的总线速率, 先看下图:
有了上边的这个图,基本就清楚了.
总线时钟MHz
-----------------------------------------------
(3+TS1+TS2)*(BRP+1)
上边这个公式算出来的就是CAN的速率了.
目前还只是在使用loopback模式测试,
使用的是ST提供的测试代码的基础上做了简单修改,
这里主要提下我使用的结构体:
应用层数据包:
typedef struct
{
u32 id; /* 标识符 ide==Ext,id为29位,ide==std,id为11位 */
u8 ide; /* 扩展帧标识 1:Ext, 0:std */
u8 rtr; /* 远程帧标识 1:rtr, 0:data*/
u8 len; /* Data length */
u8 dat[8];
}CAN_APP_PACK;
接收队列:
/* 定义:兼容2.0 A与2.0 B协议 */
typedef struct
{
u32 id; /* r31-r21: std-ID, r20-r3: ext-ID, r2:IDE, r1:RTR, r0:resv */
u8 len; /* Data length */
u32 dataL; /* Data3, Data2, Data1, Data0 */
u32 dataH; /* Data7, Data6, Data5, Data4 */
}CAN_TRANS_PACK;
typedef struct
{
u8 head; /* 队列前指针 */
u8 trail; /* 队列底指针 */
CAN_TRANS_PACK data[CAN_TRANS_MAX_NUM];
}CAN_TRANS_RX_LIST;
采用中断接收, 收到数据后先存入接收队列,
然后主任务中定时查询处理..
接下来的任务就是研究下波特率设置,过滤器设置等,
从而实现双结点的通信.
最后完成协议的应用层.