双路FOC的I2C滤波电容究竟该不该焊

2026-10-132

编码器读数偶尔失败,很多人会先降低 I2C 频率,再换一根线。可如果板子上的“抗干扰电容”正在拖慢数据边沿,继续折腾软件,往往只是在绕路。

这块 ESP32 双路 FOC 扩展板提供了一个很适合拆解的例子。两路编码器 SDA 都有串联电阻和对地电容,接口侧还有 2.2 kΩ 上拉。问题不是有没有上拉,而是上拉、电容、串阻和线缆合在一起后,数据线还能多快地回到高电平。

本文只审查这两路 I2C 的 SDA 边沿与装配配置,不涉及电机闭环复现。工程图来自实际 EDA 副本,曲线来自明确假设下的计算,没有把仿真当成示波器实测。

实际EDA顶层与C4、C8位置

图1 实际 V4 PCB 顶层导出,白圈定位 C4、C8。DNP 表示不装器件,焊盘仍保留,因此顶层图上仍能看到这两个封装。

先看连线,再决定电容怎么装

通道 0 的信号从 ESP32 GPIO21 出发,经过 R2 的 56 Ω,到达 C4 所在的中间节点,再经过 R5 的 160 Ω,接到 EN_A0 第 2 脚。C4 从中间节点接地,R7 的 2.2 kΩ 上拉位于连接器侧。

这两个串阻不只是“加起来 216 Ω”这么简单。电容挂在哪个节点,会改变局部充放电过程;编码器的开漏输出在哪一端拉低,也会改变低电平压降的分布。

原始通道0的完整接口局部

图2 原始 EDA 原理图中的通道 0。C4 明确挂在 SDA 上,SCL 是另一条带 56 Ω 串阻与 2.2 kΩ 上拉的线。电源旁的 0.1 μF 去耦电容不属于信号电容。

两路接口的关键对应关系如下。

通道 SDA / SCL SDA 串阻 SDA 上拉 SDA 对地电容
0 GPIO21 / GPIO22 R2 56 Ω、R5 160 Ω R7 2.2 kΩ C4
1 GPIO2 / GPIO13 R31 56 Ω、R25 160 Ω R22 2.2 kΩ C8

两路连接器都是第 1 脚 3V3、第 2 脚 SDA、第 3 脚 SCL、第 4 脚 CS/ABZ、第 5 脚 GND。主控位号是 U14,型号 ESP32-WROOM-32D;GPIO25 在这份图里用于 PWMB_1,不能当成第二路 SDA。

GPIO2 还带来一个容易漏掉的限制。Espressif 的启动文档要求,进入串口下载模式时,GPIO0 为低,GPIO2 应悬空或为低;GPIO0 为高、正常启动时则忽略 GPIO2。主板 R22 本身就把第二路 SDA 上拉,拔掉编码器并不会消除这个上拉。

因此,下面的电容修改不等于修好了下载启动电路。若要复现整板,仍须结合具体自动下载接法核验启动条件;本文不提供未经验证的改线方案,也不把这块板当作可以直接照抄的完整 FOC 参考设计。

同一下载包里,75 pF 和 150 pF 对不上

同一份原始下载包的 V4 原理图将 C4、C8 标为 75 pF,PCB 元件属性却标为 150 pF。这里的 V4 指文件版本,原图标题栏仍保留 REV1.0,不能只看标题栏猜装配版本。

两倍的电容差异,足以改变边沿预算。实际焊的是哪一个值,必须查装配记录或实物,文章不能替原作者猜。

本次建立了独立的 I2C 装配副本,将原理图和 PCB 中的 C4、C8 统一标为 DNP,并增加装配覆盖表。副本保留原来的封装、网络和铜箔,不修改其余元件。

这样得到的是一个可以复算、可以做对照实验的装配配置。它有利于减少这一支路的电容负载,但抗干扰表现还要另测;不能据此断言“滤波电容永远不该焊”。若接口改作 ABZ,用途已经变化,也不能直接套用这个 I2C 配置。

修订后的两路DNP原理图

图3 实际 EDA 中保存并重新导出的两路 DNP 图页。C4、C8 的装配状态同步修改;这不是在旧截图上覆盖文字。

一个公式能先筛掉不现实的预期

对于集中参数的一阶 RC 上升沿,TI 的 I2C 上拉设计资料给出 30% 到 70% 的上升时间关系。

import math

rp_ohm = 2200.0
cb_pf = 120.0
tr_ns = math.log(0.7 / 0.3) * rp_ohm * cb_pf * 1e-3
print(f"集中RC估算 {tr_ns:.2f} ns")

输出约 223.69 ns。其中 120 pF 是用于演示的总负载假设,既不是这块板的测量结果,也不等于“线缆固定有 120 pF”。

