Arduino在汽车CAN通讯中的应用研究 Research on the Application of Arduino in Automobile CAN Communication

2021-11-30 00:42信松岭XINSong-ling张召ZHANGZhao
内燃机与配件 2021年22期

信松岭 XIN Song-ling 张召 ZHANG Zhao

摘要:汽车各个电子控制单元之间的通讯通过CAN,在汽车研发过程中,存在软件不同步以致CAN通讯异常,无法交互信号,车辆功能异常。为满足研发需求,采用Arduino UNO+MCP2515进行CAN信号解析、转换并发送,试验数据显示,转发物理量的正确性及实时性较好,表明该方案有效,为其他类似场景需求提供解决方案。

Abstract: The communication between various electronic control units of the vehicle is through CAN. In the process of vehicle development, software asynchronization leads to abnormal CAN communication, unable to exchange signals, and abnormal vehicle functions. In order to meet the research and development requirements, Arduino Uno +MCP2515 was used to analyze, convert and send CAN signals. The test data showed that the correctness and real-time performance of the forwarding physical quantity were good, which indicated that the scheme was effective and provided a solution for other similar scene requirements.

關键词:控制器局域网;Arduino开发板;信号解析

Key words: controller area network;Arduino development board;signal parsing

中图分类号:U463.1                     文献标识码:A                      文章编号:1674-957X(2021)22-0006-03

0  引言

当今阶段的汽车电气化程度日益发展,每台配备数十个ECU(电子控制单元)[1],而它们之间并非是完全独立的,完成某项整车功能可能需要来自几个不同ECU的信号,例如非常熟悉的仪表显示,它需要获取ABS(防抱死制动系统)的车速信号,获取ECM(发动机控制模块)的发动机转速和水温信号,获取TCM(变速箱控制模块)的挡位信号。而TCM在执行换挡功能时,也同样需要获取发动机转速和车速等其他控制器的信号。为了解决汽车控制器之间的通讯问题,德国Bosch公司开发了一种现场总线——CAN(Controller Area Network),并最终成为国际标准(ISO11519),是应用最广泛的现场总线之一[2]。它通过两条双绞的线缆,以差分信号的形式进行通讯。CAN通讯具备以下特点:

①多主总线,每个节点机均可成为主机,且节点机之间也可进行通讯;

②通讯速率快,最高可达1Mb/s;

③采用CRC校验并提供相应的错误处理功能,保证通讯的可靠性;

④最大的特点是没有采用传统的站地址编码,取而代之对通讯数据块编码,这种方式可使节点机的个数在理论上不受限制,也可以使不同的节点机同时接收相同的数据,还可以作为发送仲裁的依据。

1  原理与设计

1.1 研究背景

在汽车研发初期,会定义出车辆的配置及零部件方案,并以某款成熟汽车作为基础进行改制,列举如下场景:

场景一:改制车有控制器A,其外发的CAN信号中有个信号a,会被控制器B接收并执行其相应功能,而基础车没有控制器A,导致控制器B无法正常执行功能;

场景二:改制车将基础车的控制器C更换为控制器D,那么控制器D与基础车的其他控制器无法正常通讯,因为控制器D与控制器C对信号的定义不同;

场景三:预研新增控制器做原型开发,与已有的控制器通过CAN进行通讯(该控制器的应用层软件非自主,不能直接在该控制器中开发,仅开放CAN接口),并通过其响应验证新开发逻辑的可行性。

这三个场景有个共同点是都涉及到了CAN通讯,按照正常的开发流程需要各自的控制器更改软件以适配CAN信号的变更,但不同的供应商会有不同的开发周期,举例某供应商在仅更改CAN信号定义的软件升级需要3至4个月,对于整车公司而言,这个周期是很长的,难以满足开发需求。

1.2 问题分析

分析各个场景的问题核心,有如下解决方案:

场景一:可以通过设备模拟缺失的信号a;

场景二:可以将设备串接在控制器D前,并将交互的信号按照两侧的定义进行转发,具体而言(为简化描述,两侧分为左侧和右侧),设备按照左侧的信号定义接收,解析后获得表征的物理值,然后按照右侧的信号定义发送,同理从右侧接收,向左侧发送;

场景三:可以通过设备运行新策略,并将最终结果通过CAN外发。

接下来对设备进行选型,笔记本电脑安装BusMaster,可以通过USB口连ES581接入CAN总线,但此方案要占用一台电脑资源,而且占用空间大,不易放置。

通过调研,MCP2515作为一款独立的CAN控制器并集成了收发器[3],可以直接接入CAN总线,而与主控芯片通过SPI通信,主控芯片则选用Arduino UNO[4]。三个场景的网络拓扑如图1所示。

1.3 硬件连接

以场景二为例,仅仪表控制器更换供应商,其他控制器不变,开发设备的硬件包括:Arduino UNO一台(含线,集成数据传输及供电功能),MCP2515两块,杜邦线若干。Arduino UNO与MCP2515引脚连接关系如表1所示。

将仪表控制器原有的CAN总线剪断,仪表这一侧的线头与MCP2515(ABS)的CAN总线连接,另一侧的线头与MCP2515(总线)的CAN总线连接,注意双绞线的两条线不能接反,如果CAN信号中转功能异常,这是一个排查点。Arduino UNO的线是USB口,可以通过车上的USB供电。

1.4 软件设计

