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

基于STM32F105微控制器的CAN接口电路设计

图1 CAN 接口电路设计

2 软件设计

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

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

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

  • UC3846控制芯片工作原理控制图 逆变焊机原理与用途
  • 数字万用表电阻档测试二极管正反向没有阻值(使用万用表测量二极管的正向电阻,为什么各档)
  • 学单片机需要学数电模电吗(学单片机要先学数电模电吗)
  • 电工怎么选择适合自己用的万用表(电工初学者买什么样的万用表好)
  • 单片机需要同时运行多个任务怎么办(单片机怎么同时执行多个任务)
  • 电机保护的方案取决于负载的机械特性
  • 绝缘电阻表正负搭接不复零位是怎么回事
  • 短路怎么用万用表查