2、CAN控制器与收发器:常用CAN芯片选型与硬件电路设计要点
大家好,我是你们的讲师。这一章咱们聊聊CAN通信的“心脏”和“手脚”——控制器和收发器。很多初学者容易把这两者搞混,其实说白了,控制器负责协议处理,收发器负责电平转换。我刚开始做电机驱动时,就因为选错芯片,折腾了好几天。今天就把这些经验分享给你们。
2.1 CAN控制器:协议处理的核心
CAN控制器负责完成CAN协议的数据链路层功能。它把你要发送的数据打包成标准帧或扩展帧,处理仲裁、错误检测这些脏活累活。你想想看,如果没有控制器,光靠MCU的GPIO去模拟CAN时序,那CPU基本就干不了别的事了。
2.1.1 STM32 FDCAN:新一代集成方案
现在做电机控制,我个人最推荐的是STM32的FDCAN外设。它集成在G4、H7、MP1这些系列里。为什么推荐它?
- 速率高:传统CAN最高1Mbps,FDCAN可以跑到8Mbps甚至更高。电机控制里数据量大,这个优势很明显。
- 数据场大:传统CAN一帧最多8字节,FDCAN可以到64字节。我做过一个项目,需要同时上传电流、转速、温度、位置四个参数,用FDCAN一帧搞定,省事多了。
- 硬件滤波灵活:支持多个滤波器组,可以精确过滤掉不需要的报文,减轻CPU负担。
重要提示:STM32的FDCAN兼容传统CAN 2.0B。如果你的设备里既有老设备又有新设备,FDCAN可以自动切换模式。我在调试混合网络时,这个特性帮了大忙。
2.1.2 SJA1000:经典独立控制器
SJA1000是NXP(原Philips)的经典产品。虽然现在很多MCU都集成了CAN控制器,但SJA1000在一些老项目或特殊场合依然在用。
它的特点很鲜明:
- 独立工作:不依赖特定MCU,通过并行接口或SPI连接。
- 支持BasicCAN和PeliCAN:PeliCAN模式支持CAN 2.0B的29位扩展标识符。
- 成本低:一颗芯片几块钱,适合对成本敏感的产品。
不过,SJA1000也有局限。它最高只支持1Mbps,而且数据场只有8字节。我记得有一次给一个老设备升级,客户要求保留原来的SJA1000方案,结果因为数据量太大,不得不拆分成多帧发送,调试起来挺麻烦的。
我的经验:如果你在维护老项目,SJA1000的寄存器配置要特别注意。它的复位模式和工作模式切换有严格的时序要求。我曾经因为初始化顺序写反了,导致芯片一直发错误帧,查了两天才发现。
2.2 CAN收发器:电平转换的桥梁
控制器输出的是逻辑电平(通常是3.3V或5V),而CAN总线需要差分信号。收发器就是干这个活的。它把控制器的TX/RX信号转换成CANH和CANL的差分电平。
2.2.1 TJA1050:经典高速收发器
TJA1050是NXP的明星产品,也是目前市面上用得最多的CAN收发器之一。它支持最高1Mbps的速率,兼容ISO 11898标准。
它的几个关键特性:
- 低电磁辐射:优化了输出波形,EMI表现不错。
- 总线引脚保护:耐压可达±36V,抗干扰能力强。
- 待机模式:通过STB引脚控制,可以降低功耗。
嗯,这里要注意。TJA1050的VCC是5V,如果你的控制器是3.3V的,需要做电平匹配。我见过有人直接把3.3V的TX接到TJA1050的TXD引脚,结果逻辑高电平不够,导致发送失败。
避坑指南:我曾经在一个项目中,TJA1050的RXD引脚输出高电平只有3.5V左右,而STM32的GPIO识别高电平需要2.0V以上。虽然能工作,但噪声大时容易误判。后来我加了一个上拉电阻到3.3V,问题就解决了。
2.2.2 其他常用收发器
除了TJA1050,还有几款也值得了解:
| 型号 | 特点 | 适用场景 |
|---|---|---|
| TJA1040 | 低功耗,待机电流仅5μA | 电池供电设备 |
| TJA1051 | 改进版,支持3.3V和5V | 混合电压系统 |
| SN65HVD230 | 3.3V供电,TI出品 | 低压系统 |
| ISO1050 | 带隔离,耐压5kV | 工业强干扰环境 |
我个人习惯在电机控制项目里优先选TJA1051。它兼容3.3V和5V,省去了电平转换的麻烦。而且它的总线引脚ESD保护更强,电机驱动产生的共模干扰比较大,这个特性很实用。
2.3 硬件电路设计要点
芯片选好了,电路设计才是关键。很多问题都是硬件设计不当引起的。我总结几个核心要点:
2.3.1 终端电阻
CAN总线两端必须各加一个120Ω的终端电阻。为什么是120Ω?因为CAN总线电缆的特性阻抗大约是120Ω,加这个电阻是为了消除信号反射。
实际设计中:
- 如果节点数量少(2-3个),可以在两端各加一个120Ω电阻。
- 如果节点多,建议只在最远的两端加,中间节点不要加。
- 有些收发器内部集成了终端电阻,比如TJA1051T/3,但我不建议依赖它,还是外部加一个更可靠。
重要提示:终端电阻的功率要选对。在电机控制中,总线电压可能达到12V或24V,120Ω电阻上的功耗是P=U²/R。24V时功耗是4.8W,普通贴片电阻根本扛不住。我建议用0805或1206封装的电阻,或者用两个60Ω串联。
2.3.2 电源与去耦
收发器对电源噪声很敏感。电机驱动会产生大量的开关噪声,如果电源不干净,CAN通信就会出错。
我的做法是:
- 在收发器的VCC引脚附近放一个10μF电解电容和一个0.1μF陶瓷电容。
- 如果条件允许,用独立的LDO给收发器供电,不要和电机驱动共用一个电源。
- 在CANH和CANL之间加一个共模扼流圈,可以有效抑制共模干扰。
2.3.3 保护电路
电机控制环境恶劣,总线可能会被高压或静电损坏。我建议加以下保护:
- TVS管:在CANH和CANL对地各加一个双向TVS管,钳位电压选36V左右。
- 串联电阻:在收发器引脚和总线之间各串一个10Ω电阻,限制浪涌电流。
- 共模扼流圈:前面提到了,这个对抑制共模干扰很有效。
我的经验:我曾经在一个项目中,CAN总线经常莫名其妙地通信中断。后来用示波器一看,发现CANH和CANL上有很大的尖峰脉冲。加了TVS管和共模扼流圈后,问题彻底解决了。所以保护电路不是可有可无的,一定要加上。
2.3.4 布局布线
PCB布局也很重要。我总结几条:
- 收发器尽量靠近CAN连接器,减少走线长度。
- CANH和CANL走线要平行,间距尽量一致。
- 避免在CAN总线附近走高频信号线,比如PWM线。
- 如果使用隔离收发器,隔离电源的布局要特别注意,原边和副边要分开。
2.4 实战:STM32 FDCAN + TJA1051电路设计
最后,我给大家一个实际电路设计的参考。这是我在一个电机控制项目中用过的方案:
// STM32G474 + TJA1051 典型电路
// FDCAN1_TX -> PA12 -> TJA1051 TXD
// FDCAN1_RX -> PA11 -> TJA1051 RXD
// 电源部分
// VCC_3.3V -> LDO -> VCC_5V -> TJA1051 VCC
// VCC_5V -> 10μF + 0.1μF -> GND
// 总线部分
// TJA1051 CANH -> 10Ω -> TVS -> CANH端子
// TJA1051 CANL -> 10Ω -> TVS -> CANL端子
// CANH和CANL之间 -> 共模扼流圈
// 总线两端 -> 120Ω终端电阻
这个电路我用了两年多,没出过问题。当然,具体参数要根据你的实际环境调整。比如总线长度超过100米时,终端电阻可能需要调整到100Ω左右。
好了,这一章的内容就到这里。下一章咱们聊聊CAN通信的软件配置和报文收发。到时候我会手把手教你怎么用STM32CubeMX配置FDCAN,以及怎么用示波器抓波形调试。咱们下章见!