侵权投诉
当前位置:

OFweek电子工程网

接口/总线/驱动/时钟/开关

正文

基于STM32F105微控制器的双CAN冗余设计方案

导读: CAN 总线具有较高的位速率, 很强的抗电磁干扰性, 完善的错误检测机制, 在汽车、制造业以及航空工业领域中得到广泛应用 。由于船舶机舱环境极为恶劣, 且船舶航行过程中维修条件不如陆上, 对CAN 通信的可靠性要求很高, 采取双CAN 冗余总线提高通信可靠性。

  控制器局域网( ControllerA reaN etwork, CAN)是一种多主方式的串行通讯总线。CAN 总线具有较高的位速率, 很强的抗电磁干扰性, 完善的错误检测机制, 在汽车、制造业以及航空工业领域中得到广泛应用 。由于船舶机舱环境极为恶劣, 且船舶航行过程中维修条件不如陆上, 对CAN 通信的可靠性要求很高, 采取双CAN 冗余总线提高通信可靠性。本文提出一种基于STM32F105微控制器的双CAN 冗余设计方案。

 

  1 硬件平台组成

 

  STM32F105是STM icroe lectron ics公司推出的一款基于ARM Cortex- M3内核的32位微控制器, 其内核是专门设计于满足高性能、低功耗、实时应用的嵌入式领域的要求。由于采用Thumb - 2指令集,与ARM7微控制器相比STM32运行速度最多可快35% 且代码最多节省45% 。较高的主频和代码执行效率使系统在进行CAN 总线数据收发的同时仍可运行总线冗余算法。STM32F105微控制器内部集成2路独立的CAN 控制器, 控制器集成在芯片内部, 避免了总线外扩引入的干扰, 同时简化了电路设计、降低成本。

  系统使用两条完全独立的CAN 总线, 两个CAN 总线收发器和总线控制器, 实现物理层、数据链路层的全面冗余。在初始化时两个控制器被同时激活, 一个作为主CAN, 另一个作为从CAN, 为主控制器的备份。正常运作时, 数据通过主CAN 优先发送; 当主CAN 总线繁忙时, 从CAN 总线分担部分通信流量; 而当主CAN 总线发生故障时, 数据转移至从CAN 控制器传输, 反之亦然。在任一总线发生故障时,数据都能经由另一条总线传输, 而当两条总线都正常时, 使用两总线同时传输, 增加约1倍的通信带宽,这样在保证了通信可靠性的同时提高了实时性。

  CAN 总线接口电路设计如图1所示, 使用T JA1050作为总线收发器, 它完成CAN 控制器与物理总线之间的电平转换和差动收发。尽管TJA1050本身具备一定的保护能力, 但其与总线接口部分还是采用一定的安全和抗干扰措施; T JA1050的CANH 和CANL与地之间并联两只10pF的小电容, 可以滤除总线上的高频干扰; 另外, 为了增强CAN 总线节点的抗干扰能力, 总线输入端与地之间分别接入一只瞬态抑制二极管, 当两输入与地之间出现瞬变干扰时, 收发器输入端电压被钳位在安全范围。

  为防止总线过压造成节点损坏, STM32F105内置CAN 控制器的数据收发引脚并不与TJA1050直接相连, 通过ADuM1201磁隔离器实现信号隔离传输。与传统光耦隔离相比, 磁隔离简化了隔离电路设计, 并且磁隔离芯片的功耗很低, 大约相当于光耦隔离的1 /10。除了将CAN 数据信号隔离外,TJA1050T使用的电源和地也必须与系统完全隔离, 使用5V 隔离输出的开关电源模块IB0505LS提供隔离电源。由于CAN 总线数据传输率较高, 为了提高信号质量, 网络拓扑结构应尽量设计成单线结构以避免信号反射, 同时终端连接120欧姆左右的匹配电阻。

 

  

  图1 CAN 接口电路设计

 

  2 软件设计

 

  CAN 协议规范定义的数据链路层和部分物理层并不完整, 双CAN 冗余应用需要实现总线状态监控、网络故障的诊断和标识, 这就要通过添加软件冗余模块来实现。冗余模块在程序主循环中调用, 根据不同总线错误状态执行收发通道切换。CAN 总线错误状态分为3类: 错误激活、错误认可、总线关闭。总线正常工作时处于错误激活状态,控制器检测到错误后将发送/接收错误计数器的值递增, 当值大于127时进入错误认可, 大于255时总线关闭状态, CAN 总线错误检测模块通过读取错误状态寄存器作为总线故障的测试条件, 在错误状态发生改变时调用冗余算法, 执行总线切换操作。

  通过实际调试发现, 总线连接断开且只有1个节点不断发送报文时产生发送错误, 控制器进入错误认可状态, 但不进入总线关闭状态; 其它错误均使错误计数器增加, 依次进入错误认可状态、总线关闭状态, 后两种状态表明总线被严重干扰, 需要采取相应措施。为简化控制逻辑设计将错误认可和总线关闭合并为总线故障。

  冗余算法使用状态机实现发送模式的切换, 根据不同总线故障选择发送使用的总线。状态切换流程图如图2所示, 程序首先读取错误状态寄存器获得总线错误状态, 判断当前总线是否处于错误激活模式, 若检测到总线故障程序置相应标志位向其他程序模块指示错误。为提高报文发送效率, 发送程序一次将多个报文写入发送邮箱由硬件控制自动发送, 在切换总线时, 需先把故障总线发送邮箱中的报文中回读, 通过备份总线优先发送, 这一机制保证报文不会因总线切换而丢失。控制器向故障总线发送数据域为空的测试报文, 每成功发送1报文, 总线发送错误计数器的值递减, 直至其值小于128总线恢复到错误被动状态; 每隔一定时间冗余程序读取错误状态寄存器, 检测故障总线是否恢复正常。

  在2总线同时传输模式, 发送程序优先写入总线1邮箱, 当总线1邮箱满时写入总线2的邮箱, 由于报文按优先级仲裁发送, 若某一路发送邮箱经常为空, 说明该路总线通信流量较小, 发送程序将较多报文转由空闲总线发送, 实现报文的负载均衡。

 

  

  图2 总线状态切换流程图。

1  2  下一页>  
声明: 本文由入驻OFweek公众平台的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

我来说两句

(共0条评论,0人参与)

请输入评论

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

文章纠错
x
*文字标题:
*纠错内容:
联系邮箱:
*验 证 码: