4. 通信排查:CAN通信链路诊断、PWM信号测量、SPI/I2C总线验证

通信出问题,电机解锁不了,这事儿我碰过太多次了。很多时候硬件看起来都正常,就是通信链路在作妖。这一章咱们就把CAN、PWM、SPI/I2C这几个常见的通信方式,挨个捋一遍。

核心思路:通信排查的本质是确认“发出去”和“收回来”的数据是否一致。别一上来就怀疑芯片坏了,先查物理层,再查协议层。

4.1 CAN通信链路诊断

CAN总线在电机驱动里用得特别多,尤其是多轴联动的场景。我遇到过最诡异的一次,是CAN总线在常温下一切正常,一跑起来就丢包。后来发现是线束屏蔽层接地没处理好。

4.1.1 物理层检查

先看电压。CAN总线上有两根线:CAN_H和CAN_L。用万用表量一下对地电压。

  • CAN_H: 正常在2.5V ~ 3.5V之间
  • CAN_L: 正常在1.5V ~ 2.5V之间
  • 差分电压: 隐性状态约0V,显性状态约2V

如果量出来CAN_H和CAN_L都是0V,或者都是5V,那基本就是总线短路或者断路了。嗯,这里要注意,终端电阻也很关键。标准CAN总线两端各需要120Ω的终端电阻。

我的习惯: 断电后,用万用表电阻档量CAN_H和CAN_L之间的电阻。如果只有60Ω左右,说明两个终端电阻都在。如果是120Ω,说明只有一个。如果是无穷大,那肯定有一个电阻没焊上。

4.1.2 协议层验证

物理层没问题,再看能不能正常收发数据。用示波器抓一下CAN_H和CAN_L的波形。

  • 波形应该是方波,幅值在2V左右
  • 波特率要跟配置一致。比如配置的是500kbps,那一个bit的时长应该是2μs
  • 看看有没有错误帧。错误帧的波形通常是一段异常的低电平或高电平

我建议你写个简单的CAN回环测试程序。让MCU自己发自己收,如果回环测试都过不了,那大概率是CAN控制器或者收发器坏了。

避坑指南: 我曾经遇到过CAN收发器共模电压范围不够的问题。在电机高速运转时,地电位会波动,导致CAN收发器进入保护状态。解决办法是加强电源滤波,或者选用共模电压范围更宽的收发器。

4.2 PWM信号测量

PWM信号是电机控制的命脉。频率、占空比、相位,任何一个参数不对,电机都转不起来。

4.2.1 频率和占空比测量

用示波器是最直接的。把探头夹在PWM输出引脚上,看看波形。

  • 频率: 电机驱动常用的PWM频率是10kHz ~ 20kHz。频率太低会有噪音,频率太高开关损耗大。
  • 占空比: 从0%到100%都要能正常输出。我见过有些MCU的PWM模块在占空比接近0%或100%时,波形会失真。
  • 死区时间: 对于H桥驱动,上下桥臂的PWM信号之间必须有死区时间。用示波器的双通道同时看上下桥臂的波形,确保死区时间足够。

关键点: 死区时间太短会导致上下桥臂直通,烧MOS管。死区时间太长又会影响电流波形。一般死区时间设置在几百纳秒到几微秒之间,具体看MOS管的关断延迟。

4.2.2 信号完整性检查

PWM信号在长距离传输时,容易出现过冲、振铃、反射等问题。这些都会导致MOS管误开关。

  • 看看波形的上升沿和下降沿是否陡峭
  • 有没有明显的过冲(超过电源电压)
  • 有没有振铃(波形在跳变后反复震荡)

如果发现信号质量不好,可以在PWM输出端串联一个几十欧姆的电阻,或者在MOS管的栅极加一个电阻来减缓开关速度。

我的经验: 有一次我排查一个电机抖动的问题,查了半天发现是PWM信号线上串扰了高频噪声。后来在PWM输出引脚对地加了一个100pF的小电容,问题就解决了。不过要注意,电容不能太大,否则会影响PWM的上升时间。