这个公式的系数约为 0.8473。常见标准模式的上升时间限值为 1000 ns,快速模式为 300 ns。后者对应常见的 400 kHz 工作目标。总线电容满足某个上限,并不自动意味着上升时间也合格;上拉阻值必须一起算。

但这块板上有两个串阻、三个电气节点,不能把集中 RC 公式当成精确的板级模型。它适合做初筛,接下来要保留电容实际挂接的位置。

把 SDA 分成三个节点计算

这里采用一个有意保持简单的模型。

  • A 是 MCU 端,输入与焊盘电容假设为 10 pF。
  • B 是串阻中间节点,寄生电容假设为 10 pF,再加 C4 或 C8。
  • C 是连接器端,把编码器输入、接口与线缆合并为 100 pF 或 200 pF 的两种假设负载。

R1、R2 分别取 56 Ω、160 Ω,上拉取 2200 Ω。所有开漏端先维持足够久的低电平,在时刻零同时释放;模型只包含被动 RC,不包含电感、漏电、保护器件非线性、驱动器动态特性及电机噪声。

三节点SDA计算模型

图4 据实际网络重绘的计算示意。电容数值是输入假设,示意图不能代替前面的真实 EDA 图。两路使用相同阻容拓扑,可用同一模型分别输入实际负载。

对应的电流平衡可以写成下面三式。电压按 3.3 V 归一化,稳态高电平记作 1。

CA × dVA/dt = (VB − VA) / R1
CB × dVB/dt = (VA − VB) / R1 + (VC − VB) / R2
CC × dVC/dt = (VB − VC) / R2 + (1 − VC) / Rp

附件工具用对称化电导矩阵的谱分解求响应,再用二分查找求各节点的 30% 和 70% 交点。正文中直接调用同一份代码即可复算。

from rc_audit import parallel, remote_low, rise_ns

for added_pf in (0.0, 75.0, 150.0):
    # 顺序是 MCU、中间节点、连接器,单位 pF
    caps = (10.0, 10.0 + added_pf, 100.0)
    times = rise_ns(caps, (56.0, 160.0, 2200.0))
    print(f"附加电容 {added_pf:.0f} pF,最大上升时间 {max(times):.2f} ns")

rp = parallel(2200.0, 4700.0)
print(f"并联上拉 {rp:.2f} ohm")
print(remote_low(v_sink=0.2, rp=rp))

在 100 pF 端口假设下,DNP、75 pF、150 pF 的标称最大上升时间分别为 224.18 ns、369.90 ns、518.07 ns。计算取三个节点中的最大值,不只挑最快的节点。

100pF端口假设下的计算曲线

图5 100 pF 端口负载假设下的 MCU 节点计算曲线,虚线是 30% 与 70% 电平。它展示装配电容对边沿的影响,不是板卡实测波形。

还做了八组参数组合筛查。三个电阻共同乘以 0.95 或 1.05,基础电容共同乘以 0.8 或 1.2,附加电容乘以 0.9 或 1.1。这些是明确指定的扫描范围,不是已经核实的器件容差,也不覆盖温度、噪声和每个寄生参数的任意独立组合。

100pF和200pF场景的标称及扫描结果

图6 两种假设端口负载的结果。100 pF 场景中,DNP 扫描最大值约 282.47 ns;200 pF 场景中,即使 DNP,标称值也约 410.36 ns。

结果支持一个有限而有用的结论。在给定的 100 pF 假设和扫描范围内,DNP 配置通过了 300 ns 的上升时间筛查;装 75 pF 或 150 pF 则超出该门槛。端口负载换成 200 pF 后,DNP 也无法通过。

所以,“不焊电容就能稳定跑 400 kHz”是不成立的。上升时间只是一项指标,尚有低电平、建立保持时间、实际通信以及受干扰时的表现需要验证。

模型的解析结果已用另一份独立编写的 KCL/RK4 数值积分交叉核对,步长 0.1 ns、积分到 1.8 μs。三种装配配置的最大归一化电压差约 1.10×10⁻⁸,最大上升时间差约 2.4×10⁻⁶ ns;集中 RC 极限、起点、终点和单调性检查也通过。这能检查计算实现,没有证明真实板子的负载恰好等于输入假设。

上拉越小,低电平也越好吗

如果编码器模块自己带 4.7 kΩ 上拉,不能忽略主板上的 2.2 kΩ。两者并联约为 1.50 kΩ;若模块带 1 kΩ,并联后约为 687.5 Ω。

更强的上拉会加快上升,却增加拉低电流。对这条带串阻的 SDA,还要关心远端低电平。

假设 MCU 正在拉低,并假设 MCU 引脚电压为 0.2 V,连接器侧上拉为 2.2 kΩ,216 Ω 串阻中的电流约为 1.283 mA。连接器节点则约为 0.477 V。并联 4.7 kΩ 上拉后,计算值约为 0.591 V;并联 1 kΩ 后,约为 0.941 V。

