bms在开发过程中遇到的一些问题

处理器为freescale的MC9S08DZ60,8位机,很早之前的处理器,从可靠性方面考虑,选择了这款汽车级处理器,大小为60k,16Mhz主频。
Bms的主要功能为定时监测每节电池的状态信息,是否有过压欠压、温度过高过低、电流过大等监测,同时能够相对线性、直观的显示当前的soc值(主要还是放电soc显示)。目前有几种方式监测电池数据:1)ltc6813这一类,可以同时监测电池电压值,但是soc等值需要写代码实现;优点是同时检测的电池数量比较多,ltc6813可以同时检测18节电池,且adc精度也比较高;必要的话还能多块ltc6813进行级联;2)ti的bq系列电量计,如bq40z50,在芯片里已经进行了soc计算,只需要配置相应的寄存器,从特地寄存器中读取值就行;缺点是电池数量有限;3)mcu作为处理器,一个电池使用一块adc芯片;这种方式估计成本最低,但都需要写代码完成;
本项目需要同时检测15节电池,所以使用了mcu+ltc6813的方式。因ltc芯片使用的范围比较多,比较广,厂商也提供可以在demo板运行的源码(从官网上下载),需要进行一定的修改移植。
(一) 开发环境搭建
1)这个mcu比较老,一般都是在xp上安装开发环境的,当初网上找了一些资料,发现可以在win10上进行破解开发,可以参考《安装说明.docx》,mc9s08dz60_cw_software_win10开发环境目录下的为相关的软件包;
2)参考《bdm下载器使用说明.pdf》安装bdm驱动;连接开发板,看是否能够连接上,注意bdm仿真器的电源,插针的方向性,以防插反了;
3)参考《CodeWarrior基础入门.pdf》新建或者打开已有的项目;或者网上随便搜索一下,都有相关资料;
4)参考购买的开发板中提供的《MC9S08DZ60开发板实验指导手册.pdf》,以及提供的源码例子,对该处理器有个大概的印象;
5)烧写源码例子进开发板,看是否有打印,led闪烁等现象,说明程序烧写成功,开发环境搭建ok了。
遇到的问题:
a) 程序的时钟 一定要配置ok,如果异常了,则bdm仿真器可能会连接不上,无法擦除mcu固件,此时就只能更换mcu芯片,当时调试的时候出现过一次这样的问题;
b) 其他问题,参考《bdm下载器使用说明.pdf》即可解决;
(二) 代码架构搭建,代码编写
1) 小系统初始化
在这里插入图片描述
从上往下,分别是时钟初始化,串口初始化(与上位机通讯),gpio的初始化(充放电继电器的开合控制),spi初始化(与ltc6813通讯)
2) Ltc6813移植;
供应商提供的ltc代码,主要针对的是当前的开发环境,例如linux等环境,如果移植到MC9S08DZ60上,不少写法需要进行改动,否则无法编译,或者无法运行;
在这里插入图片描述
Ltc6813.c为具体的跟ltc6813芯片有关的代码;ltc681x.c为各款类似芯片共同总结出来的公共代码接口,这个c文件中最终需要调用spi通讯接口来实现数据的交互,这部分代码需要自行添加,添加在bms_hardware.c和spi_driver.c中;
在这里插入图片描述
在这里插入图片描述
这里很多地方的代码,只是进行了屏蔽,而没有删除;考虑到后续如果切换到其他mcu中去,spi调用接口肯定也需要改变的,可能此时需要的就是屏蔽掉的代码;
遇到的问题:
A) 因为此时是mcu的spi模块做主,提供时钟,所以如果要读取ltc6813的寄存器值的话,需要先发送个写0xff的操作,产生时钟,然后再读取寄存器值;
B) Spi的先读后写操作,需要有一定的时间间隔,否则读取到的数据会不对,把默认的高电平当初是数据了;
C) Col pal的极性要注意一下;
D) Cs的延时函数,在当前的直连方式下不需要,但是如果使用ISO spi方式通讯,则需要加延迟函数,进行唤醒操作;
3) 应用逻辑;
a) 会从先内部flash中获取soc值,充满电的次数值;然后进行ltc6813的通讯连接,初始化配置;初始化成功后进入主循环;
b) 主循环操作:2s一次主循环,之后2分钟一次把当前变化的soc值写入内部falsh中去;查询fifo中的数据,是否有上位机传递的msg过来,如果有的话,则进行数据解析;判断当前的ltc6813配置成功没有,如果没有的话,则再次初始化ltc6813;
c) 使用ltc6813的模块,分别获取电压值、电流值、温度值,根据获取到的这些值,进行转换,处理成后续可以进行soc计算的值;
d) //计算当前的电池容量 battery_soc_calcuate();这个函数中分充电和放电两个状态:充电状态下,主要以查表为主、安时计算法为辅来更新soc值;放电状态下,主要是安时计算法为主、查表为辅来更新soc值;充满电或者快放完电的时候,则按照电压来计算;期间做一定的逻辑判读;
e) battery_judge_process(); //判断上述的数据,是否上传相应数据给上位机;主要是根据全局变量中的值,来判断是否要打开或者关闭继电器;是否要发送告警值给上位机;
4) 与上位机的通讯逻辑;
在这里插入图片描述

(三) 数据分析
参见另外的文章

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值