软件是控制系统的灵魂,Arduino在软件设计的优势在这里就明显的体现出来了。由于开源的缘故,很多专业的高水平的研究人员或电子爱好者,会将开发的驱动封装为库函数,在应用时就会极为方便,只需要调用几个函数,就能轻松完成对外设的控制,让我们更加专注于应用层软件的设计,专注于功能的实现。

Arduino的软件开发环境是Arduino IDE,与其他主控芯片有多个工具软件的开发方式不同的是,这是一个集成开发环境,包含代码编写、编译、下载等功能,界面简洁友好[5]。

对于MCP2515的支持有许多库函数,本次应用研究使用sutowp开发的arduino-mcp2515-master。该库函数封装了几个重要且常用的函数:

①MCP2515 mcp2515(9),定义一个名为mcp2515的MCP2515对象,参数9代表mcp2515的片选引脚;

②mcp2515.setBitrate(CAN_500KBPS),定义mcp2515的总线速率为500kbps;

③mcp2515.readMessage(&canMsg),定义mcp2515的接收函数,并将报文信息保存至canMsg,包含3个主要内容,canMsg.can_id表示报文ID、canMsg.can_dlc 表示报文DLC(1~8)、canMsg.data[0]~ canMsg.data[7]表示1~8字节长度的数据场;

④mcp2515. sendMessage(&canMsg),定義mcp2515的发送函数,将canMsg保存的报文信息发送至总线;

为了满足场景二的需求,需要提取特定CAN信号并转发出去,其中有两个关键点:ID匹配和数值转换。通过canMsg.can_id可以直接获得接收报文或定义发送报文的ID,接下来对数值转换进行说明。数值转换指的是报文的数据场数据(Raw Value)与信号的物理数据值(Physical Value)相互转换的过程。在汽车CAN研发过程中,对数值转换一般采用Excel管理,称之为CAN Matrix进行描述,而每家汽车公司都有自己的模板,但大同小异,vector公司也制定了一种统一的DBC格式的文件来进行描述。主要包含以下主要内容:

①Byte Order,有Motorola和Intel两种;

②Factor,数据场数据的“1”代表物理数据的值;

③Offset,偏移量,与Factor合用,Physical Value = Raw Value * Factor + Offset;

④Startbit,信号的Raw Value在数据场中的起始位置;

⑤Length,信号的Raw Value在数据场中的长度,影响其最大值。

借用BusMaster软件界面,以发动机转速为例进行说明,如图2所示,Byte Order为Motorola,Factor为0.125,Offset为0,Startbit为16,Length为16。如图2解析,数据场数据(Raw Value)的第1和第2字节代表的十六进制数值为4B00,对应十进制数值为19200,计算Physical Value为2400。图中的Raw Value和Physical Value栏的数值框是可以输入数据的,改变其中一个,另一个会自动改变为其对应的值。反之,已知Physical Value,先计算对应的Raw Value(十进制),转为二进制,依据Length高位补0,再依据Startbit放置相应位置,即可得数据场数据。

将代码输入Arduino IDE,如图3所示,通过点击工具栏中“项目”下拉菜单的“验证/编译”,可以检查语法等其他错误,会在最下方的消息框中以红色字体提示,如没有错误,编译完成时则显示如图的白色字体信息。最后可以通过工具栏中“项目”下拉菜单的“上传”来将程序烧录至Arduino UNO。

2  实验

最后进入实车验证阶段,改制一台领克03汽车,将仪表更换为另一家供应商的产品以模拟场景二,改制完成后发现发动机转速、水温、车速均没有示数。

按1.3硬件连接中的方案将芯片接入汽车,如图4所示,发现仪表发动机转速、水温、车速有示数。

主观转发正常,接下来进行数据采集,驾驶工况为自由驾驶,其中147s后为原地驻车踩油门,为了直观所以以发动机转速和车速为例进行说明,结果如图5所示,图中共显示4个信号,ECM_EngSpd,ECM_VehSpd,CAN_EngineSpeed,CAN_VehicleSpeed,分别为ECM外发的发动机转速,发动机接收的车速(ABS发出),ABS侧CAN总线解析出的发动机转速和车速,从图中只看到两条曲线,这是因为CAN_EngineSpeed和ECM_EngSpd基本重合,ECM_VehSpd和CAN_VehicleSpeed基本重合,这表明经过Arduino UNO+MCP2515的转发,各个物理量可以保持原有值,而且转发未出现明显延时。

3  结论

通过实车验证Arduino UNO+MCP2515转发CAN信号方案的可行性,为研发过程中由于CAN信号定义不同步带来的通讯异常提供解决方案,研究结果表明,该方案切实有效。

参考文献:

[1]方友勇.基于CAN总线的多ECU通信系统设计[D].南昌大学,2020.

[2]黄菊花,顾晓辉,曹铭.基于Arduino的CAN通信模块的设计[J].南昌大学学报(工科版),2020,42(04):404-408.

[3]丁雪静,许永辉.基于MCP2515的CAN总线通信单元设计[J].现代电子技术,2015,38(21):60-63.

[4]孙龙,刘晖虎.基于MCP2515的CAN总线控制软件的设计与实现[J].现代信息科技,2018,2(07):1-4,8.

[5]赵琨.基于Arduino的云平台智能家居控制系统设计与实现[D].华中师范大学,2020.