随着石油等化石燃料的日益枯竭、环境问题越来越严重及人们环保意识的逐渐增强,准绿色新型产品-混合动力汽车登上历史舞台,电池是电动汽车的动力,也是电动汽车的关键部件,也是制约电动汽车发展的关键,新能源动力电池产业随同动力汽车获得飞速发展。制约电动汽车发展的重要因素之一是:1、动力电池的使用寿命和安全性;2、动力汽车的生产成本。动力电池的使用寿命能大大降低动力汽车的生产成本。
电池管理系统即BMS通过测量电池组工作时其电压、电流、温度等对电池组进行监测,保证电池组的工作运行良好高效,从而保证整个系统的正常运作。
本文介绍了以飞思卡尔单片机MC9S12XS128为主控单片机芯片,通过传感器DS2438对动力电池组进行电池电压、电流、温度测量、完成AD转换,STCC52单片机对DS2438传输过来的数据进行读取和处理,通过CAN总线传输到主控单片机MC9S12XS128,MC9S12XS128单片机通过读取的数据完成对电池的SOC状态估计,同时,主控芯片将读取的数据通过RS232串口通信传输到VB界面显示。在系统的设计过程中,为建立简单有效的系统,需要建立良好的电池内部模型,以便于对系统做Simulink系统仿真时,主控单片机芯片对电池做SOC状态估计。
关键词 DS2438 STCC52 飞思卡尔单片机MC9S12XS128 VB人机界面
ABSTRACT
With the increasing depletion of oil and other fossil fuels, environmental issues become more and more serious and the gradual increase of the awareness of environmental protection, new quasi-green products - hybrid cars will be on the historical stage and the battery is not only the power of electric vehicle, but also a key component of the electric car. At the same time it is the key to restricting the development of electric vehicles, new energy power battery industry, along with the development of.electric vehicle rapid. An important factor restricting the development of electric vehicles are battery life , security and electric vehicle production costs. The life of the power battery powered vehicles can greatly reduce the cost of production.
BMS battery management systems work by measuring the battery voltage, current, and temperature monitoring of the battery pack. So that the battery pack can ensure a good and efficient operation of the work, so as to ensure the normal operation of the system.
This paper introduces the Freescale MCU MC9S12XS128 as the main control chip microcontroller through the sensor DS2438 battery pack for battery voltage, current, temperature measurement, the completion of AD conversion, STCC52 DS2438 microcontroller to read the data transmitted and processed through CAN bus to the host microcontroller MC9S12XS128, MC9S12XS128 microcontroller through the read data to complete the SOC of the battery state estimation, while the master chip will read the data through the RS232 serial communication transmitted to the VB interface display. In the system design process, in order to establish a simple and effective system, the need to establish a good battery internal model, in order to make the system Simulink system simulation, the host microcontroller chip on the battery do SOC state estimates.
Keywords DS2438 STCC52 Freescale microcontroller VB interface
第一章 绪论
1.1 课题研究背景
自从英国工业开始,煤炭等不可再生的化石能源逐渐代替了传统能源,汽车也逐步取代传统的交通工具,在人们的日常生活中占据越来越重要的。然而,随着世界范围内人类无节制的开采与使用,煤炭、石油等化石燃料逐渐匮竭,能源危机正在加剧,与此同时,科学技术的不断进步与提高,人们的环保意识逐渐增强,环境问题越来越严重,都促使人们去寻找一种更加符合现代化社会需要的新型能源,取代旧的传统燃料电池为汽车提供动力。因此,世界范围内,传统的燃料为动力的汽车逐渐被人们所淘汰,动力电池产业获得了发展的新的转折点,有了质的突破;而新型的以动力电池为动力驱动的动力汽车也获得了各国汽车行业的领头人的重视,飞速的发展,混合动力汽车和纯动力汽车逐步走向人们的视野与生活。
1886年德国制造了世界上第一辆汽车,不过百余年历史,全球范围内汽车保有量已达到7亿辆,汽车逐步取代其他交通工具,与人们的日常生活与工作息息相关。然而众多内燃机汽车(ICEV)每天排放的污染是全球气候变迁的重要原因之一,与此同时,石油资源的逐渐匮乏也使得汽车行业面临严峻考验。因此,因此,汽车行业领头人逐渐意识到研究开发以可再生能源作为动力驱动如酒精,太阳能等的新兴动力汽车是汽车行业发展的必然趋势,也是形势所迫。在这种情况下,混合动力汽车及纯动力汽车以其独特的高性能,环保绿色无污染受到人们的青睐。
1.1.1 混合动力汽车国内外发展现状
所谓新型动力汽车即是以可再生能源作为全部或者部分动力驱动的汽车,主要也即是电动汽车。电动汽车目前主流的有三种:1、是以传统的燃料电池如镉电池等作为动力驱动的传统动力汽车;2、同时能够使用燃油和动力电池作为动力驱动的混合型动力汽车;3、全部以新型动力电池作为动力驱动的纯动力汽车。然而,尽管近几十年以来,尤其是进入二十一世纪以来世界范围内的经济与科技获得了飞速发展,动力汽车行业并未能取得较大的突破,纯动力汽车并没能够批量生产,反而,混合动力汽车有了重大突破。
毫无疑问,各国的汽车行业的领军企业在各个国家的支持下,凭借着远超同行的科学技术,在新兴动力汽车行业先后取得突破,纯动力汽车和混合动力汽车逐步取代了传统燃料电池为动力的动力汽车。
13年,波舍尔公司也即现在的保时捷公司的创始人费尔南德·波舍尔造出了世界上第一车用电动马达,18年制造出了两轮电动汽车即保时捷。目前世界范围内,动力汽车特别是纯电动汽车技术发展较为成熟,技术远超同行的的几个国家美国、日本及德国这几个国家,而只有日本的本田汽车公司和丰田公司能够实现混合动力汽车的批量化生产销售,主导着世界上混合动力汽车市场形势;反观美国,三大汽车公司通用、福特、克莱斯勒-戴勒姆公司相较于日本汽车公司的蓬勃发展在混合动力汽车和蓄电池电动汽车行业则显得有些萧瑟,技术落后很多,仅仅实现了小批量生产。
我国的动力汽车行业起步较晚,但是国家和投入了大量的人力、物力、财力用于自主研发拥有自己品牌的动力汽车,我国电动汽车项目实施以来在燃料电池动力汽车和混合动力汽车方面均取得了重要突破。纯动力汽车已经通过国家的相关体系认证,实现了小规模批量生产;混合动力汽车方面实际生产后动力性能方面接近理论值,在污染气体排放方面降低很多。
1.1.2 电动汽车发展面临的问题
虽然目前国际汽车市场上已有部分公司实现了混合动力汽车的规模化批量生产,但是相对于大多数消费者而言,现有的混合动力汽车无论是在性价比还是车辆性能方面,远远无法满足市场需要,主要是以下几个原因:1、电动汽车的行驶里程有限,无法满足长远距离形行驶要求;2、市场油价过高,由于石油资源的日益枯竭,国际油价始终居高不下;3、电动汽车的动力电池系统使用寿命过于短暂,电动汽车电池管理系统随着电池的损耗,要实时的监控电池的相关信息,缺乏优秀的电池管理系统保障系统的高性能运行;4、电动汽车价格过高,目前市场上投入的电动汽车,由于电池管理系统的研发费用过高,电池使用寿命短暂以及设计的相关技术原因致使电动汽车价格偏高。
车载数据采集系统应用的另一个重要方面是车辆运行工况记录仪,又称汽车“黑匣子”。随着科学技术的飞速发展,美国、欧洲相继不断推出性能优良的车载数字式记录仪,其功能也日趋完善。美国国家运输安全委员会一直在强烈要求汽车生产厂商安装记录仪,在它的推动下 GM、FORD 等大公司已为数百万出厂车安装了行车记录仪。日本汽车研究所研制出的“黑匣子”不仅能够记录车辆事故发生的各种数据,而且它还能自动收入事故发生前 10 秒和后 5 秒之间从驾驶室看到的画面。在我国随着汽车电子工业的不断壮大,在车载记录仪产品方面也有大的发展,由北京森泰克数据通信技术有限公司研制的“绿匣子”多功能汽车行驶监控记录仪,通过了交通安全产品质量监督检测中心和安全与警用电子产品质量检测中心的严格测试,并已正式投入使用。
1.2 电池管理系统BMS在国内外的发展
BMS也即动力电池系统数据采集系统的工作原理是通过对动力电池组进行实时监测,从而将检测的动力电池工作电流、各单体电池电压、电池组运行过程中总电压及电池工作时表面温度等电池相关信息采集并处理,并将采集到的数据传输到预处理单片机芯片中,预处理单片机对数据进行处理和分析,根据温度、电压、电流传感器检测的信息、分析结果,从而对系统各模块发送相应的控制指令,从而实现对于电池组的实时监控,并且将处理后的实时数据显示在人机界面,保证电池组的正常高效运行。
制约电动车发展的主要因素之一是动力电池的使用寿命及安全性和使用成本问题,而电池的使用寿命是降低成本的重要途径之一。为保证动力电池在正常使用的过程中,能够高效稳定的为电动汽车提供动力,降低动力电池由于内部各物质成分之间发生化学变化,造成的电池结构的损坏而导致的寿命,从而降低动力汽车的生产使用成本,从而需要对电池进行良好的管理和维护,从而延长其使用寿命,为此,世界各国汽车行业的领军企业均投入了大量人力、物力、财力对电池管理系统进行研究开发。美国三大汽车公司均将电池管理系统作为技术研发的工作重点。
目前国内外电动汽车数据采集系统普遍存在的问题是数据采集的可靠性和抗干扰性问题。由于电动汽车数据采集要求其硬件装置稳定性好,便携性好,同时其工作环境的复杂也给数据采集工作提出了较高的要求,系统的抗震性,抗干扰性以及对数据的存储能力、系统综合性能等都是需要考虑的重要因素。
1.3 设计总体方案的确立
动力电池系统数据采集系统通过温度、电压、电流数字传感器DS2438完成对于电池组充放电电流各单体电池电压、电池正常工作时表面温度、及电池组供电总电压的测量,完成AD转换,在DS2438内部完成光电耦合隔离,传输到STCC52单片机预处理,STCC52单片机预处理后的数据经由CAN总线传输到MC9S12XS128主控单片机芯片,主控单片机完成最终数据的反馈,各控制指令的发送,控制各模块完成动力电池系统的监控反馈工作,必要时显示在人机界面,其控制系统图如图1-1所示。
图1-1 数据采集系统
1.4 小章总结
本章主要介绍了一些关于动力电池系统数据采集系统的相关信息主要由以下内容:
1)动力电池系统数据采集系统相关课题的研究背景;
2)混合动力汽车的发展历程及现在国内外发展现状及现在面临的问题;
3)电池管理系统BMS在国内外的发展现状;
4)课题最后的方案的确立,将别业设计设研究的课题的相关内容的大体框架勾勒了出来。
通过本章关于动力汽车系统数据采集系统的一些信息的简要介绍,明确了课题研究的重点与难点,为后续的相关工作明确的方向。
第二章 系统方案的确立
动力电池系统数据采集系统数据所需要的硬件模块主要有传感器模块、光电耦合隔离、数据采集部分处理器、主控单片机芯片及数据传输通信模块五个模块构成,下面将对这五个部分分别进行论证和确立最终方案。
2.1 传感器
在前期做开题报告时选择了两种可选方案:一种是采用分立式数据采集,即各电芯电压值、总电压值、充放电电流值以及温度信息分别采用不同传感器。另一种是新一代智能电池监测芯片DS2438对动力电池系统电压、电流、温度进行统一测量。通过对这两种方案做深入的对比分析以确定最终的方案。
方案一:DS18B20对温度的测量;霍尔电流传感器采集电流信号;基于底层ECU的电压测量。
DS18B20是一种新型的智能温度传感器。其具有的特点:1、在实际的温度测量系统中可以串联使用多个DS18B20并联使用;2、负压特性,即使当供电电压源极性接反时,温度测量模块不会被烧毁,但是不能正常使用;3、支持多点组网功能;4、能够通过编程的方式实现数字式读写;5、使用者可以根据实际需要自行设定温度警戒上下限;6、可以通过串行通讯线USB可以给DS18B20供电,7、采用单总线实现了传输数据到微处理器;8、在实际使用时不添加别的外围元件也能单独使用。
霍尔电流传感器(以下简称传感器)的特点[1]: (1) DS18B20内部采用的是补偿测量温度,因此具有优于一般传感器的精确性和线性度; (2) 和别的普通的电流传感器一样,DS18B20的输入和输出之间内部自带有光电隔离电路,不需要搭建外围隔离电路;(3) 传感器磁路几乎是零磁通工作,在正常运行传输瞬时采集数据时补偿工作,所以传感器是无电感性的元件;(4) DS18B20本身是一个闭环回路系统,所以能够不失真的传输电流信号。
每种传感器都可以精确的实现数据采集,而且都具有较好的抗干扰能力。但使用分立式数据采集存在电路结构复杂,处理器负载大,检修困难等缺点。
方案二:使用新一代智能电池监测芯片及温度电压电流传感器于一身的传感器DS2438对电池电压、电流、温度进行统一测量。
DS2438具有功能强大、性能优越、高度集成化、硬件电路接线简单等优点,能够自动采集动力电池电压,电流和温度等实时参数,并将这些易失型数据放在内部集成的EEPROM存储空间中,STCC52单片机根据需要发出命令读取这些参数,然后处理这些参数,显示电池的工作运行状态。与方案一相比具有如下特性[2]:
(1)通过一条单总线与单片机进行通信,避免了由于电池组数量线路的紊乱;
(2)DS2438内部自带有数字温度传感器,从而减少相应的数模转化接线排布;
(3)DS2438内部自带有电压电流温度AD转换,能够识别充放电流是否完成;
(4)DS2438内部集成有积分电流累加器,能够对于动力电池的充放电电流相关信息予以实时记录,从而为MCU为电池做SOC状态估计片;
(5)4个字节的历时计数器;
(6)DS2438内部集成有40个字节的EEPROM用于存放非易失性的动力电池相关信息,如动力电池的相关参数等。
相对比于DS18B20,DS2438最大的特点是其灵敏度较高,而DS12B20其测量灵敏度±0.5℃,而在电池组工作运行时,由于电池表面温度变化范围较小,±0.5℃远远不能满足系统所需。
综上所诉,方案二在实用性、功能、成本等方面都优于方案一,故我们确定使用DS2438作为本项目的数据采集传感器。
2.2 光电隔离
在实际的动力电池系统数据采集系统中,由于常常需要采集多处电池的相关信息,而且电池所在的地方往往处于高电压周围,因此,需要采用总线结构完成相关数据的传输工作,但是在数据的传输过程中需要避免输入与输出之间的相互干扰,同时又不能影响信号的传输速率,因此一般来说都是采用光电耦合隔离处理,较为常见的是6N137/6N138予以控制系统的光电隔离。
光电隔离是通过将发光二极管和光敏三极管集成于一体,利用发光二极管的伏安特性和光敏三极管的伏安特性的组合完成中间电-光-电的相关信号转换,从而实现输入和输出信号的隔离,避免了输入和输出信号的相互干扰。
利用光电耦合隔离对本项目中的模拟输入输出数据、数字输入输出及通讯进行隔离处理,使测控、处理装置与现场信号之间,人机交互处理中心所在的弱电和动力电池组所在的强电之间仅仅保持信号的传输,不直接发生电气的联系,从而可以保证系统运行更加稳定。6N136同时具有电压、电流和温度补偿功能,同时,6N136采用高度集成化,抗干扰能力强,数据传输速度快,信号不失真等优点,可以很好的满足本系统的要求,所以采用6N136或6N137作为本系统光电耦合器件。但是在使用的过程中,需要注意的是光电耦合隔离对于动力电池系统电流的传输速率较低,因此选取光电隔离时光敏三极管的负载电阻阻值需要适宜,既不影响输出的电压的幅值,同时保证了数据的传输速率。
2.3 数据采集部分处理器
数据采集中所用单片机需要对数据进行A/D值的换算、数据辨别分类处理和与总线进行数据交换,拟采用51单片机。因确定采集系统采用DS2438,其片内自带A/D转换器,故数据采集单片机仅需完成数据辨别分类处理和与总线进行数据交换。所需单片机无需太过高级,其稳定性更为重要。51单片机诞生至今已有几十年的时间,其技术成熟,运行稳定[4],而且其功能完全可以满足本项目的要求。其具备如下功能和特点:
1、可以仿真63K程序空间,接近K 的16位地址空间,满足DS2438采集程序和数据通信程序的要求:
2、拥有全部K 的16位地址存储空间;
3、拥有4组32个IO引脚,DS2438为单总线通信,仅需一个I/O引脚;
4、可以在仿真环境下进行单步、断点、全速运行等操作;
5、可以使用C语言或者汇编语言编写相应软件进行相关调试 ;
6、STCC52应用范围广,使用者可以根据实际系统的需要自行选择相应的晶振平率。
本次动力电池系统数据采集系统中选用的是宏晶科技生产的新一代8051单片机,其生产的STCC52单片机完全兼容传统8051单片机指令代码,性能稳定且价格低,符合本系统对数据采集用微处理器的要求。
2.4 主控制器
主控板是电池管理系统的核心,它一方面完成与上位机的通信功能,即将系统电压、电流、温度和 SOC 等信息实时显示和绘制图表,并接受上位机的控制信息,实现对整个系统的实时控制;另一方面管理系统的 CAN 子网,接收来自采集板的数据即电池组的电压、电流以及温度,并将采集到的数据存储起来。然后将采集到的数据进行电池组 SOC 的估算。因此,对控制器具有相当高的要求。首先,要具有足够高的总线工作速度,因为主控制器不仅要完成数据采集功能,还要进行复杂的SOC估算,因此,必须有足够高的总线速率作为支持。其次,要有足够丰富的引脚。因为,主控机除了要完成数据采集、处理以及与上位机的通信的功能外,还应具有故障报警、故障处理等功能,引脚过少不足以满足本实验的要求。最后,还应集成CAN模块,因为整个系统是依靠CAN总线进行通信的,如没有CAN模块实现起来比较复杂。
目前比较常用的51系列的单片机,操作虽然比较简单,但工作速率不高,引脚也太少,不能满足本实验的要求。ARM虽然具有足够高的工作速率以及丰富的引脚,但学习起来比较困难,而且没有集成CAN模块,因此实现整个系统的通信有些困难。对于飞思卡尔半导体公司的 MC9S12XS128单片机,其内部集成了CAN总线模块,可以实现整个系统的通信,高达80 MHz的总线速度,可以实现数据的快速处理,而且具有丰富的外部引脚,可以充分满足本实验的要求[5]。除此之外,我院刚建立了飞思卡尔实验室,使用的就是16位的飞思卡尔单片机,而且有经验丰富的老师作为指导。故本实验选用飞思卡尔半导体公司的 MC9S12XS128单片机作为主控芯片。
2.5 数据传输
2.5.1 控制器间的数据传输
不论是8位16位单片机还是32位单片机,也不论是STCC52单片机还是MC9S12XS128单片机,单片机的基本系统模块之间都是通过异步串行通信接口实现的。而串行通信方式是人与计算机之间实现人机交互的基本通信方式。
单片机系统里,常见的串行接口有:SPI接口、CAN总线接口标准(增强型)、UART接口、USB接口、I2C总线接口等。在搭建实际的控制系统中,使用较为常见的是USB接口和CAN总线接口。
在本次的数据采集系统中,由于需要模拟实际系统的需要,因此采集的动力电池组各方面信息较多,如果采用一般的接线方式,预处理单片机与主控单片机之间的通信线路会非常的杂乱无章,而且,在实际系统中,预处理单片机和主控单片机之间的距离会较远,因此采用CAN总线的方式实现预处理单片机与主控单片机之间的通信会非常方便,只需要一根数据线即可将所有的数据汇总到主控单片机。
CAN控制器是Controller Area Network,即控制器局域网。在控制系统中使用CAN总线结构,能够简化系统中的线路。CAN总线模块的功能是实现对于由于连接在CAN总线上的数据的接受和发送,即预处理单片机上接收数据,并且将数据传输到主控单片机上,同时接受主控单片机发送的控制指令,传输到预处理单片机。CAN总线的传送速率影响着CAN总线的物理长度,这是由CAN的应答机制决定的,当接收模块接收到CAN总线发送的信息时,必须在CAN总线的应答间隙时间内,发送一位显性电平,表示已成功接受。CAN总线本身内部的集成模块决定自身有很强的抗干扰能力。
本次设计中选取的是MCP2515作为CAN总线结构。MCP2515 是一款CAN控制器。该器件主要由三个部分组成:
1. CAN 总线模块包括三个发送缓冲器和两个接受缓冲器;
2. 用于保障MCP2515正常运行的相关器件及存储器;
3.同步串行接口 SPI 协议模块。
由于MCP2515采用SPI总线作为接口与单片机进行通信,故接口相对于SJA1000的并行接口要简单,而且数据传输稳定,因此最终采用MCP2515作为本系统的CAN控制器。
2.6 动力电池放电模型及SOC估计算法
为了在实验之前初步了解锂离子电池的各方面特性,需要建立电池的数学模型和SOC估算算法的仿真研究,获得电池性能参数(放电电流、端电压、剩余电量等)随放电时间的变化规律[10]。将这一规律作为以后实验校验采集的电池数据和SOC估算值的理论依据。
(1)电池放电模型
图2-1 简化的等效电路模型
简化的等效电路模型可以写成
(2.1)
(2.2)
其中
(2.3)
(2.4)
是噪声矩阵,;和分别表示过程噪声和测量噪声,用以表征动力电池工作时受到的未知干扰。
将和进行一阶Taylor 展开,得
由式(2.3) 和式(2.4) 所示的动力电池的非线性模型线性化为
(2.5)
(2.6)
其中
将线性化模型离散,得到电池的线性离散模型
(2.7)
(2.8)
将(2.7)、(2.8)两式转化为MATLAB/ Simulink里的电池模型如图2-2所示,程序如图2-3所示。
图2-2 MATLAB/ Simulink电池模型
(2)算法的仿真测试
在建立的电池模型基础上,进行扩展卡尔曼滤波仿真。步骤如下:
非线性系统的状态空间模型为
(2.9)
(2.10)
其中,和是的零均值高斯白噪声,协方差矩阵分别为和。
定义
初始化,时刻,令
a)先验状态估计;
b)误差协方差矩阵;
c)卡尔曼增益;
d)状态估计更新;
e)误差协方差矩阵更新。
MATLAB程序如图2-4所示,在已经搭好的电池模型上使用该算法得出仿真曲线如图2-5~2-10所示。
图2-5放电电流 图2-6 电容器电压
图2-7 SOC估算值 图2-8 SOC估计值与实际值比较
图2-9 电压测量与实际值比较 图2-10 SOC估计误差图
2.7 VB人机界面
VB人机界面在前期工作中我们建立了一个VB显示界面,可选择需要显示的界面,细化了和增加了显示内容和功能,具体有如下:
1、充分考虑各单体电池的差异性,对它们分别进行电压、电流和温度的采集,从而估算出各自的SOC。
2、充分利用了VB在工业领域应用的优势,最大程度上增强该软件的可移植性,为今后应用于工控机等其他平台做好准备。
3、在实际中整个动力电池组中的电芯数量可能会多达几百个,在这种高压应用场合,使用光电耦合元件,在保证系统数据安全的同时也可保证驾驶员及乘客人身安全。
4、采用分步式设计方法对该系统进行设计。各模块相互,通过总线进行通信,提高了系统的可靠性,同时也使该系统易于维护和扩展、升级
2.8 本章小结
本章主要介绍了设计中动力电池系统数据采集系统中所用各模块的选取以及在实际应用系统时,元件的确定。
(1)主要介绍了数据采集系统中预处理单片机和主控单片机的选取以及温度度、电流、电压传感器的选取;
(2)简要的介绍了系统中主控单片机和预处理单片机数据交换间的通信方式的选择;
(3)本章最后简要的描述了电池模型的确立,为后续工作做准备。
第三章 硬件电路模块
动力电池系统数据采集系统其主要任务是对电池组完成电池组总体电压、各单体电池电压、电池工作电流及电池表面温度的测量,DS2438完成以上任务并且对于采集的数据完成AD转换,并且将数据传输到预处理单片机STCC52单片机,在实际使用时,由于需要测量的动力电池组比较多,而且位置分布会相隔远,难以对每个动力电池组均配以MC9S12XS128予以分别处理数据与显示,而且MC9S12XS128单片机芯片价格相对于STCC52来说要贵很多,用STCC52单片机处理单组电池来说完全足够,因此选择STCC52单片机完成对于DS2438测量数据的处理工作,为了使数量较多的测量的动力电池组的工作状态清晰有条理的显示,方便管理,因此选择MC9S12XS128作为主控单片机芯片,完成和人机界面的交互协作,在主控单片机和预处理单片机之间选择CAN总线,而人机界面和主控单片机之间选择RS232串行通信,系统的结构框图如图3-1所示。
图3-1 系统硬件结构图如上
3.1 数据采集模块DS2438
DS2438经过前期的实验和比较验证,最终确立采用DS2438作为系统的数据采集传感器。DS2438作为数据采集模块的最大困难是它采用1—Wire单总线通信,DQ是它唯一的I/O口,单总线结构简单,但它的编程及调试是一大障碍,经过努力,成功实现了单片机与DS2438的单总线通信。
3.1.1 DS2438硬件部分
其结构图如图3-2所示。
图3-2 DS2438硬件电路
DS2438的封装引脚图如图3-3所示。
图3-3 DS2438封装引脚图
各管脚说明描述如下:
1 GND 接地;
2 VSENS+ 电池组电流测量输入午安(+);
3 VSENS- 电池组电流测量输入端(-);
4 VAD 电池组电压测量输入端;
5 VDD 供电电压端;
6,7 NC 悬空不接;
8 DQ 数据单总线输出端。
3.1.1 DS2438AD转换分压电路
DS2438电压分压测量部分电路如图3-6所示。
图3-6 分压测量电路
DS2438在测量电池组电压时,系统中使用的是分压测量法,内部AD转换的满量程值为10 V左右,有10位的分辨率,分辨率为10 mv,所以当电池组的电压较低接近于0 V时,测量转换结果不准确,因此在实际进行系统测试时,当电池电压低于2.4 V时需要更换电池组,以使测量结果更加准确。
单节蓄电池端电压12V,DS2438芯片AD数模转换范围0~10V。例如当选定一个电阻1KΩ,未知分压电阻设为R计算公式如下:
(3.1)
得R=390Ω,U实际为实际单节蓄电池的电压,U测量为DS2438测量的电压值,根据如下公式,可以在单片机中完成测量值转换为实际值。
(3.2)
3.1.2 DS2438低通滤波部分
低通滤波部分电路如图3-7所示。
图3-7 低通滤波电路
对电流的采集电阻的选择,应不影响电池的使用,顾选择小阻值电阻,且电阻精度要求高。设计采用Rsens=1KΩ电阻。为了抵抗电池干扰,设计RC低通滤波器。通过计算选择R:100K,C:0.1uF,截至频率为:
(3.3)
AD转换频率36.41Hz,可以有效地滤除剑锋脉冲,保障电流累加器准确获取采样信号。
3.2 STCC52模块
STCC52模块在本系统中的硬件电路连接图如下图3-8所示。
图3-8 STCC52硬件电路
STCC52单片机由CPU、数据存储器RAM、程序存储器ROM、特殊存储器、4个I/O口、串行口、定时器/计数器、中断系统等八个功能部件组成。结构图如图3-8所示。
图3-8 单片机内部结构
3.2.1 单片机复位电路
单片机复位电路是单片机最小系统的主要组成部分之一,复位电路给单片机在系统的调试时提供方便,其中外部复位电路可以通过使用简单的按钮加电阻电容构成,也可以使用专门的复位电路集成芯片。如果是使用的复位电路集成芯片,需要注意的是,在使用BDM调试工具时,主控单片机芯片和复位电路芯片时钟的兼容性。本次设计使用的是电阻电容构成的外部复位电路如图3-9所示,其主要有10μF的电容、1K的电阻及复位按钮构成,当复位按钮按下时,复位电路提供一个高压电平信号使单片机复位。
图3-9 STCC52复位电路
3.2.2 单片机晶振电路
单片机的晶振电路的布局需要考虑到以下情况,只有按照相应的规则布置线路,才能使得系统的电磁兼容性得到保证。首先,晶振电路需要尽量的靠近单片机的外部时钟电路接线引脚,才会使得电路的焊接较为简单。
STCC52的引脚XTAL1和XTAL2与电容C8、C10和晶体振荡器按图2-3所示的方式进行连接。晶振和电容C8、C10及片内的与非门共同构成了电容三点式振荡器,振荡信号的频率与电容C8、C10的容量及晶振的频率有关,但振荡信号的频率主要是由晶振的频率来决定的,其范围在0~33MHz之间,电容C8、C10取值范围在5~100pF之间。由于本设计需要进行串口通信,而采用11.0592MHZ做系统的外部晶振可以产生标准的波特率。其他频率的的晶振会产生累积误差,因此晶振选择11.0592MHZ,电容取值为100pF。原理图如下图3-10所示。
图3-10 STCC52晶振电路
3.3 CAN及RS232串行通信模块
3.3.1 CAN总线通信模块
在本次的数据采集系统中,由于需要模拟实际系统的需要,因此采集的动力电池组各方面信息较多,如果采用一般的接线方式,预处理单片机与主控单片机之间的通信线路会非常的杂乱无章,而且,在实际系统中,预处理单片机和主控单片机之间的距离会较远,因此采用CAN总线的方式实现预处理单片机与主控单片机之间的通信会非常方便,只需要一根数据线即可将所有的数据汇总到主控单片机。
CAN总线模块要实现的功能是将DS2438传感器检测的动力电池组的电池组总体电压、各单体电池电压、电池充放电电流及电池表面温度等传输过来的信息,预处理单片机STCC52传输进来的以及主控单片机MC9S12XS128发送的相关控制指令信息进行统一汇总接收与发送。发送数据时,首先将信息存储到相应的数据缓存器和控制寄存器中,然后,通过对SPI内部控制寄存器的相关位进行设置操作,或者通过对使能引脚进行操作,从而实现数据的开始发送。通过读取相应的控制寄存器的各个位的值,了解数据传输的相关状态,如是否正常发送与接收,数据接收是否完成,能否开始下一轮的数据传输等等信息。
CAN总线发送数据和主控单片机一样,有数据发送优先级,是指MCP2515内部等待发送的接收到的存储在缓存空间的数据的优先级,在发送起始SOF之前,MCP2515将存储的等待发送的信息进行优先级的比较,如果两个缓存空间的数据优先级相同,则优先发送数据存储编号较高的。
CAN总线通信在系统中的硬件电路连接图如下图3-11所示。
图3-11 CAN总线通信硬件连接图
CAN总线的典型系统实现方法如下3-12所示。
图3-12 CAN总线实现方法
由于在本次实际系统设计中,使用了MCP2515部分引脚,特将部分引脚功能说
明如表3-1所示。
表3-1 引脚功能图
名称 | 引脚标号 | 引脚功能图说明 |
OSC2 | 8 | 时钟震荡器的输出引脚 |
OSC1 | 7 | 时钟震荡器的输入引脚 |
INT | 11 | 中断输入引脚 |
SCK | 12 | SPI时钟输入引脚 |
SI | 13 | SPI数据输入引脚 |
SO | 14 | SPI数据输出引脚 |
CS | 15 | SPI片选输入引脚 |
RS-232是IBM-PC及其兼容机上的串行连接标准。在许多的途径中都能应用,比如用来连接打印机和鼠标,同时它也可以用于工业仪器仪表的连接。连线和驱动的改进也可以用起来实现,在实际的日常生活中使用的RS-232的传输的速度或者是传输长度通常是超过标准值的。RS-232只是局限于PC串口与设备之间的点对点的通信。RS-232与单片机的硬件接线图如3-11所示。
图3-11 RS-232与单片机的硬件接线图
3.4 本章小结
本章主要介绍了动力电池系统数据采集系统的硬件电路,主要由以下内容:
1)DS2438的各部分功能及在实际系统中的硬件电路连接图,同时介绍了系统使用的部分引脚;
2)STCC52预处理单片机硬件电路连接图及晶振时钟、复位电路;
第四章 数据采集系统软件部分
本章主要介绍了动力电池系统数据采集系统的软件部分,即DS2438电压电流温度监测模块数据采集程序、CAN总线通信模块MCP2515软件部分及主程序部分。
4.1 DS2438数据采集程序
4.1.1 DS2438的软件工作
电量采集流程图如图4-1所示。
图4-1 电量采集程序流程图
电压电流温度的测量流程图如图4-2所示。
图4-2 电压电流温度程序采集流程图
4.1.2 DS2438内部测量原理
利用DS2438测量电流、温度以及电压的原理如下:
(1) 电流
(4.1)
(4.2)
DS2438内部电流转换映射表如图4-1所示。
表4-1 电流转换映射表
27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
I是所测电流,Current Register是电流寄存器值,ICA是电流累加器值。
DS2438调整电流数模转换过程如下:
1)向偏置寄存器写入0;
2)驱动低电流通过上拉电阻;
3)读取DS2438内部电流寄存器值;
4)通过在状态/配置寄存器置" 0 "IAD位,关闭电流模数转换器;
5)改变当前读取的电流寄存器的值的符号,转换成二进制补码的形式,并将结果写入偏置寄存器中。
6)通过将状态/配置寄存器中的IAD位置1,开启电流模数转换器
DS2438内部电流测量及转换软件实现方法如下:
unsigned int DS2438_Read_Current(unsigned char x)
{
unsigned char temp_C[9];
unsigned int Current;
// DS2438_init();
// WriteOneChar(DS2438_CMD_ROM_SKIP);
// WriteOneChar(DS2438_CMD_MEMORY_CONVERTV); //0xB4
// DelayMs(10);
DS2438_init(x);
WriteOneChar(DS2438_CMD_ROM_SKIP,x);
WriteOneChar(DS2438_CMD_MEMORY_RECALL,x); //0xB8
WriteOneChar(0x00);
DS2438_init(x);
WriteOneChar(DS2438_CMD_ROM_SKIP,x);
WriteOneChar(DS2438_CMD_MEMORY_READ_SCRATCHPAD,x); //0xBE
WriteOneChar(0x00);
for(i=0;i<9;i++)
{
temp_C[i]=ReadOneChar(x);
}
// SendStr(temp_C);
Current=(temp_C[6]&0x7f)*256+temp_C[5];
return(Current);
}
(2) 温度
表4-2 温度转换映射
2-1 | 2-2 | 2-3 | 2-4 | 2-5 | 0 | 0 | 0 |
S | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
温度测量软件部分程序如下:
unsigned int DS2438_Read_Temperature(unsigned char x)
{
unsigned char temp_T[9];
unsigned int Temperature;
DS2438_init(x);
WriteOneChar(DS2438_CMD_ROM_SKIP,x);
WriteOneChar(DS2438_CMD_MEMORY_CONVERTT,x); //0x44
DelayMs(100);
DS2438_init(x);
WriteOneChar(DS2438_CMD_ROM_SKIP,x);
WriteOneChar(DS2438_CMD_MEMORY_RECALL,x); //0xB8
WriteOneChar(0x00,x);
DS2438_init(x);
WriteOneChar(DS2438_CMD_ROM_SKIP,x);
WriteOneChar(DS2438_CMD_MEMORY_READ_SCRATCHPAD,x); //0xBE
WriteOneChar(0x00,x);
for(i=0;i<9;i++)
{
temp_T[i]=ReadOneChar(x);
}
// SendStr(temp_T);
Temperature=(temp_T[2]&0x7f)*256+temp_T[1];
return(Temperature);
}
(3) 电压
表4-3 电压转换映射表
27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
0 | 0 | 0 | 0 | 0 | 0 | 29 | 28 |
电压测量及转换部分软件实现如下:
unsigned int DS2438_Read_Voltage(unsigned char x)
{
unsigned char temp_V[9];
unsigned int Voltage;
DS2438_init(x);
WriteOneChar(DS2438_CMD_ROM_SKIP,x);
WriteOneChar(DS2438_CMD_MEMORY_CONVERTV,x); //0xB4
DelayMs(10);
DS2438_init(x);
WriteOneChar(DS2438_CMD_ROM_SKIP,x);
WriteOneChar(DS2438_CMD_MEMORY_RECALL,x); //0xB8
WriteOneChar(0x00,x);
DS2438_init(x);
WriteOneChar(DS2438_CMD_ROM_SKIP,x);
WriteOneChar(DS2438_CMD_MEMORY_READ_SCRATCHPAD,x); //0xBE
WriteOneChar(0x00,x);
for(i=0;i<9;i++)
{
temp_V[i]=ReadOneChar(x);
}
// SendStr(temp_V);
Voltage=(temp_V[4]&0x03)*256+temp_V[3];
return(Voltage);
}
4.2 MCP2515软件程序部分
MCP215作为一种控制其局域网络CAN协议控制器,自带有两个验收屏蔽寄存器和留个验收滤波寄存器能完成过滤不想要的报文任务,所以大大减少了主控单片机MCU的开销。
MCP2515中断处理过程流程图如图4-3所示。
图4-3 MCP2515中断处理流程
void mcp2515_write_can_id(unsigned char mcp_addr,
unsigned char ext,unsigned long can_id)
{
unsigned int canid;
unsigned char tbufdat[4];
canid = (unsigned int)(can_id & 0x07FF); /* 标准Id11位,只取低11位 */
if(ext==0) /* 只接受标准ID,对扩展ID无操作
{
tbufdat[MCP_SIDH] = (unsigned char)(canid/8); /* ID高8位写入SIDH中 */
tbufdat[MCP_SIDL] = (unsigned char)((canid & 0x07)<<5); /* ID低3位写入SIDL的高三位 */
tbufdat[MCP_EID0] = 0; /* 无EID,EID0、1为0 */
tbufdat[MCP_EID8] = 0;
}
mcp2515_setRegisterS(mcp_addr,tbufdat,4);
}
MCP2515内部SPI软件流程图如图4-4所示。
图4-4 SPI度指令操作软件过程
相应的软件处理过程如下所示:
void SPISendByte(unsigned char dat)
{
unsigned char i;
CS = 0; /* 整个过程CS为低电平,可在外部控制写多个字节数据 */
Delay_Us(10); /* CS建立时间,大于50ns即可 */
for(i=0;i<8;i++)
{
SCK = 0; /* 低电平时允许总线数据变化,上升沿MCP2515接收数据 */
Delay_Us(1);
if(dat & 0x80)
SI = 1; /* 向总线输出数据 */
else
SI = 0;
Delay_Us(1); /* 数据建立时间,大于10ns即可 */
SCK = 1;
dat = dat<<1;
Delay_Us(1); /* 数据保持时间,大于10ns即可 */
}
}
4.3 本章总结
本章主要介绍了DS2438在动力电池系统数据采集系统中,其正常工作时内部各个部分如电池正常工作时表面温度、电池组向外界供电时总体电压、各单体电池电压等在DS2438内部的工作流程,以及MCP2515在进行CAN总线传输时内部处理过程。
第五章 数据采集系统设计成果
动力电池系统数据采集系统最终实现的功能是通过电池电压、充放电电流及电池表面温度等数据传感器监控电池组,并且将采集到的数据传输到数据控制中心,最终由MCU即主控单片机实现对于数据的相关处理操作,并且主控单片机根据收集到的信息发出相应的控制指令到各个模块,从而实现对于动力电池组的实时监控,在必要时还需要将处理后的数据发送到人机界面,从而方便操作人员更好的知道电池组的工作运行状态。
本次设计中,由于各个方面的原因,数据采集系统在简单易于实现方面同时兼顾实用性,最终完成了系统的设计,是系统能够良好的对与电池组进行数据采集,并且显示在结果。
下图5-1显示了数据采集系统对于采集到的电池正常运行时工作的相关信息,在人机界面的显示,操作人员能够很清晰的了解电池而的工作状态,通过电池组之间的数据对比,知道是否工作在正常状态。
图5-1 电池组运行状态在VB界面显示
下图5-6显示的是电池组的相关运行状态。
图5-2 数据采集系统人机界面显示结果
数据采集系统采集到的电池组的相关信息如下表5-1所示.
表5-1 数据采集系统信息采集生成表格
第六章 展望 总结
在经过大四接近一年的学习中,对于整个动力电池系统数据采集系统,有些硬件部分如人机界面VB与主控单片机MCS12XS128的数据交换部分虽然整体任务完成,但是仍存在部分问题,总体上完成了数据采集系统的硬件电路的焊接等,如温度、电压、电流传感器DS2438的选择,预处理单片机MCC52的选择,以及在实际中使用数据采集系统时由于实际的需要,对于每一处动力电池系统都用一个单片机处理极及显示不经济合理,故此采用了总线结构等等问题,再上面的论述中均有解决。现对课题完成的主要工作及成果总结如下:
(1)完成了监测集成系统硬件和软件的设计,使系统能够按照预期的目标通过电压监测控制其充电程序。
(2)数据采集器采用专用电池监测芯片DS2438和单片机为核心组成,实现数据的传输,开发成本低,通信质量可靠。
(3)本系统采用集成开发环境,它集程序的编辑、编译、链接、调试以及仿真等功能为一体。具有友好的交互界面、下拉菜单、快捷键和快速访问命令列表等,使人们的编程、调试工作更加方便且高效。
(4)全部程序均采用模块化设计思想,程序的注释和文档也比较充足,不仅在设计时结构清晰,易于检查和修改,而且为以后软件的维护和改进提供了方便。
需要说明的是,尽管系统设计已经完成。但是由于时间以及经验的,研究中还存在诸多不足,该系统还有待进一步完善和深入研究:
(1)进一步学习单总线技术理论,掌握单总线程序设计的思想和方法,在今后的工作中能将其更灵活地运用。
(2)深入学习单片机原理,在程序编写方向作深入研究。
(3)了解蓄电池的在线监测手段。。
致 谢
在论文即将完成之际,由衷感谢马彦老师在毕业设计完成过程中给与的悉心指导,在毕业设计遇到问题的时候,马彦老师总会给出宝贵的建议与教导,从而使问题得到的解决,正是在马老师的指导下,毕业设计才能一步步地完成,所设计的系统才能呈现在大家面前。在我大四将近一年的生活中,马老师无论在学习上还是在日常生活中,都给予了我很大的帮助,令我受益良多。这次毕业设计,我们学到的不仅是毕业设计上面的东西,更是从马老师的为人上受益匪浅,马老师在工作上严肃认真,让我们在大学四年养成的惰性在这次做毕业设计的时候完全消失了,就拿毕业设计的开题报告说吧,一般别的同学只需要在需要交开题报告的前些天摘抄一些相关的资料复制粘贴在报告中就完成了毕业设计的开题,但是马老师对我们严格要求,在我们从跟随马老师做毕业设计的那一天开始,马老师就让我们开始学习研究毕业设计需要用到的所有技术,并且每过一周,马老师都会对我们的进度进行检查,让我们不敢懈怠,让我们在一开始就打下了坚实的基础,这也就造成了我们这一组在做毕业设计的时候很多同学都来咨询我们学术上的问题,而对我们来说这些问题已经早就解决过了,在此特别感谢我们的马老师。在此向马老师表示深深的感谢!
其次感谢周秀文、姜守坤、杨荣斌等周围同学在毕业设计过程中给与的帮助,在毕业设计的过程中,经常会遇见各种困难及细节性的错误,他们都会耐心的指正,从而使问题得已解决处理,正是在他们的帮助下,我的毕业设计能够更好的完成!
参 考 文 献
[1] 秦祖荫,霍尔电流传感器的性能及其使用,《电力电子技术》1994年4期
[2] 郭海帆等,基于DS2438芯片的智能电池监测系统,西安电子科技大学
[3] 李丹荣,杜维.光电藕合器的实用技巧[J].自动化仪表,2003(6):58-61.
[4] 齐志才,赵继印. MCS-51系列单片机原理与接口技术,中国建筑工业出版社,2005.6
[5] 薛涛等,单片机与嵌入式系统开发方法,清华大学出版社,2009.10
[6] 缪学勤, 现场总线技术的最新进展, 自动化仪表, 2006.6
[7] 王黎明等,CAN现场总线系统的设计与应用,计算机科学与技术,2008.3
[8] 来清民,手把手教你学CAN总线,北京航空航天大学出版社,2010.9
[9] 张生, RS-232 RS-422 RS-485的根本区别, 2007.11
[10] 林成涛, 仇斌, 陈全世.电流输入电动汽车电池等效电路模型的比较.机械工程学报.2005,41(12):76-81.
[11] P. Sabine, P. Marion, J. Andreas. Methods for State-of-charge Determination and Their Applications. Journal of Power Sources. 2001, 96(1): 113~120.
[12] S. Rodrigues, N. Munichandraiah, A. K. Shukla. A Review of State-of-charge Indication of Batteries by means of Impedance Measurements. Journal of Power Sources. 2000, 87: 12~20.
[13] F. Huet. A Review of Impedance Measurements for Determination of the State-of-charge or State-of-health of Secondary Batteries. Journal of Power Sources. 1998, 70(1): 59~69.
[14] W. X. Shen, C. C. Chan, E. W. C. Lo, and K. T. Chau. Adaptive neurofuzzy modeling of battery residual capacity for electric vehicles. IEEE Trans. Ind. Electron. June 2002, 49(3):677-684.
[15] A. Salkind, C. Fennie, P. Singh, T. Atwater and D. Reisner. Determination of state-of-charge and state-of-health of batteries by fuzzy logic methodology. Journal of Power Sources. 1999, 80(1):293-300.
[16] S. Grewal, and D. A. Grant. A novel technique for modeling the state of charge of lithium ion batteries using artificial neural networks. In Proc. IEEE ITEC, Bristol Univ.UK, 2001:174-179.
[17] Yoshifumi Morita, Sou Yamamoto, Satoshi Kakogawa and Naoki Mizuno. On-Line Detection System of State-of-Charge in Lead Acid Battery Using Multiple Detectors. The 33rd Annual Conference of the IEEE Industrial Electronics Society (IECON). Taipei Taiwan, 5-8 Nov 2007:2493-2498.
[18] C. Ehret, S. Piller, W. Schroer. State-of-charge Determination for Lead-acid Batteries in PV-applications. European Photovoltaic Solar Energy Conference. 2000: 1-4.
[19] G. Plett. Extended Kalman filtering for battery management systems of LiPB-based HEV battery packs. Part 3: State and parameter estimation. Journal of Power Sources. 2004, 134 (2):277-292.
[20] D. Di Domenico, G. Fiengo, and A. Stefanopoulou. Lithium-ion battery state of charge estimation with a kalman filter based on a electrochemical model. Proceedings of 2008 IEEE Conference on Control Applications. 2008:702-707.
附 录
主程序模块
#include #include "derivative.h" /* derivative-specific definitions */ #include"Initial.h" #include "mcp2515.h" #include "mcp2515_bittime.h" unsigned char i,len,res,Sta_Int; unsigned int j; unsigned char sendbuf[4]={1,1,1,1}; unsigned char recbuf[8] ; unsigned char Send_Flag; unsigned char recbuf_wendu[18] ,recbuf_dianya[18] ; void main(void) { unsigned char Count; PLL_Init(); IRQ_Init(); IO_Init(); Init_Can(); //PIT_Init(); PORTB=0x55; Send_Flag = 1; EnableInterrupts; for(;;) { if(Send_Flag == 1) { mcp2515_setRegisterS(MCP_TXB0CTRL+6,sendbuf,4); // 将要发送的数据写到sendbuf[]数组中,4个字节 mcp2515_setRegister(MCP_TXB0CTRL+5,4); // 填写要发送的字节数 mcp2515_write_can_id(MCP_TXB0SIDH,0,0x001); // 设置ID号为:一号机 0x001 二号机 0x002 三号机 0x004 mcp2515_ModifyRegister(MCP_TXB0CTRL,0x0B,0x0B); // TXBOCTR低四位为:1011,缓冲0发送,优先级为:11,最高 PORTB=0x02; do { res = mcp2515_ReadRegister(MCP_TXB0CTRL); // 读发送缓存0控制寄存器 res = res & 0x08; // 观察发送请求位 }while(res); //若为1,说明仍在发送,断续等待 PORTB=0x01; Delay_Ms(200); mcp2515_setRegisterS(MCP_TXB0CTRL+6,sendbuf,4); // 将要发送的数据写到sendbuf[]数组中,4个字节 mcp2515_setRegister(MCP_TXB0CTRL+5,4); // 填写要发送的字节数 mcp2515_write_can_id(MCP_TXB0SIDH,0,0x002); // 设置ID号为:一号机 0x001 二号机 0x002 三号机 0x004 mcp2515_ModifyRegister(MCP_TXB0CTRL,0x0B,0x0B); // TXBOCTR低四位为:1011,缓冲0发送,优先级为:11,最高 PORTB=0x02; do { res = mcp2515_ReadRegister(MCP_TXB0CTRL); // 读发送缓存0控制寄存器 res = res & 0x08; // 观察发送请求位 }while(res); //若为1,说明仍在发送,断续等待 PORTB=0x01; Delay_Ms(200); mcp2515_setRegisterS(MCP_TXB0CTRL+6,sendbuf,4); // 将要发送的数据写到sendbuf[]数组中,4个字节 mcp2515_setRegister(MCP_TXB0CTRL+5,4); // 填写要发送的字节数 mcp2515_write_can_id(MCP_TXB0SIDH,0,0x004); // 设置ID号为:一号机 0x001 二号机 0x002 三号机 0x004 mcp2515_ModifyRegister(MCP_TXB0CTRL,0x0B,0x0B); // TXBOCTR低四位为:1011,缓冲0发送,优先级为:11,最高 PORTB=0x02; do { res = mcp2515_ReadRegister(MCP_TXB0CTRL); // 读发送缓存0控制寄存器 res = res & 0x08; // 观察发送请求位 }while(res); //若为1,说明仍在发送,断续等待 PORTB=0x01; Delay_Ms(200); } } } #pragma CODE_SEG __NEAR_SEG NON_BANKED void interrupt 6 IRQ() { PORTB=0x0F; Sta_Int = mcp2515_ReadRegister(MCP_CANINTF); /* 读中断标志寄存器 */ /*--- 如果为接收缓冲器0中断 ---*/ if(Sta_Int & MCP_RX0IF) { /*--- 清除相关中断标志位 ---*/ mcp2515_ModifyRegister(MCP_CANINTF,0x01,0x00); /* 清零接收缓冲0中断标志位 */ /*--- 获取接收数据的长度 ---*/ len = mcp2515_ReadRegister(MCP_RXB0CTRL+5); /* 读取数据长度 */ j=mcp2515_ReadRegister(MCP_RXB0SIDH) ; if(j==1) { PORTB=0xF0; for(i=0;i<7;i++) /* 打印接收到的数据 */ { recbuf[i] = mcp2515_ReadRegister(MCP_RXB0CTRL+6+i); } if(recbuf[len-1]==1) { for(i=0;i<7-1;i++) recbuf_wendu[i] = recbuf[i]; Send_Flag = 0; } else if(recbuf[7-1]==2) { for(i=0;i<7-1;i++) recbuf_dianya[i] = recbuf[i]; Send_Flag = 1; } } else if(j==3) { for(i=0;i<7;i++) /* 打印接收到的数据 */ { recbuf[i] = mcp2515_ReadRegister(MCP_RXB0CTRL+6+i); } if(recbuf[7-1]==1) { for(i=0;i<7-1;i++) recbuf_wendu[i+6] = recbuf[i]; Send_Flag = 0; } else if(recbuf[7-1]==2) { for(i=0;i<7-1;i++) recbuf_dianya[i+6] = recbuf[i]; Send_Flag = 1; } } else if(j==7) { for(i=0;i recbuf[i] = mcp2515_ReadRegister(MCP_RXB0CTRL+6+i); } if(recbuf[len-1]==1) { for(i=0;i Send_Flag = 0; } else if(recbuf[len-1]==2) { for(i=0;i Send_Flag = 1; } } } /*--- 如果为发送缓冲器0中断 ---*/ if(Sta_Int & MCP_TX0IF) { /*--- 清除相关中断标志位 ---*/ mcp2515_ModifyRegister(MCP_CANINTF,MCP_TX0IF,0x00); } mcp2515_setRegister(MCP_CANINTF,0x00); /* 清除所有中断标志位 */ } void interrupt 66 PIT0() { PITTF_PTF0=1; } #pragma CODE_SEG DEFAULT