Arduino CAN总线实验结果

CAN总线实现方案

CAN总线节点框架主要由三部分组成:

  1. MCU,应用控制器;
  2. CAN控制器,总线控制器,往往通过SPI总线暴露寄存器,实现CAN协议;
  3. CAN收发器,物理层收发器,可以初略理解为RS485/RS232的接口芯片,但是却也有部分定时适配任务。

目前把CAN控制器作为片内外设集成到MCU中,渐成趋势。但是CAN收发器大多数5V的,需要留意三类芯片连接时所需的电平匹配问题。如果是兼容3/5V设计,就问题不大,否则需要使用电平转换或者高速光耦。

Arduino

Arduino上有过一款SeeedStudio的CAN Shield,使用MCP2515控制器和TJA1050。于是我在5V版本的Arduino Nano,和泥人版的简化CAN Shield上做了测试。

连线部分需要注意两点:

  • SPI_CS连接到D9,旧版本的Demo缺省连接到D10,也可以自定义。
  • INT连接到D2,即INT.0,不是D0,当然也可以自定义。由于接收端大多数采用中断方式,所以这个脚还必须连接。
Enter setting mode success
set rate success!!
Enter Normal Mode Success!!
CAN BUS Shield init ok!
Enter setting mode success
set rate success!!
Enter Normal Mode Success!!
CAN BUS Shield init ok!

发射端终端截屏

Get Data From id: 7
0x7     0x7     0x7     0x7     0x7     0x7     0x7     0x7

------------------------------------------------------------------
Get Data From id: 8
0x8     0x8     0x8     0x8     0x8     0x8     0x8     0x8

------------------------------------------------------------------
Get Data From id: 9
0x9     0x9     0x9     0x9     0x9     0x9     0x9     0x9

------------------------------------------------------------------
Get Data From id: 4
0x4     0x4     0x4     0x4     0x4     0x4     0x4     0x4

------------------------------------------------------------------
Get Data From id: 5
0x5     0x5     0x5     0x5     0x5     0x5     0x5     0x5

------------------------------------------------------------------
Get Data From id: 6
0x6     0x6     0x6     0x6     0x6     0x6     0x6     0x6

------------------------------------------------------------------
Get Data From id: 7
0x7     0x7     0x7     0x7     0x7     0x7     0x7     0x7

------------------------------------------------------------------
Get Data From id: 8
0x8     0x8     0x8     0x8     0x8     0x8     0x8     0x8

------------------------------------------------------------------
Get Data From id: 9
0x9     0x9     0x9     0x9     0x9     0x9     0x9     0x9

接收端终端截屏

下一步:STM32F103/F407/F072

做Arduino实验之前,基于MicroPython的F407的CAN例程环回自测也通过了。但是CAN节点是孤立的,则总线会被断开,用示波器和逻辑分析仪是看不到波形的。现在则问题不大了,因为两组 Arduino+MCP+TJA 组合可以构成了一对完整的总线节点,剩下的只是把新节点挂上去测试罢了。

接下来,我可能会基于STM32F103C8做些试验,可能会对接3.3V CAN收发器,或者3/5V兼容收发器。此外,F407/F072可以分别针对USB/CAN转换进行收发,同样需要兼容收发器。最后,LPC11C24和STM8S也可能。LPC11C24因为是三合一,把收发器也集成的芯片,而STM8S则可能是比较便宜的选择,配合CH340既可以用了。

3V 收发器

  • NXP TJA1040
  • TI SN65HVD230

因为STM32F103/F407/F072的CANH/CANL引脚都是5V容错的,所以TJA105X直接接上问题也不大。

应用场景

  • ROS,机械臂、机器人场景
  • 电机驱动:多路伺服、步进、无刷电机
  • 智能农业:区域自动化
  • 交通工具:船舶
  • 交通工具:车用ODB
  • 物流工具:UAV
  • 其他:大型家电、服务器背板、智能电网、电池管理系统

参考

  • https://www.electronicshub.org/arduino-mcp2515-can-bus-tutorial/
  • https://www.geek-workshop.com/thread-33355-1-1.html
  • https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

你可能感兴趣的:(Arduino CAN总线实验结果)