这是车辆电子控制技术的一个课程作业:
设计一个电控系统(硬件和软件),该系统可按照SAEJ1939采集发动机油门踏板和发动机转速信号,如果监测到的发动机转速超过1600rpm,则控制发动机转速稳定工作在1600rpm。
要求:画出电路原理图和PCB图(自行选择单片机、接口电路和绘图软件),给出相关的源程序(编程语言不限)。
备注:禁止任何形式的抄袭,如发现抄袭无论被抄袭者还是抄袭者,该作业一律0分。
发动机转速信采集与控制的设计
作业分析:为完成此项目,首先要确定硬件系统,从而利于进行软件的设计;第二了解SAEJ1939通讯协议,以便进行发动机油门踏板信号和发动机转速信号的解析;第三进行软件编程,实现对硬件系统的初始化,通过CAN总线接收油门踏板信号与转速信号的数值,控制电路实现对发动机稳定转速1600rpm的控制。 (一)硬件系统设计
系统核心MCU采用MC9S12XDP512单片机,负责采集传感信号,实现CAN总线通讯,输出信号控制输出电路。整车硬件系统采用MC9S12XDP512单片机,由频率量采样电路、模拟量采样电路、驱动电路、CAN总线通讯电路组成,通讯速率250kps。
转速或流量等脉冲频率信号或开关信号怠速、点火、启动、空档等开关空气流量传感器曲轴、凸轮轴、节气门位置传感器 进气、冷却液温度传感器氧传感器+24VDC供电电路模拟量采样电路ADCAN总线接口电路频率量采集电路I/OI/O驱动电路电磁喷油器电动汽油泵MC9S12XDP512CAA单片机显示器总线信息软件维护CAN发动机控制器 图1 硬件系统原理
频率量采样电路实现对发动机转速、空气流量传感器等具有脉冲输出的功能信号的采集,同时也能实现对开在信号的采集。
模拟量采样电路可以实现对怠速、点火、启动、空档、空调等开关信号的采集,也能实现对空气流量传感器、曲轴、凸轮轴、节气门等位置传感器信号的采集,还能实现对进
1
《车辆电子控制技术》课程作业
气、冷却液等热电阻温度传感器信号的采集。
驱动电路实现对电磁喷油器的PWM控制,对电动汽油泵继电器的通断控制。 CAN总线接口电路实现与整车总线的连接,采集发动机转速、油门的开度信号;实现数据的上传;实现软件升级下载。 1. 供电电路设计
图2 供电电路设计
设定车载供电为24V,电压波动范围是16V至32V。如果车载供电电压为12V,则将LM2937-12的输入与输出短接即可。在此电路设计中增加输入电压钳位保护,利用SMCJ36A将输入电压保护在36V以下,实现对LM2575的保护;利用SMAJ6.0A将单片机工作电压保护在6V以下,防止在调试时操作不当,由于电压过高损坏单片机。
车载传感器可由VCC或+12VDC、+24VDC供电。 2. CAN总线电路设计
图3 CAN总线电路设计
相对而言,PCA82C251相对其它芯片TJA1050、TJA1040、具有更广范围的供电电压,
2
《车辆电子控制技术》课程作业
因此选用82C51。这终端电阻设置在总线拓扑的首尾,并在CANH和CANL上,通常而言总线距离在500m内这两个电阻为120Ω,由于车辆内部总线长度不会超过500m,因此装甲车辆的CAN总线的终端电阻为120Ω。
在总线上,串联两个5.1欧的电阻,起到限流作用,保护82C51,同时增加保护二极管PESD1CAN。 3. 模拟量采样电路设计
图4 模拟量采样电路设计
模拟量输入与开关信号输入共用电路。实现对0-5V信号的AD转换,以及0-24V开关信号的检测。此电路也可实现对频率量的检测,只需将电路与单片机的输入捕捉通道连接即可,对MC9S12而言,接到PT通道即可。 4. 驱动电路设计
图5 额定电流3.7A最大瞬态电流12A驱动电路设计
驱动电路设计了两类,一类是驱动小电流负载的,额定电流为3.7A,但实际中会降额使用,一般不大于2A电流的负载会使用这个电路,对于喷油的电磁阀是适用的。当负载电流大时,可以使用图6的驱动电路。
3
《车辆电子控制技术》课程作业
图6 额定电流44A最大瞬态电流90A驱动电路设计
这两个驱动电路,均具有状态反馈功能,控制信号加上后,是否输出24V,这是可以通过反馈的开关信号检测的。这有利于实现故障诊断功能。
利用软件Altium Designer(16.0)完成了四层板的设计,如图7所示。
图7 四层板设计(隐藏了中间两层)
(二)信号解析
根据作业要求,要确认SAEJ1939协议中发动机油门踏板和发动机转速信号的形式,因此查《SAE-J1939-71协议》查到如下相关章节:
5.3.6电子发动机控制器#2:EEC2
50ms 传输循环率:
数据长度: 8 字节
0 数据页面:
240 PDU格式:
4
《车辆电子控制技术》课程作业
3 PDU特定:
3 默认优先值:
参数群数编号: 61443(00F00316)
8-7 字1 状态—EEC1 未定义
节 6-5 道路速度极限状态 5.2.6.76 4-3 AP 换低挡装置开关 5.2.2.5 2-1 AP低空转开关 5.2.2.4 2 加速器踏板(AP)位置 5.2.1.8 3 当前载入百分比 5.2.1.7 4 远程加速器 5.2.1.59 5-8 未定义
5.3.7电子发动机控制器#1:EEC1 传输循环率: 由发动机速度决定 数据长度: 8 字节
0 数据页面:
240 PDU格式:
4 PDU特定:
3 默认优先值:
参数群数编号: 61444(00F00416)
8-5 字1 状态—EEC1 未定义
节 4-1 发动机/减速器扭矩模式 5.2.2.1 2 主动轮命令发动机—扭矩百分比 5.2.1.4 3 实际发动机—扭矩百分比 5.2.1.5 4-5 发动机速度 5.2.1.9 6 针对发动机控制的控制设备源地址 5.2.5.298
5.2.1.8加速踏板位置
这是指加速踏板的实际位置和最大踏板位置的比值。虽然它是用于输入对传动系统的要求,但它也可以为传动和ASR算法提供关于驱动器操作的预设信息。 数据长度: 1字节 分辨率: 0.4%/位递增,从0 % 开始计算 数据范围: 0%到100% 类型: 测量值
91 可疑参数编号:
5.3.6 参考:
5.2.1.9发动机转速
这是指转过720度最小曲轴角的速度除以气缸的数目所得到的实际发动机转速。 数据长度: 2字节 分辨率: 0.125 rpm/位递增,从0 rpm开始计算(高位字节分辨率=32 rpm/位) 数据范围: 0到8031.875 rpm
5
《车辆电子控制技术》课程作业
类型:
可疑参数编号: 参考:
测量值 190 5.3.7
J1939是一种支持闭环控制的在多个ECU之间高速通信的网络协议冈。主要运用于载货车和客车上。它是以CAN2.0为网络核心。表1介绍了CAN2.0的标准和扩展格式,及J1939协议所定义的格式。表1则给出了J1939年的一个协议报文单元的具体格式。可以看出,J1939标识符包括:PRIORTY(优先权位);R(保留位);DP(数据页位);PDU FORMAAT(协议数据单元);PDU SPECIFIC(扩展单元)和SOURCE ADDRESS(源地址)。而报文单元还包括位的数据场。
表1 CAN2.0的标准和扩展格式及J1939协议所定义的格式
CAN扩展帧格式 J1939帧格式 CAN 帧位置 帧起始位 1 优先权3位 2~4 5 6 24 7~12 23~18 13 14 15 16 17 16 28~26 25 R位数据PF格SRR扩展标识 PF PS格式(8位) 17~24 15~8 源地址(8位) 25~32 7~0 (保) 页DP 式6位 位 SOF 11位标识符 SRR IDE 18位扩展标识符 由表1:可得到如下计算CAN总线帧标识符的公式:
CAN_ID = [占3位的优先级(P)00B]H‘+’[参数组编号(PGN)D]H‘+’[源地址]H 注:B为二进制;D为十进制;H为16进制,最终均强制转换为16进制。 ‘+’代表字符串按顺序联接在一起。
对于油门位置信息:优先级3,参数组编号61443D,源为00H,即来源于发动机1则 AcceleratorPedalPosition=[01100B]H‘+’[61443D]H‘+’[00H]H =0CH‘+’F003H‘+’00H =0CF00300H 因此可以得到: 所在参数组 参数在数据场的位置 参数范围 分辨率 29位标识符为
油门位置 61443(0x00f003) 第2字节 0%至100% 0.4% 0CF00300H 6
发动机转速 61444(0x00f004) 第4-5字节 0到8031.875转/分钟 0.125转/分钟 0CF00400H 《车辆电子控制技术》课程作业
(三)软件设计 1. 硬件的资源分配
在设计软件之前,一定先进行硬件的资源分配,即进行信号采集,通讯,控制输出等的通道配置。如表2。
表2 控制器硬件资源分配
序号 内容 1 2 3 4 5
2. 软件流程分析
实际的发动机转速控制是很复杂的,为简化处理,假定喷油器控制使能时,代表喷油量增大,转速增加,喷油器控制清零时,代表喷油量减小,从而转速减小。程序流程如图8。
程序开始模块 CAN0 AD0 PP口 输入/输出控制位 备注 AN00 PTP_PTP0 PTP_PTP1 PTP_PTP2 采集油门与转速信号 采集点火开关信号 PTP0=1时,油泵上电 上电常位低速运行; PTP1=1时,高速运行 PTP2=1时,喷油 CAN通讯 点火开关 油泵上电继电器 电动汽油泵档位控制 PP口 喷油器控制 PP口 系统初始化系统当前状态检测 是否点火?是否汽油泵断电喷油阀断电汽油泵通电,汽油泵低速运转;通过CAN总线中断检测当前油门位置、发动机转速信息否转速>1600rpm否?是增大喷油器的喷油量减小喷油器的喷油量
图8 发动机转速控制流程
3. 程序设计要点分析
7
《车辆电子控制技术》课程作业
(1)总线标识符的设定
为了实现程序的良好维护性,一般定义标识符,以代替实际的数字帧号。
//定义加速踏板位置(油门)CAN总线标识符 AcceleratorPedalPosition,ID号0CF00300 unsigned long AcceleratorPedalPosition =
(((0x0CF00300<<1)&0x3FF80000)<<2)|((0x0CF00300<<1)&0x000FFFFF|0x00180000); #define AcceleratorPedalPosition_0 ((AcceleratorPedalPosition&0xFF000000)>>24) #define AcceleratorPedalPosition_1 ((AcceleratorPedalPosition&0x00FF0000)>>16) #define AcceleratorPedalPosition_2 ((AcceleratorPedalPosition&0x0000FF00)>>8) #define AcceleratorPedalPosition_3 (AcceleratorPedalPosition&0x000000FF)
对于XDP512单片机而言,是由CAN0TXIDR0、CAN0TXIDR1、CAN0TXIDR2、CAN0TXIDR3是来保存扩展帧的标识符的。
总线扩帧:为上图蓝色与红,第0字节为MID28-MID21;第1字节为MID20-MID18+空2位+MID17-MID15;第2字节为MID14-MID7;第3字节为MID6-MID0+空1位。
因此对于扩展帧标识符的定义是:
(1)整个标识符左移1位,(0x0CF00300<<1),是为了空出第3字节的最低的空1位; 之后再按位与0x3FF80000,((0x0CF00300<<1)&0x3FF80000),是为了得到高11位,其余位均去除;
之后再左移两位,(((0x0CF00300<<1)&0x3FF80000)<<2,是为了空出第2字节的中间空的两位。这样就得到了待存入标识符寄存器中的31-19位;
(2)整个标识符左移1位,(0x0CF00300<<1),是为了空出第3字节的最低的空1位; 之后再按位与0x000FFFFF,(0x0CF00300<<1)&0x000FFFFF,是为了得到低20位,其余位去
8
《车辆电子控制技术》课程作业
除,注意第19位为扩展标识位,扩展帧时必须为1,因此不是按位与0x0007FFFF。 之后再按位或,((0x0CF00300<<1)&0x000FFFFF|0x00180000),即可得到低20位在标识符寄存器中的排列。注意,第20位,扩展模式下,设置为1,因此是按位或0x00180000。
(3)将1、2步得到的值按位或,即得到所需符合S12单片机所要求的标识符。 (((0x0CF00400<<1)&0x3FF80000)<<2)|((0x0CF00400<<1)&0x000FFFFF|0x00180000)
同理得到发动机转速CAN总线标识符。
//定义发动机转速CAN总线标识符 EngineSpeed,ID号0CF00400 unsigned long EngineSpeed =
(((0x0CF00400<<1)&0x3FF80000)<<2)|((0x0CF00400<<1)&0x000FFFFF|0x00180000); #define EngineSpeed_0 ((EngineSpeed&0xFF000000)>>24) #define EngineSpeed_1 ((EngineSpeed&0x00FF0000)>>16) #define EngineSpeed_2 ((EngineSpeed&0x0000FF00)>>8) #define EngineSpeed_3 (EngineSpeed&0x000000FF)
(2)关于总线数据的过滤处理
总线上存在大量数据,如果对总线上的数据都进行接收中断,则会使大量无关的数据进入,产生总线中断,造成单片机的运行效率下降,如果只让有用的信息进入,同时阻止无用的数据进入,这就要用到总线标识符接收寄存器,CANIDAR,和标识符屏蔽寄存器CANIDMR。
本设计只接收加速踏位置与发动机转速的信息,因此设置2个32位过滤器。只允许这两帧信息进入CAN0总线的中断。
//接收屏蔽设置只允许加速踏板位置,即标识符0x00CF00300的数据进入滤波器0
CAN0IDAR0 = AcceleratorPedalPosition_0;
CAN0IDAR1 = AcceleratorPedalPosition_1; CAN0IDAR2 = AcceleratorPedalPosition_2; CAN0IDAR3 = AcceleratorPedalPosition_3; CAN0IDMR0 = 0x00; CAN0IDMR1 = 0x07; CAN0IDMR2 = 0x00; CAN0IDMR3 = 0x07;
//接收屏蔽设置只允许发动机转速,即标识符0x00CF00400的数据进入滤波器1
9
《车辆电子控制技术》课程作业
CAN0IDAR4 = EngineSpeed_0;
CAN0IDAR5 = EngineSpeed_1; CAN0IDAR6 = EngineSpeed_2; CAN0IDAR7 = EngineSpeed_3; CAN0IDMR4 = 0x00; CAN0IDMR5 = 0x07; CAN0IDMR6 = 0x00; CAN0IDMR7 = 0x07;
说明:CAN0IDAR用于存放待接收的基本标识符,CAN0DMR用于设定与基本标识符相比,可接收的标识符能在哪些位与基本标识符不同,某位为1,则0、1均可进入,为0,则必须该位与基本标识符一样才能进入,如果基本标识符该位为0,则进入的信息该位也必须为0。如果基本标识符该位为1,则进入的信息该位也必须为1。但CAN0DMR1、3、5、7的低3位必须全为1。
(3)主程序
#include SystemInitialize(); //系统初始化 EnableInterrupts; //开中断,以利于总线CAN0接收信息 for(;;) { CheckSystemCurrentState(); //检测系统当前状态 if(EngineState==Running) { OilPumpPowerOn(); //汽油泵通电 OilPumpLowSpeedRunning(); //汽油泵低速运转 10 《车辆电子控制技术》课程作业 GetEngineSpeedInformationByCAN0(); //通过CAN0获取发动机转速信息 if(EngineSpeedValue>1600) //如果发动机转速值大于1600rpm { DecreaseInjectionOilValue(); //则减小喷油量 } if(EngineSpeedValue<=1600) { IncreaseInjectionOilValue(); //如果不大于1600rpm //则增大喷油量 } } if(EngineState==Stop) //如果发动机熄火 { OilPumpPowerOff(); //汽油泵断电 } } /* wait forever */ /* please make sure that you never leave this function */ } (4)关键子程序的设计 检测点火开关的子程序 //检测系统当前状态 void CheckSystemCurrentState() { //通过AD0-AN00通道检测点火开关值 EngineFireSwitchValue=ResultsLimiteFilter(AD0,AN00,limiteValue); if (EngineFireSwitchValue>RunningValue) //开关电压高于512时 { //则认为点火成功 EngineState=Running; } else { EngineState=Stop; 11 《车辆电子控制技术》课程作业 } } 总线中断程序 #pragma CODE_SEG NON_BANKED void interrupt 38 CAN0RxISR(void) { unsigned char length,i; length = (CAN0RXDLR & 0x0F); /*确定所接收到的数据的长度*/ WhichFiterHit=(CAN0IDAC & 0x07); switch(WhichFiterHit) {/**/ case 0: /**/ { //命中滤波器0,则进入的信息是加速踏板位置信息 //设最大位置为100,换算当前位置值 //分辨率为0.4 AcceleratorPedalPositionValue=CAN0RXDSR1*0.4; }break; case 1: { //命中滤波器1,则进入的信息是发动机转速信息 //换算当前转速值 //分辨率为0.4 EngineSpeedVale=(CAN0RXDSR3*256+CAN0RXDSR4)*0.125; }break; default: break; }/**/ CAN0RFLG = 0x01; /*清零接收缓冲区满标志位,这样才可以接收新数据到缓冲区*/ } #pragma CODE_SEG DEFAULT 12 《车辆电子控制技术》课程作业 系统初始化程序 void SystemInitialize(void) { IOInitial(); //IO输入输出配置 CAN0Initial(); //CAN0初始化,配置通讯速率为250kps ATD0Initial(); //AD0初始化,10位AD转换 EnableCAN0RxInterrupt(); //使能CAN0接收数据中断 } 其它文件请详见文件夹。 13
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务