这里的 0.2 V 是输入假设。结果应与实际编码器的输入低电平阈值、驱动端的输出能力比较,不能把常见 0.4 V 的输出 VOL 参考直接当成未知接收器的 VIL 门槛。编码器在连接器端主动拉低时,电流路径也不同,不能把上面这一组压降套给所有方向。

普通上拉下限的估算式是 (VDD − VOL) / IOL。例如按 3.3 V、0.4 V、3 mA 假设得到约 967 Ω,但这不是对所选编码器的灌电流能力背书。最终要使用实际器件数据,并在两端测量。

真板复测时,先把条件固定下来

边沿问题适合做对照实验,但前提是每次只改一个变量。

  1. 先记录实际编码器型号、线缆长度、两路所有上拉与 C4/C8 的装配值。检查是否存在模块自带上拉及电平转换;本文的模型不适用于未经核验的 5 V 接口。
  2. 暂不连接电机功率负载,先核对 3.3 V 供电、连接器脚序与启动条件。测量准备阶段不要把编码器接通等同于整板可以安全驱动电机。
  3. 固定同一根线和同一模块,从 100 kHz 开始,在 MCU 与连接器两端分别观察 SDA。探头本身增加电容,应记录探头档位和输入电容,用短接地方式减少测量引入的振铃。
  4. 对比原装电容与 DNP,再改变线长或速率。按实际供电的 30% 到 70% 测上升时间,同时记录高低电平、NACK、重试与连续读取结果;SCL 也要独立检查,不能用 SDA 的结果代替。
  5. 最后再评估电机运行时的干扰。只有无电容配置的边沿和通信表现都过关,才能决定最终装配;若需要抗干扰处理,应结合布线、回流、线缆与实际波形重新设计。
实际EDA底面走线

图7 同一 DNP 副本的实际 PCB 底面导出,已镜像为从底面观察。图中保留原铜箔;它用于定位接口与回流路径,不代表已经完成全板 ERC/DRC 或抗干扰实测。

这次修改的范围很小,但装配一致性已经落到文件里。原理图和 PCB 各只有 C4、C8 两个元件记录发生变化,其余形状逐项比较一致。真实 EDA 几何渲染也已留存,不过渲染仍显示封装模型,不能把它当成 DNP 装配后的实物效果。

下载并复算

代码包包含 rc_audit.py、独立交叉验证脚本、两种负载结果、原始与 DNP 修订 EDA JSON、装配覆盖表和必要高清图。运行环境固定为 Python 3.12.14、NumPy 2.3.5。进入解压后的 code 目录执行。

python -m pip install -r requirements.txt
python rc_audit.py --cable-pf 100 --output results-100pf.json
python rc_audit.py --cable-pf 200 --output results-200pf.json
python verify_model.py
python quick_check.py

--cable-pf 在此表示合并后的连接器端负载,不只是线缆电容。若已测出实际输入条件,应替换假设重新计算,而不是拿本文表格作板卡合格证。

完整代码与工程附件:dualfoc-v4-i2c-review-r2.zip(约 4.37 MiB)。包内附逐文件 SHA256 清单;完整 ZIP 的 SHA256 为 a540abd7a29acc2ccd57c9bd39a36e03daae9a7f29a6fac80ad9026d4c07498f。

来源与验证范围

取材项目为小路(zdldcyy)的《基于Simple FOC 和 ESP32的双路FOC控制器》,完整项目网址为 https://oshwhub.com/zdldcyy/ji-yu-Simple-FOC-ESP32de-shuang- ,项目页面标注 GPL 3.0。使用同一下载包的 V4 原理图与 PCB 建立副本,在嘉立创 EDA 中保存、导出高清母图,正文做保真裁剪、缩放、定位标记和图注处理,未复用原文章低清截图。

原工程、装配派生文件及相应 EDA 图按 GPL-3.0 提供;独立编写的本文文字、计算工具与讲解示意按 MIT 提供;平台 MIT 选项不改变第三方工程的 GPL-3.0 授权,附件保留许可全文及来源说明。本次实际完成 C4/C8 的 DNP 装配同步、阻容与引脚复核、两个负载场景的计算及独立数值交叉验证。未进行实体测试、完整电机固件验证、启动电路修复或全板 ERC/DRC。

参考资料包括 TI《I2C Bus Pullup Resistor Calculation》(https://www.ti.com/lit/slva689)、Espressif ESP32 I2C 驱动文档(https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/peripherals/i2c.html)及 esptool 启动模式说明(https://docs.espressif.com/projects/esptool/en/latest/esp32/advanced-topics/boot-mode-selection.html)。参考资料只引用必要公式与结论,附件不转载 TI 文档。

技术交流,欢迎关注微信公众号:美男子玩编程。

创作许可协议

本项目采用 MIT(MIT 协议开源软件许可) 进行许可。

评论(0)
- 没有更多了 -