4.3 SPI/I2C总线验证

SPI和I2C通常用于MCU和外部传感器、编码器、或者驱动芯片之间的通信。这两种总线虽然成熟,但出问题的时候也挺让人头疼的。

4.3.1 SPI总线排查

SPI有四根线:SCK、MOSI、MISO、CS。排查的时候,我习惯按这个顺序来:

  1. 检查时钟(SCK): 用示波器看SCK引脚,有没有正常的时钟信号?频率对不对?
  2. 检查片选(CS): CS信号在通信开始时要拉低,通信结束后拉高。看看CS的时序对不对。
  3. 检查数据线(MOSI/MISO): 在通信过程中,MOSI和MISO上应该有数据。如果MISO一直没数据,可能是从设备没响应。
  4. 检查相位和极性: SPI有四种模式(CPOL和CPHA的组合)。主设备和从设备的模式必须一致。

避坑指南: 我曾经遇到过SPI通信偶尔失败的问题。后来发现是CS信号在通信结束后没有完全拉高,导致从设备没有正确释放总线。解决办法是在CS引脚上加一个上拉电阻。

4.3.2 I2C总线排查

I2C只有两根线:SCL和SDA。排查起来相对简单,但坑也不少。

  • 上拉电阻: I2C总线是开漏输出,必须要有上拉电阻。一般4.7kΩ或10kΩ。如果上拉电阻太大,信号上升沿会变慢。如果太小,功耗会增大。
  • 地址冲突: I2C总线上每个设备都有唯一的地址。如果两个设备地址相同,通信就会乱套。
  • 时钟拉伸: 有些从设备会拉低SCL来延长时钟周期。主设备要支持时钟拉伸。

用示波器看I2C波形时,注意看起始条件(SCL高电平时,SDA从高到低)和停止条件(SCL高电平时,SDA从低到高)。如果波形上只有起始条件没有停止条件,那可能是通信被中断了。

我的习惯: 排查I2C问题时,我喜欢用逻辑分析仪。它能直接解析出I2C的协议内容,显示地址、数据、ACK/NACK。比用示波器看波形效率高多了。

4.4 通信排查知识体系

下面这张图总结了本章的核心内容,方便你快速回顾。

通信排查知识体系 CAN通信链路诊断 物理层检查 协议层验证 PWM信号测量 频率/占空比 信号完整性 SPI/I2C总线验证 SPI排查 I2C排查 排查要点 • CAN:先量电压,再看波形,最后做回环测试 • PWM:频率、占空比、死区时间、信号完整性一个都不能少 • SPI/I2C:时钟、数据、时序、上拉电阻是排查重点 通信正常 → 电机解锁成功

4.5 实战排查清单

最后,给你一份我平时用的排查清单。遇到通信问题,按这个顺序查一遍,基本能解决90%的问题。

通信类型 排查项目 检查方法 常见问题
CAN 终端电阻 万用表量CAN_H和CAN_L 电阻值不对
共模电压 示波器看CAN_H和CAN_L对地 地电位波动
错误帧 示波器或CAN分析仪 总线冲突或干扰
PWM 频率/占空比 示波器测量 参数配置错误
死区时间 双通道示波器 死区时间不足
信号完整性 示波器看上升沿/下降沿 过冲、振铃
SPI 时钟/数据 示波器或逻辑分析仪 时序不匹配
片选信号 示波器看CS波形 CS电平异常
模式匹配 检查CPOL/CPHA配置 主从模式不一致
I2C 上拉电阻 万用表量SCL/SDA对地 电阻值不合适
地址冲突 检查设备地址 地址重复
时钟拉伸 示波器看SCL波形 从设备拉低时钟

通信排查这事儿,说白了就是细心加耐心。别怕麻烦,一步一步来,总能找到问题所在。我当年也是踩了无数坑,才总结出这些经验。希望这份清单能帮你少走弯路。