{
    "version": "https://jsonfeed.org/version/1",
    "title": "Ivan's Blog",
    "home_page_url": "https://ivanli-cn.github.io/blog-26",
    "description": "记录技术探索、生活感悟和创意想法的个人空间",
    "icon": "https://ivanli-cn.github.io/blog-26/og-image.png",
    "author": {
        "name": "Ivan Li"
    },
    "items": [
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/zai4-utm-zhong1-chuang4-jian4-yi2-ge4-dai4-you3-xfce-zhuo1-mian4-huan2-jing4-de-archlinux",
            "url": "https://ivanli-cn.github.io/blog-26/posts/zai4-utm-zhong1-chuang4-jian4-yi2-ge4-dai4-you3-xfce-zhuo1-mian4-huan2-jing4-de-archlinux",
            "title": "在 UTM 中创建一个带有 xfce 桌面环境的 ArchLinux",
            "date_modified": "2026-03-12T12:54:55.223Z",
            "date_published": "2026-03-12T12:54:55.223Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": []
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/usb-pd-protocol-and-dc-dc-feedback",
            "content_html": "## 电流检测\n\n项目中设计了三种电流检测方案，分别是\n    - INA226 进行高侧或低侧采样，通过 I2C 进行通信\n    - INA193 进行高侧或低侧采样和放大，通过模拟信号供 ADC 使用\n    - INA138 进行高侧采样，通过模拟信号供 ADC 或 SW2303 使用\n\n### INA193 进行高侧或低侧采样\n\nINA19x 芯片支持高侧或低侧采样，其中 INA193 的增益是 20 V/V。\n这里选用了一路 INA193 进行验证，一是因为我用过 INA193，想进一步验证下 INA193 的性能和校准方案；二是我想看看 INA19x 这类电流检测放大器在高侧和低侧测量输出的差别。\n\n### INA138 进行高侧采样方案\n\n这个方案主要用于验证使用 INA138 将高侧采样的差模信号转为相当于低侧采样取得的差模信号，以便 SW2303 能够使用。\n\n![INA138电流检测电路图](https://viz-tweak.ivanli.cc/s/UCCM2YPtcucv.webp)\n\n从上面的数据手册给出的典型应用可以看出，INA138 支持配置输出增益。我准备设计两个增益：\n    - 1 V/V，供 SW2303 使用\n    - 20 V/V，供 MCU ADC 使用\n\n通过 20V/V 的增益，可以对比一下 INA138 与 INA193 在高侧采样时的差异。\n\n在输出端，实现了一个低通滤波器。使用计算公式 \\( f_{-3dB} = \\frac{1}{2 \\pi R_L C_L} \\) 来计算所需的电容值，并选择最接近的标准电容值。\n\n![INA138 Output Filter](https://viz-tweak.ivanli.cc/s/psVMzBap1eDt.webp)\n\n1. **5k 电阻, 1 V/V 增益**\n   - \\( R_L = 5 \\text{k}\\Omega \\)\n   - \\( f_{-3dB} = 10 \\text{kHz} = 10000 \\text{Hz} \\)\n\n   \\[ C_L = \\frac{1}{2 \\pi \\times 10000 \\times 5000} \\]\n\n   \\[ C_L \\approx 3.18 \\text{nF} \\]\n\n2. **100k 电阻, 20 V/V 增益**\n   - \\( R_L = 100 \\text{k}\\Omega \\)\n   - \\( f_{-3dB} = 10 \\text{kHz} = 10000 \\text{Hz} \\)\n\n   \\[ C_L = \\frac{1}{2 \\pi \\times 10000 \\times 100000} \\]\n\n   \\[ C_L \\approx 0.159 \\text{nF} \\]\n\n结果如下：\n\n| 电阻值 | 增益 | 计算所需电容 | 合适的标准电容 |\n|--------|------|----------------|----------------|\n| 5kΩ    | 1 V/V| 3.18 nF        | 3.3 nF         |\n| 100kΩ  | 20 V/V| 0.159 nF       | 150 pF        |\n\n### 使用运放实现恒压恒流反馈\n\n我选用的 DC-DC 控制器芯片，通过 FB 引脚来闭环控制输出电压。在一般的定压输出的情况下，通过电阻分压网络对 $V_{OUT}$ 进行分压，使 FB 电压 $V_{FB}$ 与 $V_{OUT}$ 成比例。DC-DC 控制器芯片根据实际的 FB 电压调整输出电压，使 得 $V_{FB}$ 与其内部的参考电压相等，从而实现恒压输出。\n\n而 USB PD 协议需要支持多电压输出，并且需要带有过流保护，我查阅了一些开源项目，感觉有点不理解，最后准备实现下面这种限流方案：\n\n![运放实现的恒压恒流反馈原理图](https://viz-tweak.ivanli.cc/s/TKjED-PovDS4.webp)\n\n这个方案实现了类似“与”的逻辑，FB 网络是通过电压信号控制 DC-DC 控制器的输出电压。\n未触发限流保护的情况下，由上面 N 沟道场效应管进行恒压，恒流反馈会因为电流未到达限流值而使下面的 N 沟道场效应管在力所能及的范围内尽可能地导通。\n一旦负载电流达到限流值，下面的场效应管会开始在线性区域内导通，这个时候 DC-DC 控制器的输出电压会下降，这样就实现了限流的功能。\n与此同时，由于 DC-DC 控制器输出电压下降，上面的场效应管会开始尽可能导通，以期望得到更高的输出电压。\n通过串联这两个“阀门”，使这俩个场效应管的组合阻值永远不低于最小的那个，从而实现恒压恒流模式。\n\n下面的场效应管给电流控制环路，主要是考虑未触发限流的情况下, 下面的场效应管产生的阻值相对来说是低且稳定的，能让上方的 N 沟道场效应管的源极（S）电位尽可能固定在 0 附近，减少引入的干扰。如果反过来，我就猜不出会不会出现什么曲折的跳动了，这个问题已经进入我的知识盲区了。\n同理，回到现在的方案，如果触发过流保护，这时我就不知道会发生什么了，但是大概最后应该是会稳定在上管线性，下管饱和。或许中间过程曲折，但是保护状态我就不挑三拣四了。\n\n这个方案是我想出来的，看起来和下图的有点像，希望能成功吧。\n\n![SW2303 功能框图](https://viz-tweak.ivanli.cc/s/Cyd0UCAokhY9.webp)\n\n### 使用 STM32G4 实现恒压恒流反馈\n\n恒压模式使用到 STM32G4 内部的 DAC3 和 OPAMP1；\n恒流模式使用到 STM32G4 内部的 DAC3 和 OPAMP3。\n其中，运放实现的功能是反相放大器。STM32G4 的片上运放是轨到轨输入和输出的。\n使用 DAC 输出参考电压送入运放的同相输入端，电压和电流信号分别送到两个运放的同相输入端，实现增大 DAC 输出就增大电压或电流。\n\n![STM32G4 运算放大器电路图](https://viz-tweak.ivanli.cc/s/nL5QQzeIFXzL.webp)\n\n上图是 STM32G4 运算放大器的原理图，参考上图并结合我们的用例，将同相输入端连接到 DACx 的输出端，将 VINM0 连接到分压的输出电压或分流的电压，就是我们需要的结果。\n\n至于这个外部电容的容值要用多少的，目前我不知道，所以先留个焊盘空着，后续再做调整。\n\n## USB PD\n\n### VBUS 泄放电路\n\nUSB Type-C 规范要求源端口在接收端口断开后的 650ms 内对 VBUS 进行放电到 5V 以内。所以需要一个泄放电路。\n\n下面是 LLM 计算的结果：\n\n#### 1. 计算电容放电所需的电阻值\n\n电容放电的公式为：\n\\[ V(t) = V_0 \\times e^{-\\frac{t}{RC}} \\]\n其中：\n\n- \\( V(t) \\) 是时间 \\( t \\) 时的电压\n- \\( V_0 \\) 是初始电压\n- \\( R \\) 是电阻\n- \\( C \\) 是电容\n- \\( t \\) 是时间\n\n我们知道：\n\n- \\( V_0 = 20 \\, \\text{V} \\)\n- \\( V(t) = 5 \\, \\text{V} \\)\n- \\( C = 1000 \\, \\mu\\text{F} = 1000 \\times 10^{-6} \\, \\text{F} \\)\n- \\( t = 650 \\, \\text{ms} = 0.65 \\, \\text{s} \\)\n\n将这些数值代入公式：\n\\[ 5 = 20 \\times e^{-\\frac{0.65}{R \\times 1000 \\times 10^{-6}}} \\]\n\n简化得到：\n\\[ \\frac{1}{4} = e^{-\\frac{0.65}{R \\times 0.001}} \\]\n\n取自然对数：\n\\[ \\ln\\left(\\frac{1}{4}\\right) = -\\frac{0.65}{R \\times 0.001} \\]\n\n\\[ -\\ln(4) = -\\frac{0.65}{R \\times 0.001} \\]\n\n解出 \\( R \\)：\n\\[ R = \\frac{0.65}{\\ln(4) \\times 0.001} \\approx \\frac{0.65}{1.386 \\times 0.001} \\approx 469 \\, \\text{ohms} \\]\n\n#### 2. 计算峰值电流\n\n峰值电流 \\( I_{\\text{peak}} \\) 在放电开始时最大，即 \\( t = 0 \\) 时：\n\\[ I_{\\text{peak}} = \\frac{V_0}{R} = \\frac{20}{469} \\approx 0.043 \\, \\text{A} = 43 \\, \\text{mA} \\]\n\n#### 3. 验证电阻值与放电时间\n\n使用0402电阻封装时，通常电阻的功率为0.063W (63mW)，需要确保在放电过程中功率不超出此范围。\n\n在放电过程中，瞬时功率可以计算为：\n\\[ P(t) = I(t)^2 \\times R \\]\n\n在峰值电流时：\n\\[ P_{\\text{peak}} = I_{\\text{peak}}^2 \\times R = (0.043)^2 \\times 469 \\approx 0.87 \\, \\text{mW} \\]\n\n这在0402封装的功率范围内。\n\n上面使用的公式看起来好像没啥问题，我就不验证了。直接使用 510  的电阻就行了。",
            "url": "https://ivanli-cn.github.io/blog-26/posts/usb-pd-protocol-and-dc-dc-feedback",
            "title": "搓一个 USB PD 协议与 DC-DC 反馈",
            "summary": "使用 STM32G431RBT6实现 USB PD 协议和 DC-DC 反馈控制。DC-DC 控制器选用 SC8701。本次的硬件电路作为开发板进行设计，带有一些额外的器件供外部调用、调试和复用。顺便验证一下高侧检流时使用 INA19x 系列芯片提取差模量来当做低侧检流的可行性。",
            "date_modified": "2026-03-12T12:54:55.210Z",
            "date_published": "2026-03-12T12:54:55.210Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": [
                "Hardware",
                "ST/STM32G431RBT6",
                "USB/USB-PD",
                "DC-DC",
                "SC8701",
                "INA193"
            ]
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/upgrade-all-in-one-pve-8-to-9-and-pbs-3-to-4",
            "content_html": "为了吃上 PVE 9 才有的 LXC 补丁，今天就升级一下 PVE 和 PBS 吧。看了下升级流程，需要先升级共装的  PBS，然后才能升级  PVE。之前都是硬盘挂掉之类的问题在重新安装时用最新版本镜像顺便完成大版本升级的，这次试试就地升级的方式。\n\n跑着主路由的 All in One，就地升级有点刺激，毕竟要是升级过程中软路由寄了可能就成鸡蛋问题了…… 先下载一个镜像防身吧：[Proxmox VE 9.1 ISO Installer](https://www.proxmox.com/en/downloads/proxmox-virtual-environment/iso/proxmox-ve-9-1-iso-installer)\n\n我在局域网内使用 SSH 连接宿主机，官方文档推荐使用 Tmux 来保持会话，所以我打开了珍藏多年的 [Tmux Cheat Sheet & Quick Reference](https://tmuxcheatsheet.com/)。\n\n一定要阅读 [Known Issues & Breaking Changes](https://pve.proxmox.com/wiki/Roadmap#9.0-known-issues) ，避免直接往坑里跳。\n\n这次升级我阅读了 [Upgrade from 8 to 9 - Proxmox VE](https://pve.proxmox.com/wiki/Upgrade_from_8_to_9) 和 [Upgrade from 3 to 4 - Proxmox Backup Server](https://pbs.proxmox.com/wiki/Upgrade_from_3_to_4)，并让 Gemini 2.5 Pro 帮我提取 `pve8to9` 和 `pbs3to4` 的提示信息，相关解决方案是我自己 Google 出来的。不太放心让 AI 直接搞，gpt-5.1-high 给的答案意外地有点抽象。\n\n## 就地升级准备工作\n\n## 准备 PBS\n\n首先确保当前是最新的 3.x 版本的 PBS：\n\n```shell\napt update\napt dist-upgrade\n```\n\n现在我是 PBS 3.4.8 了。运行 `proxmox-backup-manager versions` 确认一下：\n\n![pbs-version-3.4.8](./assets/pbs-version-3.4.8.png)\n\n备份一下配置，然后保存到其他设备上：\n\n```shell\ntar czf \"pbs3-etc-backup-$(date -I).tar.gz\" -C \"/etc\" \"proxmox-backup\"\ncroc send \"pbs3-etc-backup-$(date -I).tar.gz\"\n```\n\n根挂载点需要保留 10G 以上的可用空间，运行 `df -h /` 确认一下：\n\n![root-space-87G](./assets/root-space-87G.png)\n\n运行 `pbs3to4` 检查一下：\n\n![pbs3.4to4-checklist-1](./assets/pbs3.4to4-checklist-1.png)\n\n遇到两个问题：\n\n1. `FAIL: could not match the 'proxmox-backup' package version, is it installed?`\n   安装一下就行了，建议运行：`apt install proxmox-backup-server proxmox-backup `。 （[参考](https://forum.proxmox.com/threads/fail-could-not-match-the-proxmox-backup-package-version-is-it-installed.169513/post-790337)）\n\n2. `FAIL: systemd-boot meta-package installed. This will cause problems on upgrades of other boot-related packages.`\n\n   首先先检查自己是否使用 `systemd-boot` （[参考](https://forum.proxmox.com/threads/update-to-version-9-fail-systemd-boot.172356/post-813782)）：\n\n   运行 `efibootmgr -v` 和 `ls -lR /boot/efi/EFI/` 确认下：\n\n   ![检查引导加载程序](./assets/pbs3to4-check-boot-with-grub.png)\n\n   我使用的是 GRUB 引导，系统里也没有 `EFI/systemd` 目录，没有使用 `systed-boot`，所以我按提示卸载 `systemd-boot`：\n\n   ```shell\n   apt remove systemd-boot\n   ```\n\n再跑一次检查清单 `pbs3to4 --full`，现在没问题了：\n\n![pbs3.4to4-checklist-2](./assets/pbs3.4to4-checklist-2.png)\n\n## 准备 PVE\n\n*本来准备分别升级的，看了下后面步骤似乎是升级 Debian 了，看起来现在得先准备好  PVE 。 *\n\n我们之前已经对 `/etc` 目录备份了（虽然叫 `pbs3xxx`）。\n\n使用 `pveversion` 确认当前 PVE  版本（我们前面升级过了，现在应该是最新的）：\n\n![pve-version-8.4.14](./assets/pve-version-8.4.14.png)\n\n### 准备 Debian\n\n升级 Debian 基础仓库到 Trixie。我选择按新的 deb822 风格添加存储库，使用的是无订阅的，所以执行下面命令添加存储库并删除旧风格的文件：\n\n```shell\n# pve\ncat > /etc/apt/sources.list.d/proxmox.sources << EOF\nTypes: deb\nURIs: http://download.proxmox.com/debian/pve\nSuites: trixie\nComponents: pve-no-subscription\nSigned-By: /usr/share/keyrings/proxmox-archive-keyring.gpg\nEOF\n\n# ceph\ncat > /etc/apt/sources.list.d/ceph.sources << EOF\nTypes: deb\nURIs: http://download.proxmox.com/debian/ceph-squid\nSuites: trixie\nComponents: no-subscription\nSigned-By: /usr/share/keyrings/proxmox-archive-keyring.gpg\nEOF\n\n# pbs\n\ncat > /etc/apt/sources.list.d/pbs.sources << EOF\nTypes: deb\nURIs: http://download.proxmox.com/debian/pbs\nSuites: trixie\nComponents: pbs-no-subscription\nSigned-By: /usr/share/keyrings/proxmox-archive-keyring.gpg\nEOF\n\n# DELETE *.list\n\n rm /etc/apt/sources.list.d/*.list\n```\n\n之后运行 `apt update && apt policy` 确认下结果如何：\n\n![apt policy](./assets/pve8to9-apt-prolicy.png)\n\n让我重新运行 `pve8to9 --full` 和 `pbs3to4 --full`，现在只有一个需要在升级前解决的警告了：\n\n> [!WARNING]\n>\n> WARN: The matching CPU microcode package 'amd64-microcode' could not be found!\n\n但是我的源并没有这个 `amd64-microcode`， `amd64-microcode` 这个包位于 Debian 的 `non-free-firmware` 软件仓库组件中，需要更改 `/etc/apt/sources.list` 文件，在每一行末尾添加 `non-free-firmware`\n\n![sources.list](./assets/pve8to9-non-free-firmware.png)\n\n然后运行 `apt-update && apt install amd64-microcode`。\n\n在升级前强烈建议关闭所有 VM 和 LXC，由于我还跑了软路由，所以剩下软路由的 VM 没关，其他全停了，希望不要炸。\n\n现在，升级系统到 Debian Trixie、Proxmox VE 9.1、Proxmox Backup Server 4！\n\n```shell\napt dist-upgrade\n```\n\nOK，`apt-dist-upgrade` 正常退出了。现在重新运行 `pve8to9` 和 `pbs3to4`，确认一下是否有问题，看着解决就完事了~\n\n## 总结\n\n完成啦~\n\n- PVE 8.4.14 -> 9.1.1\n- PBS 3.4.8 -> 4.0.22\n\n升级过程还是挺丝滑的，没遇到怎么致命问题，服务中断15分钟左右,包括停止服务后更新时的下载软件包的时间，整个升级耗时大概两小时吧。",
            "url": "https://ivanli-cn.github.io/blog-26/posts/upgrade-all-in-one-pve-8-to-9-and-pbs-3-to-4",
            "title": "升级 All in One： PVE 8.4 -> PVE 9.1， PBS 3 -> 4",
            "summary": "记录一下 PVE + PBS 同宿主机共装的 All in One homelab server 的升级。\nPVE 8.1 -> 9.1： PBS 3.4 -> 4",
            "date_modified": "2025-11-26T00:00:00.000Z",
            "date_published": "2025-11-26T00:00:00.000Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": [
                "HomeLab/PBS",
                "HomeLab/PVE",
                "Ops/Linux",
                "Ops/PVE"
            ]
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/cloudflare-tunnel-for-intranet-penetration",
            "content_html": "大名顶顶 Cloudflare Warp 还是听过几次的~ 最近服务走 Cloudflare CDN，时不时出个 524 给我来这么一下，webhook 就容易失败。为了提升可靠性，我本来都准备不走 CDN 直接使用国内服务器做接入了，后面想了想有盾总比没盾强，就搜了下 Cloudflare Warp，想着这货除了做组网，能不能直接做隧道把我的站点公布到公网，然后就来到了 [Zero Trust](https://www.cloudflare.com/zh-cn/learning/security/glossary/what-is-zero-trust/)。\n\n## 使用 Cloudflare Tunnel\n\n步骤也不复杂，看看 [Create a tunnel (dashboard)](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/)\n\n主要步骤分两个，一个是在内网的服务器上运行 `cloudflared`，另一个是在 Cloudflare Dashboard 上创建隧道并配置应用程序。\n\n### 运行 cloudflared\n\n如果是服务器，推荐使用容器方式运行。我们使用 `token` 作为凭据，不需要 `cert.pem`。运行的命令在创建隧道的界面就有写，我就不复述了。\n\n### 配置应用程序\n\n在下面这个地方的子域里填 `*` 就能实现所有子域名下的服务转发到当前隧道。\n\n![Create App - Tunnels Dashboard](assets/Create%20App%20-%20Tunnels%20Dashboard_b5eb002d-d967-4857-9e76-b2351e1aba6b.png)\n\n如果要增加其他域名走这个隧道，还可以继续在这个隧道里创建应用。\n\n如果你是使用 HTTP 协议在内网访问服务，那么就这样完事了。如果是 HTTPS，那请记得在下图标记 ② 处填写 SNI 哦。\n\n![TLS Configuration - Tunnels Dashboard](assets/TLS%20Configuration%20-%20Tunnels%20Dashboard_56477373-85a8-4fa7-a4ee-9c7c185ad4bb.png)\n\n这里有点绕，我展开说说。\n\n- 如果你配置不是通配符（`*`）子域，那么源服务器名称填完整域名就行了；\n- 如果你配置通配符子域，那么你得填一个 Web 服务器支持的 SNI。\n    比如我是使用 Traefik，我有三个服务，绑定的域名分别是 `a.example.com`、`b.example.com`、`example.com`，那么这里 SNI 可以随便选一个填上。\n    不然你就会在 cloudflared 中看到下面的错误：\n\n    ```txt\n    tls: failed to verify certificate: x509: cannot validate certificate for\n    192.168.xx.xx because it doesn't contain any IP SANs`。\n    ```\n\n### 配置 DNS\n\n由于 Cloudflare Tunnel 中使用通配符域名时，不会自动设置 DNS 记录，所以需要手动创建 CNAME。\n值是 `<tunnel-id>.cfargotunnel.com`。\n\n## 防止 Mihomo 劫持 DNS\n\n配置完后死活连不上，一直报：\n\n```txt\nUnable to establish connection with Cloudflare edge error=\"TLS handshake with edge error: EOF\"\n\nServe tunnel error error=\"TLS handshake with edge error: EOF\"\n```\n\n网页访问一直是 `1033` 错误码，Cloudflare One Dashboard 看服务不健康。\n\n这是因为 Mihomo 的 FakeIP 功能导致的问题，需要排除掉。参考下面内容增加 `+.argotunnel.com` 这一行:\n\n```yaml\ndns:\n  enable: true\n  fake-ip-filter:\n    - +.lan\n    - +.local\n    - +.argotunnel.com # 👈\n```\n\n然后重启 Mihomo 和 `cloudflared`，就好了。",
            "url": "https://ivanli-cn.github.io/blog-26/posts/cloudflare-tunnel-for-intranet-penetration",
            "title": "Cloudflare Tunnel 实现内网穿透小记",
            "summary": "Cloudflare 大善人提供的 Cloudflare Tunnel 服务，可以实现内网穿透，让你的内网服务可以在公网上访问。\n使用通配符域名 + Traefik 反向代理，解决 Mihomo 的小坑，现在我可以直接不绕国内服务器直达小橙云了。",
            "date_modified": "2025-11-04T00:00:00.000Z",
            "date_published": "2025-11-04T00:00:00.000Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": [
                "IDC/Cloudflare",
                "HomeLab/内网穿透",
                "Ops/Linux",
                "Ops/Mihomo"
            ]
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/sk150c-kit-hardware-desgin",
            "content_html": "最近在做一些测试，感觉得用两个电源比较方便，所以想着再入手一个可调电源，但是看着常见的可调电源的外壳套件要 50 元以上，真的不想买……咱也不知道为啥这么贵。\n\n本来都准备买个小巧的 AC-DC 可调电源了，结果我看见了[基于sp120x的可调电源方案 - 立创开源硬件平台](https://oshwhub.com/mgxq/scheme-of-adjustable-power)。既然嘉立创能白嫖 3D 打印，之前用着可调电源模块也没感觉一定要使用金属外壳，那就拿主义搞个看看~\n\n本来想着直接拿去打印，但是仔细看看，感觉还是不太符合我的需求，所以我就决定自己改了。但是 STL 模型导到 FreeCAD 里并不能改，所以索性借鉴下尺寸，我自己重新做一个出来吧。\n\n## 设计\n\n### 适配 SK150C\n\n| SK150C                                                 | SK120X                                                 |\n| ------------------------------------------------------ | ------------------------------------------------------ |\n| ![ZK-SK150C 产品尺寸](./assets/ZK-SK150C-产品尺寸.png) | ![XY-SK120X 产品尺寸](./assets/XY-SK120X_产品尺寸.png) |\n\n参考的项目是适配 SK120X 的，能看出来和 SK150C 使用的开口是不一样的。如果想使用我的模型的朋友，注意自己要使用的模块尺寸。\n\n我找客服要到了 SK150C 前面板到散热的距离，大概是 50mm，和 SK120X 一样。不过由于 SK150C 比 SK120X 高了 4mm，所以外壳高度要调整，如果不出意外，深度也要适当加点，避免风扇挡到。\n\n*这下得先买实物才能继续了，我也想把尺寸做得极限点，得量量再继续建模了。*\n\n真机到手，测量了下前面板到散热模块的长度是 47mm，重新根据我测量到的尺寸，简单给这个可调电源模块建了个模。\n\n### 4mm 香蕉插座\n\n我搜了下淘宝，有好多款式的插座，我找了下似乎还是面板插座这种比较常见，最后选了常见的 8mm 面板开口的。后面是插簧连接的。\n\n![4mm 香蕉插座](./assets/4mm香蕉插座-YJX40015.png)\n\n![6.3mm插簧端子+护套母接头](./assets/6.3mm插簧端子_护套母接头.png)\n\n顺便我也找了个 2mm 的香蕉插座：\n\n![2mm香蕉插座](./assets/插孔2mm香蕉插座.png)\n\n大概这样的，面板开口 6mm。空间不允许我同时放这两种插座，所以我只选用了 4mm 的。\n\n插簧部分，淘宝翻了半天似乎大部分商家都不写承载的电流，不知道是不是不不重要或者说和能接的导线粗细相关。大概 10A 以上应该能用，就不细究了，直接用，不行就改焊接到插座上。\n\n### 输入电源开关\n\n由于我的可调电源的电源输入是来自多设备共用的 AC-DC 电源，所以为了避免老是亮屏还浪费电，准备在可调电源的前面板上加一个电源开关，用来控制电源输入。\n\n![短款金属按钮开关](./assets/短款金属按钮开关.png)\n\n我是计划选用 12mm 的金属按键开关，但是小尺寸的按键开关承载电流有限，最大的我也只找到 10A 的。所以我准备使用 12mm 自复式的开关 + MCU 控制 MOS 管的方式来时间输入电源控制。反正要画板子，多点功能多点花样了。买的是带灯款的，上电呼吸效果，开机就常亮。\n\n\n\n![12mm 平头复位尺寸](./assets/金属按钮开关_12mm平头复位尺寸.png)\n\n还有下面这种超短款的也可以考虑，能再少占点空间。\n\n![image-20250810111817345](./assets/image-20250810111817345.png)\n\n还有下面这款使用排线连接的：\n![image-20250810112038639](./assets/image-20250810112038639.png)\n\n我买的时候没太注意这事，为了买凸头款的按钮直接入了普通短款的。也好，便宜几毛，哈哈。\n\n![image-20250810113055530](./assets/image-20250810113055530.png)\n\n### DC 5025 输入输出接口\n\n项目的输入、输出分别设计有一个 DC 5025 接口。\n\n我找了半天没找到便宜的大电流 DC **立贴**接口，所以只能选卧贴的 DC007B 了。DC007B 最大 30V、10A 负荷，所以我们项目的输入能力就是 30V 10A 了。\n\n### USB-C  输入输出接口\n\nUSB-C 母座使用 5A 的母座就完事了。\n\n输入部分由 MCU 负责 USB-PD 协议握手，获取最高电压。\n\n输出部分，由于是由人来控制电压，我非常担心一不小心错用这个 USB-C 口给其他设备供电，所以计划使用 MCU 进行 VBUS 开关控制，每次使用时需要手动开启。在 USB-C 输出接口部分增加红绿 LED 指示灯，负责指示无输出、5.5 V以下、5.5V 以上电压。\n\n### 排针输出\n\n日常还是会需要直接使用杜邦线临时为一些电路供电，所以准备放 2.5mm 间隔、 2×4 排列的卧贴排针。这个直接连接到可调电源输出，不做额外处理。\n\n### PCB 与可调电源连接\n\n#### 电源部分\n\n电源部分我计划和可调电源一样，使用**5.08mm拔插式接线端子**。\n\n![5.08mm拔插式接线端子](./assets/5.08mm拔插式接线端子.png)\n\n另外可能会考虑让可调电源与 MCU 进行一些通信，所以再增加一个 4Pin XH 2.54 端子。\n\n### MCU 选择\n\n首先需要 MCU 能实现 USB-PD 握手，还需要具有 ADC 来检测可调电源的输出电压 以及温度检测，需要有 PWM 控制风扇，再来个串口通信。我找了下最终就是选 STM32G431CBU6 或者 STM32G071GBU6。虽然 STM32G071GBU6 便宜两块，但是他只有 CC1 引脚……在下没看懂咋玩，似乎得用 STM32G071GBU6N 才行，那么价格直接翻倍了。这下没得选了，直接使用 STM32G431CBU6 吧。\n\n## 供电设计\n\n由于使用了 MCU 和风扇，所以我们需要一个能将 7 ~ 36V 电压降到 5 V 的 DC-DC 电路，以及一个 3.3V LDO。\n\n### 5V 供电\n\nWEBBENCH：[TPS560430XDBVR 7V-36V to 5.00V @ 0.5A](https://webench.ti.com/appinfo/webench/scripts/SDP.cgi?ID=B717F4CBEBA54EE4)\n\n![TPS560430XDBVR 7V-36V to 5.00V @ 0.5A](./assets/TPS560430XDBVR 7V-36V to 5.00V @ 0.5A.svg)\n\n实在是有点没空间放了，我找了一个小体积 5040 磁胶电感，参数似乎比较极限，希望不要影响工作。\n\n### 3.3V 供电\n\n继续使用 RT9013。\n\n![3.3V 供电](./assets/SK150C-3.3V供电.png)\n\n## 风扇\n\n由于我不是很了解这款电源的温升情况以及自带的散热风扇能力如何，更不了解我设计的外壳会不会是个小闷罐，所以在背部留了外挂2507风扇的位置，并在\"输入和控制板\"上增加了支持4线风扇的接口和自带 PWM 调速的驱动电路。 \n\n![背板和出风口示意](./assets/SK150C-背板和出风口示意.png)\n\n## 打样\n\n外壳材质我选了灰色尼龙的，要价 82 元，白嫖了~\n\nPCB 打样选 1.6mm 厚度的。\n\n### 外壳\n\n等了三天，收到了外壳。拍照的时候忘记打灯光了，将就下。\n\n![IMG20250808200704](./assets/IMG20250808200704.jpg)\n\n![IMG20250808200716](./assets/IMG20250808200716.jpg)\n\n尼龙质感确实好，很实。外壳一共就俩部分，组合起来没啥问题，除了主体的外壳屁股下边弯了。我拿灯光逆光照着拍了张照片，能很明显看到下面向外弯曲了。我觉得装配好用几周也就自然压回去了，应该是小事。\n\n![IMG20250808203656](./assets/IMG20250808203656.jpg)\n\n另外一个问题就是，底部这些都是螺丝孔，不知道为啥没通，有一层很薄的面在那封着。可能是白嫖就这样？看起来自己拿东西捅一捅钻一钻就行。\n\n![IMG20250808203256](./assets/IMG20250808203256.jpg)",
            "url": "https://ivanli-cn.github.io/blog-26/posts/sk150c-kit-hardware-desgin",
            "title": "SK150C 外壳套件——硬件设计篇",
            "summary": "准备再买一个便宜的 DC-DC 升降压电源模块来使用，但是配套的外壳一个要 25 块，加上配套的配件一起就得 50 元以上，不如自己用 3D 打印做个更紧凑、具备 2.54 排针和 DC5025 输出的套件来适配。",
            "date_modified": "2025-07-28T00:00:00.000Z",
            "date_published": "2025-07-28T00:00:00.000Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": [
                "Project/SK150C-Kit",
                "Hardware/DC-DC",
                "Design/3D",
                "Software/FreeCAD",
                "Software/LCEDA"
            ]
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/dian4-zi3-fu4-zai4-rev3-kai1-fa1-bi3-ji4",
            "content_html": "## 电压检测\n\n![电压检测原理图-电子负载 Rev.3](assets/电压检测原理图-电子负载%20Rev.3_81ddcc54-d42d-4137-82e6-388bfe9a5616.png)\n\n上图就 Rev.3 的远端和近端电压采集电路的原理图。这个电路**右边**是母线电压，**左边**是 MCU 片上运放的输入端，最终实现的是一个差动放大器。就像 Rev.1 中的采样电路一样：\n\n![电压检测原理图-电子负载 Rev.1](assets/电压检测原理图-电子负载%20Rev.1_ee9144b0-673e-4634-b1bf-6e46d31157f5.png)\n\n能看出来， Rev.3 的电路原理上和 Rev.1 的电路一样，增加了一些滤波和保护电路。不过目前电压检测的结果不是很理想，在没进行额外校准的情况下误差会比 Rev.1 大一些，我怀疑是因为 MCU 片上 OpAmp 不够给力。\n\n我还特地为 HAL 实现了 MCU 自带的硬件校准，还是没有改观。这部分使用到 ADC 和 OpAmp 代码是我补充到 HAL 里的，我是觉得不太可能写错。OpAmp 内部连接 ADC 还是外部通过引脚复用送到 ADC 误差都差不多，只有改成电压信号单端直接送到 ADC，不经过 OpAmp，才没这个误差。\n\n本文后面会提到电压和电流读数以及 DAC 的软件校准。\n\n## 电流检测和硬件恒流\n\n![电流检测与硬件恒流部分原理图-电子负载 Rev.3](assets/电流检测与硬件恒流部分原理图-电子负载%20Rev.3_5bf845d0-2600-4665-908f-3b0d60ddc230.png)\n\n这次比较大的硬件变化就是电流检测部分了。电流信号的增益改用了 MCU 片上 OpAmp，毕竟片上资源不要浪费！设计上是支持独立模式和 PGA 模式：\n\n- 独立模式：MCU 片上 OpAmp 所有连接都引到引脚，通过外置电阻配置增益，实现了 11V/V 增益的差分放大器。\n- PGA 模式：MCU 片上 OpAmp 使用内置电阻配置增益，增益可以动态调节，但只能实现同相放大器。\n\n独立模式 vs PGA模式对比：\n\n| **特性**              | **独立模式（传统差分）**              | **PGA模式**      |\n|-----------------------|-------------------------------------|-------------------------------------|\n| **增益公式**           | \\( G = \\frac{R_f}{R_g} \\)           | \\( G = 1 + \\frac{R_f}{R_g} \\)       |\n| **电阻数量**           | 4颗（需严格匹配）                   | MCU 内置                       |\n| **CMRR**              | 依赖电阻匹配（1%电阻→≈46dB）         | 依赖PCB对称性（≈60dB）               |\n| **适用场景**           | 高CMRR需求、信号源阻抗低             | 中精度、布局紧凑场景                 |\n\n我目前选择的是独立模式。\n\n硬件恒流部分就没使用片上 OpAmp 了，因为作为负载的 MOSFET 的 $V_{GSth}$ 是 2~4 V，所以设计上是使用 5 V 的电压驱动它。那么咱就得让运放的供电是 5 V，才能让运放输出 0 ~ 5 V 的电压，这就不得不用外置运放了。\n\n目前原理图上标注的前馈电容电阻的值都是我根据实际测试得到的结果，估计这个还得根据使用的运放来确定。\n如果发现负载吸入的电流和 DAC 输出的电压有很大的出入，并且不怎么受 DAC 输出变化的影响，那么得用示波器看看运放输出和电流信号的电压波形是否是振荡的。如果是拿万用表测运放输入端之间的电压，可能会看到有电压差，那不不用像我一样懵逼地研究运放是不是还有什么神奇的特性还没掌握，赶紧拿上示波器看看。\n如果振荡的话，一点点地加电容就行（C12、C13；C31、C32）。加到波形比较平滑就差不多了应该，我不是很懂模电，都是跟着感觉走的。\n\n## 电压、电流信号输入保护\n\n由于这次使用 MCU 片上模拟外设，还是用了比较贵的 MCU，找了好久才找到比较便宜的型号和店家，18 元人民币捏，所以还花了点时间选了下保护器件。\n\n由于我不确定信号电压是否会超过 VDDA（3.3V），所以首先要做钳位保护，然后就是防止静电浪涌。这个保护主要还是给电压检测使用的。\n\n我找了一圈，我在 Rev.2 上使用了 PESD3V3L5UY，但是我后面发现了一个很狗血的问题，同一个型号居然有两个版本的内部结构图，一种是没钳位，每个 IO 使用双向 TVS 的，另一种是有钳位，所有 IO 共用一个 TVS，这把我搞蒙圈了。最后在做 Rev.3 时，找到了 CH412K，能买得到，价格还便宜，一次搞定钳位和 TVS。\n\n**[CH412K](https://www.wch.cn/products/CH412.html)**: 南京沁恒的四路ESD保护二极管阵列，用于高速信号保护。\n\n![CH412K 内部框图](assets/CH412K%20内部框图_bc5a4ac5-60a6-4ca1-ab8c-bbced79fb726.png)\n\n好的，这是 CH412K 的参数表格内容：\n\n**绝对最大值**\n\n| 名称 | 参数说明 | 最小值 | 最大值 | 单位 |\n|---|---|---|---|---|\n| TA | 工作时的环境温度 | -40 | 125 | ℃ |\n| TS | 储存时的环境温度 | -55 | 150 | ℃ |\n| VCC | CH412K 电源电压 (VCC 接电源, GND 接地) | -0.5 | 6.5 | V |\n| VIO | 保护通道引脚上的静态连续电压 (CH412K) | -0.5 | VCC+0.5 | V |\n| VIO | 保护通道引脚上的静态连续电压 (CH412Z) | -0.5 | 6.0 | V |\n| IMAX | 保护通道内部二极管的静态连续电流 | 0 | 100 | mA |\n\n**电气参数** (测试条件: TA=25℃, VCC=5V)\n\n| 名称 | 参数说明 | 最小值 | 典型值 | 最大值 | 单位 |\n|---|---|---|---|---|---|\n| VCC | CH412K 电源电压 | 1.0 | 3.3 | 5.5 | V |\n| ICC | CH412K 静态电源电流 |  | 0.1 | 2 | uA |\n| VF10 | 10mA 正向电流时, 二极管正向电压降 | 0.6 | 0.75 | 1.0 | V |\n| VZBR | 内部稳压箱位电压 (1mA 电流) | 6.0 | 6.5 | 8.0 | V |\n| IRK5 | 5V 输入时 CH412K 保护通道漏电流 | -0.1 | 0.02 | 1 | uA |\n| IRK | 0V~3.3V 输入时 CH412K 保护通道漏电流 | -0.1 |  | 0.1 | uA |\n| IRZ5 | 5V 输入时 CH412Z 保护通道漏电流 |  | 1 | 8 | uA |\n| IRZ | 0V~3.3V 输入时 CH412Z 保护通道漏电流 |  | 0.02 | 0.5 | uA |\n| VP5Z | 10uS 宽度 5A 脉冲电流下 CH412Z 箝位电压 |  | 15 | 20 | V |\n| VP5K | 10uS 宽度 5A 脉冲电流下 CH412K 的箝位电压 |  | 23 | 30 | V |\n| CIK | CH412K 保护通道的内部寄生电容 | 0.4 | 1 | 2 | pF |\n| CIZ | CH412Z 保护通道的内部寄生电容 | 10 | 20 | 36 | pF |\n\n\n虽然它的 TVS 钳位会在 6.5V，不过因为接了 3.3V 电源，所以一般情况下是由电源吃掉 IO 脚上超过 $V_{CC} + V_{FIO} = 3.3V + 0.75V = 4.05V$ 的电压。\n\n![STM32G473 引脚耐压](assets/STM32G473%20引脚耐压_a3031f6a-f691-4744-ada9-31861aeb1da3.png)\n\n而 MCU 对应引脚耐压是 3.6V 的，极限值是 4.0V。不是静电放电事件的情况下，能保护到多少我就不知道了，听天由命了先，SOT-363 封装的保护器件好像不太能满足，没炸 MCU 前就先这样吧。\n静电放电事件情况下 ，因为 ESD 器件和 MCU IO 口之间是有串电阻的，所以不用担心。\n\n## EEPROM\n\n**[M24C64-F](https://www.st.com/en/memories/m24c64-f.html)**: STMicroelectronics的64-Kbit I2C串行EEPROM。\n\n目前计划直接在固定的地址存储数模、模数转换查找表和一些设置数据。\n\n## 防反接二极管\n\n\n![电子负载 Rev.3 防反接二极管实物图](assets/电子负载%20Rev.3%20防反接二极管实物图_8ff82605-260c-498d-8fd2-4870ceafe918.png)\n\n没接风扇的时候，这俩货平分 5A 电流，温度能到 120℃。如果有下一个版本，得考虑每路再多贴一个。",
            "url": "https://ivanli-cn.github.io/blog-26/posts/dian4-zi3-fu4-zai4-rev3-kai1-fa1-bi3-ji4",
            "title": "电子负载 Rev.3 开发笔记",
            "summary": "上次做的电子负载 Rev.1，核心功能是没问题的，但是电压和电流读数不理想，可能还不是误差或者偏差，所以重新设计了两次电压电流检测方案，最终在 Rev.3 上改用 MCU 片上 OpAmp 做处理再送入 ADC，并修复和改进了一些地方。\nRev.3 目前硬件部分没什么问题了，这次另一个主要内容就是软件实现。搞上了 Web USB，效果还可以，无线部分估计要继续鸽了~",
            "date_modified": "2025-05-05T00:00:00.000Z",
            "date_published": "2025-05-05T00:00:00.000Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": [
                "Hardware/Circuit",
                "Project/ElectronicLoad",
                "Hardware/Component/OperationalAmplifier",
                "Hardware/MCU/STM32G431CB"
            ]
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/build-a-2a2c-usb-hub-with-independent-power-supply-using-ch335f",
            "content_html": "倒霉催的，上次做隔离 USB HUB 算是第二版了，已经换了个更简单的 HUB 芯片 CH335F 了，没想到还是会有问题。\n电脑是能正常识别到 HUB 设备，标识符读取也正确，但是不知道为啥连接下游设备后会复位。表现是下游设备掉电重启，强制拉高对应接口的过流信号使之为正常状态还是会断电。强制拉高对应接口电源芯片的使能信号使之为使能状态不会断电了，但是发现芯片工作怪怪的，时不时会从电脑上消失一下。\n\n后来发现 CH335F Active LED 灯封装是颠倒的，灯就贴反了。改正后能明显看到 Active 在闪，大概意味着在疯狂复位。不知道是不是因为我没贴 EEPROM，现在为了排查问题，得重新搞一个板子验证一下了。\n\n这次我找了个开源项目一起参考看看。\n\n## 双电源切换\n\n这个 USB HUB 支持辅助电源输入。虽然说是辅助，实际上它是主电源，而备用电源是上游主机提供的。这样在 HUB 上就能理直气壮地声明是独立供电，避免供电不足或上由主机因下游电流比较大时出现过流保护。\n\n我找了找芯片，本来决定选 [LM66200](https://www.ti.com.cn/product/cn/LM66200)，但是他只支持电压优先级选择。由于两个电源都是 5V，这可能会导致设备在两个电源之间反复切换……再加上不支持防倒灌，电流能力也只有 2.5 A，放弃了。\n\n所以我又用回了之前使用过的 [TPS2121](https://www.ti.com.cn/product/cn/TPS2121#design-tools-simulation)。TPS2121 挺好的，我的配置如下，看配置就知道它功能还挺全的：\n\n- 3.2 A 限流\n- VIN1 5.3 V 过流\n- VIN2 5.3 V 过流\n- VIN1 电压低于 4.82 V 时自动切换到 VIN2\n- VIN1 电压高于 5.0 V 时自动切换回 VIN1\n\n根据 USB 2.0 的规范，5V 的 VBUS，允许的电压范围是 4.75 V 到 5.25 V。之前设计 5.2 V 就算是过压，结果 Mac Mini M4 输出的是 5.23V，华丽丽地过压保护了，所以现在按我手头上有的电阻，设计成 5.3 V。\n\n![CH335F USB HUB 中 TPS2121 电路的参数计算结果](assets/CH335F%20USB%20HUB%20中%20TPS2121%20电路的参数计算结果_4022612f-ae7a-4011-9c0d-d4460e875933.png)\n\n[计算工具](assets/power_mux_design_calculator_ch335f_usb_hub.xlsx)\n\n## USB 3.0 支持\n\nCH335F 支持将一个下游口直通 USB 3.0 部分，实现一个具备 USB 3.0 的接口。我找了好久终于发现在旧版本（V1.2）的数据手册上是有提到这个功能的，目前 V2.7 版本的数据手册以及没这个内容了。\n\n![CH335F USB 3.0 直通](assets/CH335F%20USB%203.0%20直通_248192a7-19b5-4b3e-a3d9-7c999129c8cd.png)\n\n不知道现在买的到底有没有这功能了。资料也挺少的。我反正直接将上游和下游端口 4 的四对 SS 引脚连接在一起了，行不行就听天由命了。\n\n**更新：**我和 gemini 讨论了一下，大概了解到这个方案的可行性了。\n\n好的，为您总结一下关于 CH335F 的“USB 3.0 直通”功能以及您特定的 USB-C 独立 CC 线连接的讨论：\n\n1. **CH335F 的核心功能**：CH335F 是一款 USB 2.0 Hub 控制器芯片，主要负责管理和处理 USB 2.0 的高速 (480Mbps)、全速 (12Mbps) 和低速 (1.5Mbps) 数据传输。\n2. **“USB 3.0 直通”的实现方式**：这种功能并非指 CH335F 芯片内部具备完整的 USB 3.0 Hub 功能。根据您的观察和技术原理，它最可能是通过在 PCB 上将上游 USB 3.0 连接器的 SuperSpeed (SS) 数据线（SS_TX+/- 和 SS_RX+/-）直接连接到特定下游 USB 3.0 连接器的对应 SS 数据线来实现的，完全绕过了 CH335F 芯片本身。或许叫**旁路（bypass）**更加合适。\n3. **连接建立过程**：\n    - 首先通过 USB 2.0 的 D+/D- 线进行物理连接检测和枚举。CH335F 作为 USB 2.0 Hub 参与此过程，Host 通过 USB 2.0 枚举得知设备支持 USB 3.0。\n    - 随后，Host 和 Device 会在直连的 SS 数据线上独立进行 SuperSpeed Link Training，建立 5Gbps 或更高的数据链路。这个过程不依赖于 CH335F。\n4. **D+/D- 线的作用**：用于 USB 2.0 连接的建立和枚举，向 Host 传递设备支持的功能信息（包括 USB 3.0 能力），由 CH335F 处理。\n5. **SS 线的作用**：用于 USB 3.0 SuperSpeed 连接的建立 (Link Training) 和实际的高速数据传输，在您的设计中是直连的，不经过 CH335F。\n6. **独立 USB-C CC 线的影响**：在您上游和下游都使用 USB-C 接口，且两端的 CC 线独立用于各自的 UFP/DFP 功能（而非相互连接）的情况下，这 **不会影响** SuperSpeed 连接的建立。CC 线主要用于连接检测、角色和方向确定、基本供电协商等，但不直接参与 SS 数据传输或 Link Training 过程。SS 连接是在专门的 SS 数据线上独立进行的。\n\n通过结合 CH335F 的 USB 2.0 Hub 功能和 PCB 上的 USB 3.0 SuperSpeed 信号直连，实现了一个复合接口，其中 USB 2.0 部分由 CH335F 管理，而 USB 3.0 SuperSpeed 部分则是一个旁路通道。\n\n数据手册里一直没说这个直通功能和下游端口是否有绑定关系之类的事，让我非常疑惑这功能到底咋实现的。现在了解完 SS 旁路后，大概就是通过 USB 2.0 了解支持 3.0，尝试通过 SS 线连接，连得上就是那个带有 3.0 支持的接口，否则就是不支持，所以也就没啥绑定的事了。\n\n## 走线\n\n在设计USB 2.0和USB 3.0的PCB布线时，数据线的线宽需要根据信号完整性、阻抗控制和电流承载能力来确定。以下是针对USB 2.0和USB 3.0数据线宽的推荐：\n\n### USB 2.0 数据线（D+、D-）\n\n- **差分阻抗要求**：USB 2.0要求差分对（D+、D-）的差分阻抗为90Ω ± 10%。\n- **线宽推荐**：\n  - 在FR4材质（介电常数约4.2~4.6）的双层或多层板上，常见线宽为**6-10 mil**（0.15-0.25 mm），具体取决于PCB的层厚和介质厚度。\n  - 例如，对于0.8mm厚的双层板，1oz铜厚，线宽约**8 mil**，线间距约**6-8 mil**，可以较好地满足90Ω差分阻抗。\n- **布线建议**：\n  - 保持差分对等长，等距，尽量避免过孔。\n  - 避免信号线附近有其他高频信号干扰。\n  - 参考地平面要完整，差分线应尽量走内层或靠近地平面。\n\n### USB 3.0 数据线（SSTX+/-、SSRX+/-）\n\n- **差分阻抗要求**：USB 3.0要求差分阻抗为90Ω ± 7%，信号频率更高（5 Gbps），对信号完整性要求更严格。\n- **线宽推荐**：\n  - 线宽通常在**4-8 mil**（0.1-0.2 mm）之间，具体取决于PCB堆栈设计。\n  - 例如，对于4层板，1oz铜厚，介质厚度0.1mm，线宽约**5-6 mil**，线间距约**5-7 mil**，可满足90Ω阻抗。\n- **布线建议**：\n  - 差分对必须严格等长（长度误差控制在±5 mil以内）。\n  - 尽量走内层，靠近完整地平面，减少串扰。\n  - 避免过多的过孔，过孔会引入阻抗不连续。\n\n最后 2.0 和 3.0 的数据线都选择 6.2 mil 的线宽。\n\n![90Ω阻抗计算](assets/90Ω阻抗计算_20f4c753-2861-4c9a-a811-d442a2fb28f3.png)\n\n### 电源走线\n\n- **电源线（VBUS、GND）**：\n  - USB 2.0的VBUS/GND线建议线宽至少**20-30 mil**（0.5-0.76 mm），以承载最大500mA电流。\n  - USB 3.0可能需要更宽的线（如**30-50 mil**），尤其在支持快充时，需根据电流需求计算。\n\n在USB-C母座的设计中，关于VBUS引脚的电流分配和设计要求，以下是详细解答：\n\n#### USB-C母座VBUS引脚的电流分配\n\n- **USB-C母座的VBUS引脚**：\n  - USB-C母座通常有**4个VBUS引脚**（A5, A9, B5, B9），这是为了支持高电流传输（如USB PD的3A或更高）并确保连接可靠性。\n  - 这4个VBUS引脚在电气上是**并联连接**的，共同传输电力。电流会在这些引脚之间分配，具体分配比例取决于引脚接触电阻和PCB走线的阻抗。\n\n  - **走线线宽**：\n    - 在项目中使用的 PCB（四层板，1、4层1oz铜厚，2、3层0.5oz铜厚），走3A电流时：\n      - 外层（1oz）：推荐线宽**30-40 mil**（0.76-1.0 mm），10°C温升。\n      - 内层（0.5oz）：推荐线宽**60-70 mil**（1.5-1.8 mm）。\n    - VBUS走线应尽量短且宽，减少压降和发热。\n  - **过孔设计**：\n    - 项目中使用 0.3mm 孔径的过孔，单个过孔估计最多走 0.5 A 电流。。\n\n- **连接器选择**：\n  - 选择支持高电流的USB-C母座（标称支持3A或更高，如5A的PD连接器）。\n  - 确认连接器规格表，检查单个VBUS引脚的额定电流（通常1.25A以上）。",
            "url": "https://ivanli-cn.github.io/blog-26/posts/build-a-2a2c-usb-hub-with-independent-power-supply-using-ch335f",
            "title": "使用 CH335F 构建一个支持独立供电的 2A2C USB HUB",
            "summary": "上次搓的 HUB 连接下游设备后就会自动复位，不确定是哪一部分引起的问题，所以这次搓了个简化版本，正好我也需要不带隔离功能的 HUB，那么看看这次能不能一举两得。",
            "date_modified": "2025-07-18T00:01:10.505Z",
            "date_published": "2025-04-29T00:00:00.000Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": [
                "Hardware/Circuit",
                "Project/USB-Hub-CH335F",
                "design-tools-simulation)。TPS2121"
            ]
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/ups-design-hardware",
            "content_html": "三年前，我搭建了一个 Home Lab Server，跑了 All in One。当时就想着要搞个 UPS。\n想买但是找不到锂电池小体积的产品，所以就想着试试自己搓一个。\n当时补了些电路基础知识，上手搓了一个实验板本后，就换了新的机子，功耗太高不太敢继续搞了，也没时间研究。\n现在我也算是业余时间自学三年，搓了好多东西，经验至少攒了点。更重要的是我现在有时间搞了，可以开始填坑了。\n\n## 设计目标\n\n为了应对临时短期停电导致服务器重启，以及意外断电导致持久化存储器的数据和硬件可能的损坏。\n\n*这三年我的 AIO 因为断电坏过硬盘坏过数据，靠每日备份走到了今天，是备份让我有了拖延的勇气！*\n\n我的 AIO 主力是一台 AMD Ryzen™  R5-5900HX mini PC，插了俩内存、俩 NVME SSD、一个 2.5寸 HDD。DC in 功耗还没测，不过我计划根据原装电源的 $19V \\times 6.32A \\approx 120W$ 来设计额定输出功率。\n\n另外我还有一个三年前使用的 J4125 工控小主机，这个功耗就很低了，输入电压 DC 12V。我计划设计上支持 12V 或 19V 输入输出，电流支持 6.5A。先用 J4125 进行真机测试，然后再用 5900HX 做最后测试，希望不要 BOOM！\n\n这样的话，电源接口会设计三个：\n\n- DC IN。使用 5525 DC 接口，12V ~ 19V、6.5A。\n- USB-C。使用 PD 12V ~ 20V 电压输入，5 A。（主要为了方便测试）\n- DC OUT。使用 5525 DC 接口，12V ~ 19V、6.5A。\n\n另外，为了更好地了解实时情况，会设计一个小屏幕用来显示一些信息：\n\n- 输入电压、电流、功率\n- 输出电压、电流、功率\n- 充电状态、电流、温度\n\n再配合一个蜂鸣器来发出提示：\n\n- 市电离线（周期性提示）\n- 电量不足（急促持续提示）\n- 充电提醒\n\n为了最大程度降低风险，充电需要用户手动批准。毕竟锂电池充电阶段风险会相对高些。这个 UPS 定位是 HomeLab 适用的储能产品，家肯定是每天要回的。国内基建真的稳，现在一年也停不了几次电，所以有人值守地充电综合来看应该没问题。当然这部分我计划是软件实现的，最后手动还是自动就写固件里了。\n\n整个系统工作流程就是：\n\n```mermaid\ngraph TD\n    Start[系统启动] --> CheckPower{检查市电状态}\n    CheckPower -->|市电在线| NormalMode[进入正常供电模式]\n    CheckPower -->|市电离线| BatteryMode[切换至电池供电]\n  \n    NormalMode --> DisplayInput[显示输入电压/电流/功率]\n    NormalMode --> DisplayOutput[显示输出电压/电流/功率]\n    NormalMode --> CheckVoltage{检查电池电压}\n    CheckVoltage -->|低于开始充电电压| RequestCharge[请求用户批准充电]\n    CheckVoltage -->|高于或等于开始充电电压| CheckForceCharge{检查用户是否要求立即充电}\n    RequestCharge -->|用户批准| StartCharging[开始充电]\n    CheckForceCharge -->|用户要求立即充电| StartCharging\n    RequestCharge -->|用户未批准| Standby[保持待机]\n    CheckForceCharge -->|用户未要求| Standby\n    StartCharging --> ShowCharge[显示充电状态/电流/温度]\n    StartCharging --> MonitorSafety{监控充电安全}\n    MonitorSafety -->|异常| AlarmError[蜂鸣器急促提示]\n    MonitorSafety -->|正常| ContinueCharge[继续充电]\n  \n    BatteryMode --> AlarmOffline[蜂鸣器周期性提示市电离线]\n    BatteryMode --> ShowBatteryOutput[显示输出电压/电流/功率]\n    BatteryMode --> CheckBattery{检查电池电量}\n    CheckBattery -->|电量充足| MaintainOutput[维持输出]\n    CheckBattery -->|电量不足| AlarmLow[蜂鸣器急促持续提示]\n    AlarmLow --> ProtectMode[要求主机关机]\n  \n    MaintainOutput --> OutputPower[输出至 DC OUT]\n    ContinueCharge --> ChargeDone[充电完成]\n    ChargeDone --> AlarmDone[蜂鸣器提示充电完成]\n    AlarmDone --> ReturnStandby[返回待机状态]\n```\n\n## 选型\n\n### 电池组\n\n#### 选择磷酸铁锂电池\n\n储能选择磷酸铁锂（LiFePO4）电池组。磷酸铁锂电池相对三元锂电池：\n\n**优势**：\n\n1. **高安全性**：UPS需长时间运行，LiFePO4 的热稳定性降低事故风险。\n2. **长寿命**：高循环次数适合频繁充放电场景，降低维护成本。\n3. **温度适应性**：宽工作温度范围适合不同环境。\n4. **环保**：无稀有金属，符合绿色能源趋势。\n\n**劣势**：\n\n1. **能量密度低**：相较 NMC，体积/重量更大，可能影响便携性。\n2. **电压平台低**：3.2V单体需更多串联以达 UPS 所需电压，增加 BMS 复杂度。\n\n#### 电池组选择串联\n\n根据中学物理的说法，我们可以简单、近似地认为多个电池串联电压相加，并联电流能力相加。我们的目标电压是至少 12V 输出，为了减少电压转换损耗，应该选择将电池串联，以获得更高的电池组输出电压。\n\n但是问题随之而来，由于每颗电池内阻和初始能量不可能完全相同，所以多串电池组需要对每颗电池进行电压均衡，以免日积月累，出现部分电池过充过放，最终造成容量下降，电池损坏。如果还没有电池组保护电路，那甚至会引发更严重的安全问题。\n据说磷酸铁锂电池接近满电时的电压相比三元锂电池的接近满电时的电压，区别比较小，这对电池均衡电路是一个不小的挑战。三年前好像这个很是个有点难搞的时，现在似乎没看到相关问题了。而且比较令人愉快的是，保护芯片方案好像也好找多了，不知道是我懂得玩了还是时间出手解决了一切。\n\n为什么要均衡可以看看火先生的视频：[锂电池均衡是干啥用的，主动均衡和被动均衡有什么区别？](https://b23.tv/bagesCh)\n\n#### 电池组保护方案\n\n目前找到下面几款芯片：\n\n| **型号**                                                           | **支持串数** | **适合的电池种类**                                | **均衡电流**  | **I2C 支持**                                       | **充电管理**                                                                                     |\n| -------------------------------------------------------------------- | -------------- | --------------------------------------------------- | --------------- | ---------------------------------------------------- | -------------------------------------------------------------------------------------------------- |\n| [**BQ76920**](https://www.ti.com/product/BQ76920)                  | 3S-5S        | 磷酸铁锂（LiFePO4）、三元锂（NMC）、钛酸锂（LTO） | 50mA（被动）  | 原生支持，稳定，读取电压、电流、温度               | 需外接充电芯片（如[BQ24610](https://www.ti.com/product/BQ24610)，CC/CV，最大 6A）                |\n| [**CW1274**](https://www.cellwise-semi.com/product/CW1274)         | 3S-5S        | 磷酸铁锂（LiFePO4）、三元锂（NMC）                | 60mA（被动）  | 原生支持，需固件配置，读取电压、电流、SOC          | 集成基本 CC/CV 充电控制（最大 5A，需外接 MOSFET 增强）                                           |\n| [**LTC6810-2**](https://www.analog.com/en/products/ltc6810-2.html) | 3S-6S        | 磷酸铁锂（LiFePO4）、三元锂（NMC）、其他锂电池    | 200mA（被动） | 原生支持，稳定，支持 I2C/SPI，读取高精度电压、温度 | 需外接充电芯片（如[LTC4015](https://www.analog.com/en/products/ltc4015.html)，CC/CV，最大 10A+） |\n\n#### BQ76920\n\n我感觉 BQ76920 好像是一个比较合适的选择，TI 资料看着确实舒服些，价格也比较低，唯一的问题是可能只能买到翻新的。具体型号是 `BQ7692003PWR`。\n\n![BQ76920 特性](assets/BQ76920-features-a87ab7bd-4e90-4d3b-9acd-19375c0c532b.png)\n\n![BQ76920 功能框图](assets/BQ76920%20功能框图_569a0836-cf42-49df-b3d0-048e759b462a.png)\n\n功能上满足我们的需求。那么剩下的就是两个问题需要确认下，一是是否支持磷酸铁锂电池，二是放电电流是否适配。\n\n> Overvoltage (OV) and undervoltage (UV) protections are handled digitally, by comparing the cell voltage readings against the 8-bit programmed thresholds in the OV and UV registers.\n>\n> The OV threshold is stored in the OV_TRIP register and is a direct mapping of 8 bits of the 14-bit ADC reading, with the upper 2 MSB preset to “10” and the lower 4 LSB preset to “1000”. In other words, the corresponding OV trip level is mapped to “10-XXXX-XXXX–1000”. The programmable range of OV thresholds is approximately 3.15 to 4.7 V, but this is subject to variation due to the (GAIN, OFFSET) linear equation used to map the ADC values.\n>\n> The UV threshold is stored in the UV_TRIP register and is a direct mapping of 8 bits of the 14-bit ADC reading, with the upper 2 MSB preset to “01” and lower 4 LSB preset to “0000”. In other words, the corresponding UV trip level is mapped to “01-XXXX-XXXX–0000”. The programmable range of UV thresholds is approximately 1.58 to 3.1 V, but this is subject to variation due to the (GAIN, OFFSET) linear equation used to map the ADC values.\n>\n>\n> | Protection | Upper 2 MSB | Middle 8 Bits           | Lower 4 LSB |\n> | ------------ | ------------- | ------------------------- | ------------- |\n> | OV         | 10          | Set in OV_TRIP Register | 1000        |\n> | UV         | 01          | Set in UV_TRIP Register | 0000        |\n>\n> ---\n>\n> 过压（OV）和欠压（UV）保护是通过数字方式实现的，通过将电池电压读数与OV和UV寄存器中编程的8位阈值进行比较。\n>\n> OV阈值存储在OV_TRIP寄存器中，是14位ADC读数的8位直接映射，高2位MSB预设为“10”，低4位LSB预设为“1000”。换句话说，相应的OV跳闸电平被映射为“10-XXXX-XXXX–1000”。OV阈值的可编程范围大约为3.15至4.7V，但这个范围会因用于映射ADC值的（增益，偏移）线性方程而有所变化。\n>\n> UV阈值存储在UV_TRIP寄存器中，是14位ADC读数的8位直接映射，高2位MSB预设为“01”，低4位LSB预设为“0000”。换句话说，相应的UV跳闸电平被映射为“01-XXXX-XXXX–0000”。UV阈值的可编程范围大约为1.58至3.1V，但这个范围会因用于映射ADC值的（增益，偏移）线性方程而有所变化。\n>\n>\n> | 保护类型 | 高2位MSB | 中间8位             | 低4位LSB |\n> | ---------- | ---------- | --------------------- | ---------- |\n> | OV       | 10       | 在OV_TRIP寄存器设置 | 1000     |\n> | UV       | 01       | 在UV_TRIP寄存器设置 | 0000     |\n\n上面是 BQ76920 的数据手册片段，下面是磷酸铁锂（LiFePO4）电池一些电压范围。\n\n| 参数         | 电压范围        | 保护板设置         |\n| -------------- | ----------------- | -------------------- |\n| 标称电压     | 3.2V/单体       | -                  |\n| 满充电压     | 3.60-3.65V/单体 | 3.65V（4S: 14.6V） |\n| 放电截止电压 | 2.50-2.80V/单体 | 2.50V（4S: 10.0V） |\n| 工作电压范围 | 2.80-3.60V/单体 | -                  |\n| 过流保护     | -               | 12A                |\n| 过温保护     | -               | 60°C              |\n\n可以看到 BQ76920 是能够保护磷酸铁锂电池的。\n\n根据公式计算，假设 DC-DC 输出转换电路的效率是 85%，放电电路最大会是在电池组电压在：\n\n$$\n\\begin{align}\nW_{out} &= 120W / 85\\% \\approx 140W \\\\\nV_{out} &= 2.5V \\times 4 = 10V \\\\\nI_{out} &= W_{out} / V_{out} = 140W / 10V = 14A\n\\end{align}\n$$\n\nBQ76920 数据手册的典型应用示例中，使用 5mΩ 的电阻实现了 10A 的放电能力。\n\nBQ76920 配置过流电流时，实际上是配置电流感应电阻两端的电压差，所以我们可以根据需要调整感应电阻器的阻值来适应不同的电流。\n根据功能框图和简化应用，能看到功率路径上都是连接在外围器件上，放电和充电开关场效应管也是外部集成的，所以在电流方面限制不大。 BQ76920 支持并联多个场效应管来获得更大电流的支持。\n\n#### 电池组与保护板体积\n\n我们选择使用 4 节 26650 电池。我计划购买四个预焊接镍片单节电池，直接并排焊接到 PCB 的一面上。这样长宽高就是：\n\n$$\n\\begin{align}\nL = 65mm \\\\\nW = 26mm \\times 4 = 104mm \\\\\nH = 26mm + 1.6mm = 27.6mm \\\\\n\\end{align}\n$$\n\nPCB 只能白嫖 100mmx100mm，所以保护板大概会做成 70 mm 宽、100 mm 长的。然后电池横向焊接在上面。\n\n### 设备外壳\n\n我计划使用公模铝合金外壳，看起来就很安全，散热也好。外壳侧面不开孔，IO 面使用阻燃的 3D 打印模型。\n\n我找了一圈，大概确定使用 [88*38*150 (mm) 的公模外壳](https://item.taobao.com/item.htm?id=579504968901)。电池组+保护板作为一个模块，大概占用后面 110mm 的空间，还剩下 80mm*40mm*34mm 的空间给其余组件使用。\n\n外壳确定后，我也大概确定了项目会分成几个 PCB 进行设计。\n\n1. 电池组模块（电池 + 保护板）\n2. 电池充电和 DC-DC 模块\n3. 双电源切换和电源 IO 模块（可能带有其他电压的转换输出）\n4. 控制模块（屏幕、按键、MCU）\n\n### 充电控制器\n\n#### BQ24610\n\n[**BQ24610 1 节至 6 节电池的独立同步降压电池充电器控制器**](https://www.ti.com.cn/product/cn/BQ24610)。\n\n> **BQ24610 芯片简介**\n>\n> BQ24610 是 Texas Instruments 推出的一款高效同步开关模式电池充电管理芯片，专为 1-6 节锂离子/锂聚合物电池设计。支持 5V 至 28V 输入电压，最大充电电流达 10A，采用 24 引脚 VQFN 封装。\n>\n> **主要特性**：\n>\n> - **高效充电**：NMOS-NMOS 同步降压架构，效率 >92%，支持 600kHz/800kHz/1.2MHz 可调频率。\n> - **灵活控制**：通过外部电阻设置充电电压（精度 ±0.5%）和电流（精度 ±3%），支持涓流、恒流、恒压充电模式。\n> - **安全保护**：输入过压、电池过压、短路保护，NTC 温度监测，可编程安全计时器。\n> - **电源管理**：动态电源路径选择，支持无电池系统供电，低静态电流（待机 25µA，关断 1.2µA）。\n> - **状态监控**：通过 STAT1/STAT2 引脚输出充电状态，CE 引脚控制充电启用。\n>\n> **典型应用**：便携设备、工业备份电源、太阳能充电系统。\n\n> **简化原理图**\n>\n> ![BQ24610 简化原理图](assets/BQ24610%20简化原理图_be23f8dd-a932-4d98-811e-60d2a22a24d5.png)\n\n这款芯片带有电源路径选择功能，通过连接外部场效应管就能控制外部适配器或电池给系统供电，省得我再单独找电源路径选择芯片了。\n\nBQ24610 并没有针对磷酸铁锂电池进行优化，但它是比较通用型的锂电池充电器，能够设置充电电压，所以算得上是兼容。全部外部 MOSFET，应对 UPS 的设计功率应该没问题。\n\n**更新**：为了支持 12V 电源和 3 串以上电池组，所以还不能使用仅支持降压充电的芯片。\n\n#### BQ25703A\n\n**[BQ25703A](https://www.ti.com/product/BQ25703A)**: 一款德州仪器（TI）推出的I2C控制、NVDC架构的多化学电池充电管理IC，适用于笔记本等便携设备的高效电源解决方案。\n\n> BQ25703A 是一款由 Texas Instruments (TI) 推出的电池充电控制器。它是一款同步升降压 (buck-boost) 电池充电控制器，旨在为 1 到 4 节串联电池（最高支持 19.2V）提供灵活的充电解决方案。该芯片支持多种输入源，包括 USB Power Delivery (USB PD) 和传统适配器，并能自动检测输入源类型。它集成了 I²C 接口，允许系统微控制器配置充电参数、监控充电状态以及系统电源管理。BQ25703A 常用于笔记本电脑、平板电脑、便携式电源以及其他需要高效电池充电和系统电源路径管理的应用中。\n\n**更新**：本来是准备使用 4 串电池，后面为了降低电流，改用 5 串了。\n\n#### BQ25730\n\n**[BQ25730](https://www.ti.com/product/BQ25730)**: 一款同步 NVDC 升降压电池充电控制器，支持 1-5 节电池充电，具备电源路径管理和 USB-C PD OTG 功能。\n\n> BQ25730 是 Texas Instruments (TI) 推出的一款同步升降压 (buck-boost) 电池充电控制器。与 BQ25703A 类似，它也支持广泛的输入电压范围和多种电池节数配置，通常用于需要灵活电源输入和高效电池充电的应用。BQ25730 同样集成了电源路径管理功能，允许系统在不通过电池的情况下直接从适配器供电，同时为电池充电。它也具备通信接口（如 I²C），方便系统进行配置和状态监控。这类芯片广泛应用于各种便携式电子设备、工业设备和储能系统中，以优化充电效率和系统整体电源管理。\n\n![BQ25730 应用示意图](assets/BQ25730%20应用示意图_85e2d862-3519-43d9-adf5-73a35d7e1825.png)\n\n### DC-DC 模块\n\n按照目前设计，外部适配器连接与电池二选一输入到 DC-DC 升降压电路，然后输出合适的电压输出给用电设备。这样一来，DC-DC 电路就是一直在工作了。\n\n### SC8701\n\n我准备直接使用 [SC8701](../../Datasheets//Power//Buck-Boost/SC8701%20同步%20Buck-Boost%20控制器.pdf) 作为 DC-DC 控制器。通过电阻配置输出固定的电压。\n\n## 设计\n\n### 功率粗算\n\n首先，根据下游设备的额定功率计算：$P_{out} = V_{out} * I_{out} = 19V * 6.32A = 120.08W$。\n接下来，考虑 DC-DC 的效率，假设 DC-DC 的效率为 80%，那么 DC-DC 的功率为:$P_{in} = P_{out} / 88% \\approx 141W$。直接取整数，就是 140W。这样电池需要能输出 140W 的功率。\n\n### 电池组和保护板设计\n\n**电池组参数:**\n\n- **标称电压:** 5 * 3.2V = 16V\n- **最高电压:** 5 * 3.65V = 18.25V\n- **最低电压:** 5 * 2.5V = 12.5V\n- **容量:** 3600mAh\n- **总内阻 (R_batt_int):** 5 * 13.5mΩ = **67.5mΩ**\n- **放电倍率:** 3C = 3 * 3.6A = 10.8A (持续放电能力)\n\n**140W 输出下的电流:**\n\n- **峰值电流 (发生在最低电压时):** I_max = 140W / 12.5V = **11.2A**。\n    *(对比 4S: 峰值电流为 13.3A @ 10.5V)*\n- **初始电流 (发生在较高电压时，例如 16V):** I_initial = 140W / 16V = 8.75A。\n\n**峰值发热量计算 (发生在电流最大即 11.2A 时):**\n\n- **电池发热 (P_batt = I² * R_batt_int):**\n  - P_batt_peak = (11.2A)² *0.0675Ω ≈ 125.44* 0.0675 ≈ **8.47W**。\n\n#### 电芯电压节点连接\n\n根据数据手册说明，电芯两端连接的电容 $C_c$ 在 100nF 到 10 μF 之间，典型值是 1μF，电芯连接到 VCx 的电阻 $R_c$ 的值在 10Ω 到 1kΩ 之间，典型值是 100Ω。我们选择典型值就好。\n\n![电芯外部输入电容电阻值](assets/电芯外部输入电容电阻值_841b5471-0dca-4f7c-a403-310fd1167d4f.png)\n\n因为电芯电压不可能高于 5V，所以电容我选择耐压 10V 的。\n按照数据手册的说明，内置的均衡电路，电流最大 50mA，最大功率是 $ W_${cmax} = 100Ω \\times 50mA = 5mW $，远小于 0402 封装的 62.5mW，所以选 0402 封装的。\n\n![每个电芯平衡电流（内部）](assets/每个电芯平衡电流（内部）_4bfe51a2-1721-4b62-b184-9e9d54cf5148.png)\n\n#### 检流电阻选择和相关寄存器配置\n\n根据最大电流 11.2A 的输出，所以我计划过流保护设计上需要允许 12A，这个也是电池组极限了。下图是过流保护的寄存器配置可选值。\n\n![Overcurrent in discharge threshold setting](assets/Overcurrent%20in%20discharge%20threshold%20setting_9ec10943-e887-4092-8773-720f38f8cc38.png)\n\n根据上面的寄存器配置说明，检流电阻分压的最大值有两个档位，使用放电截止电压带入计算，可以求出下表：\n\n| RSNS | 感应电压 | 合适的电阻阻值 | 对应的最大电流 | 电阻功率 |\n| ---- | ------------ | -------------- | -------------- | -------- |\n| 1    | 56mV        | 5mΩ            | 11.2A         | 0.627W    |\n| 1    | 61mV        | 5mΩ            | 12.2A         | 0.744W    |\n| 0    | 42mV         | 3mΩ          | 14A         | 0.588W     |\n| 0    | 39mV         | 3mΩ          | 13A         | 0.507W     |\n| 0    | 36mV         | 3mΩ          | 12A         | 0.432W     |\n\n这里我决定使用 3mΩ 的 1206 合金采样电阻，对应的 OCD_T 值设为 `0xA` (36mV)，RSNS设为 `0`。\n\n#### 保护场效应管\n\n根据最大电流 12A 计算，留足降额和散热，应该考虑 持续电流 ≥20A 的 NCH FET。内阻需要考虑，大电流时散热问题还是比较重要的，尤其是这些器件会和电池是背靠背贴在 PCB 上的。最后我选择的是 **[NCEP4090GU](https://uploadcdn.oneyac.com/attachments/files/brand_pdf/ncepower/NCEP4090GU.pdf)**: 一款N沟道超级沟槽功率MOSFET，适用于高频开关和同步整流，典型RDS(ON)为2.2mΩ（VGS=10V），工作温度可达150°C。\n\n两颗背靠背保护 FET功耗是 $P_fet_peak ≈ (14A)² * 0.0055Ω * 1.5 ≈ 113.85 * 0.00825 ≈ 0.94W$。\n1\n这样看选择 NCEP4090GU 应该足够了。\n\n我看大家的大功率保护板上都贴了不只一对的 FETs，我就设计了两对的位置。\n\n![UPS 电池保护板设计两对 FETs 位置](assets/UPS%20电池保护板设计两对%20FETs%20位置_dce09c37-73eb-4169-9da3-d61386e285ee.png)\n\n#### 电池组放电温度\n\n和 gemini-2.5-pro-exp-03-25 用简单的模型和最坏的条件得出下面的粗略结论：\n\n在 35°C 环境温度下，要散发 11.9W 的热量，外壳的平均温度可能达到约 61°C。由于电池到外壳之间存在内部热阻（包括电池本身、导热垫及接触热阻），电池表面的峰值温度预计会比外壳平均温度高出约 4°C 或更多，达到约 65°C 左右。\n\n可以明显看到这个情况比较糟糕，不过这个糟糕的状态是出现在电池放电的末期的极端情况，而末期应该是逐个虚拟机关机的时间，我相信功耗不可能达到这个情况，如果达到了，可以考虑通知主机立即关机。\n\n不过这是最极端的情况，因为估算时使用的是适配器的额定输出功率 140W，主机正常使用的情况下，是不可能达到 140W 的，但是我还没有实测过功耗，根据 gemini 的估算，大概峰值功耗是在 70 ~ 110W，取 100W 计算，发热在 5.9W，则温度就能在 50°C 左右。后续上机测试看看，目前我就不去担心这个事了，温度保护设在 60°C 就断电。\n\n#### 高侧 FET 驱动器 BQ76200\n\n本来没准备做高侧背靠背开关的，电池组 PCB 画完了才觉得不对劲，地不通呀！由于主控 MCU 是外接的，所以为了能在保护动作后还能继续通信，得改成高侧开关。\n\nBQ76920 和 BQ76200 的数据手册相互推荐了对方做搭配，我也就懒得找了，能买得到就行，所以就使用 BQ76200 作为高侧 FET 驱动。\n\n下文会将 BQ76200 直接称作 “FET 驱动器”，实在是因为 BQ76200 太容易和 BQ76920 混淆了……\n\n**[BQ76200](https://www.ti.com/product/BQ76200)**: 德州仪器（TI）的高压电池包前端充放电高侧NFET驱动器，用于电池管理系统。\n\n![BQ76200 简化原理图](assets/BQ76200%20简化原理图_bfa0efeb-14c4-4abf-a7af-fe7a9610d97f.png)\n\n设计上保留了预充电电路，但是我短期内应该不会使用这部分电路，主要是充电控制器芯片支持预充电功能，所以至少预充电功能不用这部分电路也能做。\n更主要的是这个预充电使能只能由保护板外部的逻辑电平使能，BQ76920 并不支持控制，这导致保护逻辑依赖 MCU 的处理，有点增加项目复杂度了，可靠性也不好说，后续要实现还得看看 BQ76920 配合程度如何，比如是否支持欠压时完全禁止 CHG 和 DSG，不然就更复杂了。\n\n### 充电和电源路径管理\n\n我找了几款充电 IC，最后找到了 BQ25730 和 BQ25731。这两款支持 1 ~ 5S 的锂电池的自动升降压充电。现在以 BQ25730 进行设计，之后如果想替换成 BQ25731，硬件部分可以不需要改（除了 BAT FET 需要短接）。\n\n#### 检流电阻配置\n\nBQ25730 支持分别在适配器输入端和电池充电端使用 5mΩ 或 10mΩ 电阻来适应 15.2A 或 8.2A 的应用。\n\n这里我选择 $R_{AC} = 10mΩ$ 适应 3A 以内的充电或者 6.32A 的 PTM 模式，$R_{SR} = 5mΩ$ 适应 11.2A 的放电。需要配置\n ChargeOption1 Register (I2C address = 31/30h) 的 [3:2] 位为 10b。\n\n![ChargeOption1 RSNS_X](assets/ChargeOption1%20RSNS_X_2a53af7b-5ed2-4c32-8d3c-0d6351440651.png)\n\n#### CELL_BATPRESZ 配置\n\n由于 BQ25730 默认适合标准锂离子电池，他的配置针对 4.2V 每节电池使用的。想要适应包括磷酸铁锂在内的其他种类电池，需要使用 I2C 进行配置。\n\n CELL_BATPRESZ 配置我们选择 4S 的配置，避免意外情况下过充。\n\n![BQ25730 CELL_BATPRESZ](assets/BQ25730%20VDDA_993686bc-af34-43a6-b426-6cfa42d70480.png)\n\n![BQ25730 CELL_BATPRESZ 配置电阻](assets/BQ25730%20CELL_BATPRESZ%20配置电阻_5740321d-796c-467b-9726-1d34a6192a82.png)\n\n#### ILIM_HIZ 与输入限流配置\n\n我计划限制 3A 输入，瞅了眼电阻，选了 3.125A 限流。\n\n![ILIM_HIZ 输入限流配置电阻](assets/ILIM_HIZ%20输入限流配置电阻_4f9992e6-c76c-48f4-b3d5-e68f2e3ed4f9.png)\n\n#### IADPT 配置与电感选择\n\n为了减少发热，我选择的开关频率是 400kHz，所以设置 187kΩ 电阻。\n\n![BQ25730 IADPT 配置](assets/BQ25730%20IADPT%20配置_b8f60ccb-2918-46c7-9a57-676f1c85be35.png)\n\n对应的补偿阻容是：\n\n![BQ25730 Compensation Configuration](assets/BQ25730%20Compensation%20Configuration_a870515b-ad35-4bdd-bbaa-ac9aa80c6233.png)\n\n![BQ25730 电感相关配置原理图](assets/BQ25730%20电感相关配置原理图_d1aa3a1e-79e3-4915-a93f-9ad845a0ab0d.png)\n\n#### 功率 MOSFET 选择\n\n我找了三款 NCH MOSFET，下面是对比：\n\n| 特性         | NCEP4045GU (典型) | NCEP4090GU (典型) | NCEP40T13GU (典型) |\n| :----------- | :---------------- | :---------------- | :---------------- |\n| **R_DS(on)** | 6.0 mΩ            | 2.2 mΩ            | 1.8 mΩ            |\n| **Q_g**      | 17.6 nC           | 40 nC             | 49 nC             |\n| **Q_gd**     | 3.1 nC            | 7.2 nC            | 5 nC              |\n| **R_θJC**    | 4.5 °C/W          | 1.47 °C/W         | 1.56 °C/W         |\n| **FOM_top**  | 18.6 mΩ·nC        | 15.84 mΩ·nC       | 9 mΩ·nC           |\n| **FOM_bottom**| 105.6 mΩ·nC       | 88 mΩ·nC          | 88.2 mΩ·nC        |\n| **td(on)**   | 6 ns              | 7.5 ns            | 10 ns             |\n| **tr**       | 2.8 ns            | 4.0 ns            | 3 ns              |\n| **td(off)**  | 23 ns             | 37 ns             | 34 ns             |\n| **tf**       | 3 ns              | 7.5 ns            | 3 ns              |\n| **总关断时间 (td(off)+tf)** | **~26 ns** | **~44.5 ns** | **~37 ns** |\n| **参考价格** | 0.87 元           | 1.08 元           | 1.27 元           |\n| **死区≤40ns** | 裕量充足 | **不适合** (典型关断时间44.5ns已超过40ns，存在直通风险) | 有一定裕量 |\n\nBQ25730 的死区时间是 40 ~ 50ns（[来源 TI 论坛](https://arc.net/l/quote/knsquboy)）。这下就只能选 NCEP4045GU 或 NCEP40T13GU了。为了温度，我选 NCEP40T13GU。\n\n#### BATFET 选择\n\nBATFET 就是那个由 BATDAV 控制的、连接在电池和 VSYS 之间的 PCH FET。这里得考虑使用内阻小点的。我找了下选择了 **[NCE30P50G](https://www.lcsc.com/product-detail/MOSFETs_Wuxi-NCE-Power-Semiconductor_C326370.html)**: 无锡新洁能生产的-30V/-50A P沟道增强型功率MOSFET。\n\n1. **类型匹配**: NCE30P50G 是一款 **P沟道 MOSFET**，符合 BQ25730 对 BATFET 的驱动要求。\n2. **电压满足**: 其漏源电压 (Vds) 额定值为 **-30V**，满足 5S LiFePO4 电池应用所需的 ≥ 30V 安全裕量。\n3. **驱动兼容**: 输入电容 (Ciss) 典型值为 **3.59nF**，小于 BQ25730 驱动能力要求的 5nF，确保有效开关。\n4. **电流充裕**: 连续漏极电流 (Id) 额定值为 **-50A**，远大于系统最大电池放电电流需求（约 10A）。\n5. **低导通损耗**: 在 BQ25730 典型栅极驱动电压 (Vgs = -10V) 下，其导通电阻 (Rds(on)) 典型值仅为 **4.4mΩ**，最大 7mΩ，有助于降低电池放电路径的损耗和发热。\n6. **封装适宜**: 采用 **DFN 5x6 EP** 封装，具有良好的散热性能，适合功率应用。\n\n#### 电感选择\n\n优信里找了下，最大的 4.7μH 电感， DCR (Max) 都是标 ≤10mΩ 的，所以我折腾了下，找到了个 SRP1265A-4R7M。\n\n![SRP1265A-4R7M](assets/SRP1265A-4R7M_14a9ace1-93c1-4a14-8579-39e1db43211c.png)\n\n看起来参数不错：\n\n**关键参数：**\n\n- **电感值 (L):** 4.7µH (±20%)\n- **饱和电流 (Isat):** 28A\n- **RMS 电流 (Irms):** 13.5A\n- **直流电阻 (DCR Max):** 8.4mΩ\n\n**评估：**\n\n1. **饱和电流 (Isat):** 28A 远大于预估的最大峰值电感电流 (~13.5A)，提供了**非常充足的裕量**，能有效防止磁饱和，保证高负载和瞬态下的稳定性。**优秀**。\n2. **RMS 电流 (Irms):** 13.5A 大于预估的最大 RMS 电感电流 (~11.2A)，提供了约 20% 的温升裕量。这对于连续工作在额定功率附近是**可接受的**，但仍需关注实际散热设计。**良好**。\n3. **直流电阻 (DCR):** 最大 8.4mΩ，更低的 DCR 意味着更低的传导损耗 (约 1.05W @ 11.2A)，有助于**提高效率**并**减少发热**。**较好**。\n\n#### BQ25730 的电源路径管理\n\n##### 外置电源路径管理\n\n首先还是得提一下和 BQ25730 没啥关系的外置电源路径方案。这个方案也简单，在适配器电源的输入和电池的输出分别添加理想二极管或者是 OR-ing 电源路径选择器。这样就能实现双电源无缝切换了。\n\n```mermaid\ngraph LR\n    A[Adapter 12V~19V] --> D1[Ideal Diode];\n    B[Battery 5S LiFePO4] --> DCDC[DC-DC SC8701];\n    DCDC --> D2[Ideal Diode];\n    D1 --> L[UPS OUT];\n    D2 --> L;\n```\n\n##### NVDC\n\nBQ25730 支持 NVDC，Narrow Voltage DC (狭窄电压直流) 技术。\nNarrow VDC (NVDC) 是一种在电池管理系统中常用的电源路径管理架构。它的主要思想是，在系统同时连接外部适配器（Adapter）和电池时，通过精确控制电源路径，使系统总线（System Bus）的电压被稳定地钳制在一个相对狭窄的电压范围内。\n\n这个场景对于后级电源转换器或芯片能直接让电池作为电源的场景下能一站式解决电源路径管理功能，不过对于需要输出固定电压的 UPS 来说就不合适了。但是咱这项目主要目的还是为了让特定设备拥有不会突然掉电的电源，所以这个其实有可能是可以直接输出给我的小服务器的，我感觉它是能支持 12.5 ~ 18.0 V 供电，不过没找到证据，等后面有时间测一下。\n\n如果我的小服务器不能支持宽电压输入，那么只能在它后面增加 DC-DC 电路进行电压转换了。这样结果就是无论用哪路电源，都要经过两次 DC-DC 转换，并且两次转换的电压差不算小，势必会导致损耗惊人，然后被动散热肯定也是顶不住了。\n\n使用这个方案可以不需要外置电源路径管理，并且能实现电池补充输出和剩余电流充电，非常适合在原装适配器和用电器中间插入的一个 UPS 的情况。如果我的小服务器能支持宽电压输入，这就是一个可选方案了。\n\n```mermaid\ngraph LR\n    A[Adapter 12V~19V] --> VBUS[BQ25730 VBUS];\n    BQ25730 --> B[Battery 5S LiFePO4];\n    B --> BQ25730;\n    VBUS  --> BQ25730;\n    BQ25730 --> DCDC[DC-DC SC8701]\n    DCDC --> L[UPS OUT];\n```\n\n##### PTM\n\nPTM (Power Transfer Mode)，TI的专利技术，用于提高系统电源效率和电池快速充电。它能直接将适配器供电直通到负载。\n\n![PTM 介绍](assets/PTM%20介绍_feb3d573-7d4d-4ea5-9696-e0f4858a2126.png)\n\n![PTM 示意图](assets/PTM%20示意图_d12d1d2b-85fb-463c-b15d-022b0fc5e778.png)\n\n我的理解是，使用 PTM，我同样可以不需要外置电源路径管理，并且只需要一次 DC-DC 转换。虽然使用适配器时还是会有 DC-DC 电路的损耗，但是由于电压差比较小，转换效率应该很高。\n\n那么这个方案的问题就是充电效率比较差了。在这个方案下，电池充电是靠 BATFET 的线性工作来实现充电，对于 UPS 来说倒不是大问题，又不是天天停电，慢慢充也挺好的。\n\n```mermaid\ngraph LR\n    A[Adapter 12V~19V] --> VBUS[BQ25730 VBUS];\n    BQ25730[BQ25730 PTM Mode] --> B[Battery 5S LiFePO4];\n    B --> BQ25730;\n    VBUS  --> BQ25730;\n    BQ25730 --> DCDC[DC-DC SC8701]\n    DCDC --> L[UPS OUT];\n```\n\n我觉得 PTM 适合和 NVDC 一起使用。充电时使用 NVDC，提升充电效率；非充电或重载时，使用 PTM 降低损耗。这样一来，如果 UPS 在 12V 模式下使用，也能实现升压充电，毕竟单纯 PTM 可没法升压充电。\n\n##### OTG（FRS）\n\n本来以为电源路径管理的方案已经差不多了了，后面确认 BQ25730 一些功能细节时，让我注意芯片支持的 USB-C PD 规范包括快速角色交换 (FRS)。之前以为这个切换会比较缓慢，即使他是**快速**角色切换，当我再次确认时发现，诶嘿，这个功能是可以避免瞬时断电，这可不就是 UPS 要做的吗？\n\n如果能使用 OTG + FRS，那么我就能利用 BQ25730 的 DC-DC 电路直接在使用电池供电时对电池进行电压转换，那可是省板子、省器件、省空间，不得赢麻了？\n\n然后，我在 TI 论坛上找到这么个帖子： [BQ25730: How to build an UPS with BQ25730 and constant output voltage, independent of cell count. - Power management forum - Power management - TI E2E support forums](https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1492148/bq25730-how-to-build-an-ups-with-bq25730-and-constant-output-voltage-independent-of-cell-count)\n\n我觉得可以试试，预留下回到额外 DC-DC 电路的退路就好了。\n\n```mermaid\ngraph LR\n    A[Adapter 12V~19V] --> D1[Ideal Diode];\n    D1[Ideal Diode] --> VBUS[BQ25730 VBUS];\n    BQ25730[BQ25730 Charge / OTG] --> B[Battery 5S LiFePO4];\n    B --> BQ25730;\n    VBUS  --> BQ25730;\n    VBUS --> L[UPS OUT];\n```\n\n#### 预充电\n\nBQ25730 支持预充电功能。\n\n### 理想二极管\n\n为了降低损耗，我还是决定尽量选择 OTG 或外部 OR-ing 的方案。\n\n[理想二极管基础知识（TI）](https://www.ti.com.cn/cn/lit/an/zhcab91b/zhcab91b.pdf)\n[MOSFET Selection Guide for Ideal Diode Controllers (Diodes)](https://www.diodes.com/assets/App-Note-Files/AN1193_App-Note_Ideal-Diode-controller-FET-selection.pdf)\n\n### 理想二极管控制器选型总结\n\n| 型号 (厂商)        | 响应速度 (典型值) | 静态电流 (IQ, 典型值) | 推荐 $R_{DS(ON)}$  | 主要优势                     | 缺点/考虑因素              | 最终评估/选择       |\n| :----------------- | :---------------- | :-------------------- | :--------------------------- | :------------------------- | :------------------  | :------------------ |\n| [LM74700-Q1 (TI)](https://www.ti.com.cn/product/cn/LM74700-Q1/part-details/LM74700QDDFRQ1?keyMatch=LM74700QDDFRQ1&tisearch=universal_search)    | 0.45µs            | 0.80µA                 | **20 ~ 50 mV / ILoad(Nominal)** |  性能均衡, 电荷泵             | IQ 相对较高                | 备选                |\n| [LM74610-Q1 (TI)](https://www.ti.com.cn/product/cn/LM74610-Q1)    | 2.2μs     | **0**       | ?        | **IQ 极低**, 电荷泵          | **响应慢** | 不支持线性调节 |\n| [**MX5050T (Maxin)**](http://www.maxinmicro.com/web/uploads/file/20230922/s4N1304Xbx564sB19U6G0rluQL3TP3U5.pdf) | 18ns($C_{GATE}=0$) <br />  **125ns**($C_{GATE}=10nF$) <br />  260ns($C_{GATE}=47nF$)     | ?              | 30 ~ 100  mV / ILoad(Nominal) | **响应快, 国产, 性价比** | **品牌/支持相对较弱**       | **可用**            |\n| [**MX5050L (Maxin)**](http://www.maxinmicro.com/web/uploads/file/20240318/7MbrJ71JY13eJC4y40Du807aXd03a1j7.pdf) | 18ns($C_{GATE}=0$) <br />  **125ns**($C_{GATE}=10nF$) <br />  260ns($C_{GATE}=47nF$)     | ?              | **20 ~ 100  mV / ILoad(Nominal)** | **比 MX5050T 略贵，** | **品牌/支持相对较弱**       | **选定**            |\n\nLM74700-Q1 挺好，就是贵，淘宝 17 元，MX5050T 和 MX5050L 能在 2 元和 4 元以内搞到。所以初步决定在 MX5050T 和 MX5050L 内选择了。\n\n根据下一小节的内容，可以知道由于 UPS 电流比较大，所以应该选 $V_{SD(REG)}$ 小的，MX5050T 是 30 mV，MX5050L 是 20 mV，在 6A 的情况下，MX5050T 的功率损耗是 180mW, 而 MX5050L 的功率损耗是 120 mW。看起来差距还是值得选择 MX5050L。\n\n#### 支持线性调节的理想二极管控制器栅极驱动\n\n![支持线性调节的理想二极管栅极驱动器模式转换](assets/支持线性调节的理想二极管栅极驱动器模式转换_a0a87093-ddfe-403e-8b85-615342dee1f7.png)\n\n可以看到，支持线性驱动的控制器，能让理想二极管两端的电压差控制在一定的范围内，以实现更优雅地轻载关断。这会影响我们选择 MOSFET 的  R_{DS(ON)}。\n\n#### 理想二极管外部 MOSFET 选择\n\n根据数据手册推荐，我们需要计算一下在正常负载时 MOSFET 两端之间的电压差:\n\n$$\n    V_{DS} = R_{DS(ON)} \\times I_{LOAD}\n$$\n\n适配器输入侧最大电流是 6.23 A，电池输出侧最大电流是 11.2 A。 分别计算 20 mV、30 mV 和 100 mV 的电压差，得到:\n\n| 电流 | 20 mV | 30 mV | 100 mV |\n| :---------------- | :----------------------------- | :----------------------------- | :------------------------------ |\n| **1 A**           | $20\\ m\\Omega$                 | $30\\ m\\Omega$                 | $100\\ m\\Omega$                |\n| **2 A**           | $10\\ m\\Omega$                 | $15\\ m\\Omega$                 | $50\\ m\\Omega$                 |\n| **3 A**           | $6.67\\ m\\Omega$               | $10\\ m\\Omega$                 | $33.33\\ m\\Omega$              |\n| **4 A**           | $5\\ m\\Omega$                  | $7.5\\ m\\Omega$                | $25\\ m\\Omega$                 |\n| **5 A**           | $4\\ m\\Omega$                  | $6\\ m\\Omega$                  | $20\\ m\\Omega$                 |\n| **6 A**           | $3.33\\ m\\Omega$               | $5\\ m\\Omega$                  | $16.67\\ m\\Omega$              |\n| **6.23A** | $3.21\\ m\\Omega$     | $4.82\\ m\\Omega$     | $16.05\\ m\\Omega$    |\n| **8 A**   | $2.5\\ m\\Omega$      | $3.75\\ m\\Omega$      | $12.5\\ m\\Omega$      |\n| **8.75 A** | $2.38\\ m\\Omega$     | $3.69\\ m\\Omega$     | $12.04\\ m\\Omega$     |\n| **11.2A**   | $1.79\\ m\\Omega$     | $2.68\\ m\\Omega$     | $8.93\\ m\\Omega$     |\n\n在确定选什么 MOSFET 之前，看看上表。我们需要知道负载平常的电流是多少，不过我还没测，所以不知道。\n现在就大概取额定的一半作为平时的负载，那么适配器输入侧就是 3A ->6.67 mΩ  ~ 33.33 mΩ，电池输出侧就是 5A -> 4 mΩ  ~ 20 mΩ。\n这么看适配器输入侧选择 NCEP4045GU（6.0 mΩ） 就足够了，电池输出侧选择 NCEP40T13GU（1.8 mΩ）。\n不过为了保持 BOM 简洁点，最后可能会统一用 NCEP40T13GU 了，等最后全部设计完再看看。\n\n### 适配器输入保护\n\n#### 输入保护选电子保险丝而不是一次性保险丝\n\n本来我准备直接上一个一次性贴片保险丝的，不过看了下，想要快熔断的只有方形表面贴装保险丝。\n\n![方形表面贴装保险丝](assets/方形表面贴装保险丝_04658a75-57f6-4f2b-9d7c-082293226dd8.png)\n\n根据封装不同，常温阻值在 7 ~ 12 mΩ。由于输入电流额定 6.32A，感觉损耗有点高，毕竟直通输出模式下也串了不少 10mΩ 级别的器件，所以还是想省省，就看了看电子保险丝。下面是我找到的电子保险丝——TPS2490，对比普通一次性保险丝在 8 A 电流时情况：\n\n方案 1: JFC0603-1800FS 一次性保险\n方案 2: TPS2490 + 7mΩ 检流电阻 + NCEP40T13GU 电子保险丝\n\n| 特性           | JFC0603-1800FS丝                                  | TPS2490 |\n| :------------- | :------------------------------------------------------------------- | :----------------------------------------------------------------- |\n| **保护原理**   | 热效应熔断                                                           | 电流检测与主动关断 MOSFET                                          |\n| **正常工作损耗** | 约 0.45W (8A 冷态)，实际损耗随温度升高显著增加                       | 典型约 0.56W，最大约 0.60W (8A 时，较稳定)                         |\n| **响应速度**   | 毫秒 ~ 数百微秒 (取决于过流大小，短路约 300µs，2倍过载约 11.7ms)       | 微秒级 (主要取决于 TPS2490 快速故障响应，通常 1-5µs)                 |\n| **可恢复性**   | 不可恢复，需手动更换                                                 | 可恢复 (可配置自动重试或外部控制)                                  |\n| **精度/可调性**| 固定熔断特性，精度一般                                               | 较高，电流限制阈值可配置                                           |\n| **电路复杂度** | 简单 (单个元件)                                                      | 相对复杂 (多个元件：控制器 IC, MOSFET, 检流电阻等)                 |\n| **成本**       | 低                                                                   | 较高                                                               |\n| **与 MCU 集成**| 困难 (需额外电路检测状态)                                            | 容易 (提供故障状态输出，可控)                                      |\n| **对故障能量限制**| 相对较弱 (响应慢，允许较大 I²t 通过)                                 | 强 (响应快，有效限制故障 I²t)                                      |\n\n由于我后续会使用 MCU 控制延迟闭合适配器输入来应对市电恢复初期不稳定的情况，使用 TPS2490 这种电子保险丝能省得我再单独搞个 FET 驱动。\n\n#### TPS2490 检流电阻\n\n我计划在适配器输入处增加一个检流电阻，给 TPS2490 和 INA226 共用。因为 INA226 允许自由选择检流电阻，所以检流电阻阻值就由 TPS2490 的要求确定。\n\n$$ R_{SNS,CLC} = \\frac{V_{CL}}{I_{LIM}} $$\n\n其中：\n\n- $R_{SNS,CLC}$ 是感应电阻的阻值。\n- $V_{CL}$ 是感应电阻上的电压差（典型值为 45 mV）。\n- $I_{LIM}$ 是电流限制值。\n\n**7A 电流限制对应的阻值：**\n    使用公式：\n    $$ R_{SNS,CLC} = \\frac{V_{CL}}{I_{LIM}} $$\n    代入数值：$V_{CL} = 45 \\text{ mV} = 0.045 \\text{ V}$，$I_{LIM} = 7 \\text{ A}$。\n    $$ R_{SNS,CLC} = \\frac{0.045 \\text{ V}}{7 \\text{ A}} \\approx 0.006428 \\text{ Ω} = 6.43 \\text{ mΩ} $$\n    所以，如果需要将电流限制设置为 7A，感应电阻的阻值大约需要是 **6.43 mΩ**。\n\n由于电阻阻值是离散的，检流电阻还需要和 INA226 共用，所以不方便用电阻分压器处理。我们不要求精准的过流阈值，所以可以适当调整电阻阻值。现在我们使用标准阻值带入公式计算：\n\n| 感应电阻阻值 ($R_{SNS,CLC}$) | 电流限制值 ($I_{LIM}$) |\n| :------------------------- | :--------------------- |\n| 5 mΩ                       | 9 A                    |\n| 6 mΩ                       | 7.5 A                  |\n| 7 mΩ                       | 6.43 A                 |\n\n看起来这三个阻值都很 OK，我计划使用 7mΩ 的检流电阻。由于我不知道也无从查证服务器主机的额定功率，所以我只能尽量避免直通模式下影响电流的能力上限。虽然一般来说主机不太可能需要接近电源额定输出的电流，不过我还是希望不要影响原来的情况，正常来说我应该换一个更大规格的电源适配器来连接 UPS，而不是使用服务器自带的电源，但是我不想花钱买新电源并且又多一个吃灰的旧电源，一切都是为了环保（bushi\n\n#### TPS2490 设计工具\n\n[在设计中使用 MOSFET 安全工作区曲线（TI）](https://www.ti.com.cn/cn/lit/an/zhcacd9/zhcacd9.pdf?ts=1706510066041)\n\n![NCEP40T13GU 安全工作区 (Safe Operation Area, SOA)](assets/NCEP40T13GU%20安全工作区%20(Safe%20Operation%20Area,%20SOA)_d50a6b0a-4568-4f8d-aad8-bdb70363c2c0.png)\n\n我计划使用单个 NCEP40T13GU 作为 TPS2490 的 FET。\n\n[设计工具](./assets/ups120_TPS249x_8x_Design_Calculator_REV_B.xlsx)\n\n设计完成后，结果是这样的：\n\n![TPS2490 for UPS 120](assets/TPS2490%20for%20UPS%20120_0ae6a41b-e964-4632-b1fe-601224281f45.png)\n\n这样设计完看起来应该是能用的。\n\n#### TPS2490 小结\n\n我研究了半天，终于搞清楚 TPS2490 到底实现了啥功能。\n\n首先是**带有最大功率限制的限流功能**，这个功能能实现软启动效果。\n\n1. 限流\n    热插拔或者电源刚上电时，TPS2490 后级电路可能带有电容之类的器件，会汲取大量电流，这时，带限流功能就会生效，控制 FET 在线性工作区间来控制输入电流。限流时间是由 Timer 引脚的电容设定的。\n\n    显然，有一个问题不能忽略，就是 FET 并不能一直在线性区间工作时流过大电流。这时候就需要根据 SOA（Safe Operation Area）曲线来确定时间、$I_D$、$V_ds$ 三者的关系来保证 FET 不会完蛋。\n\n2.功率限制\n    这里的功率限制是限制 FET 的功率，而不是系统的输入功率。这个功率限制能让低规格的 FET 在 SOA 内工作。代价就是软启动时间变长了。\n\n然后就是**过流跳闸**。限流动作超过一定时间后，就会彻底关断 FET。TSP2490 需要重新上电或者重新将 EN 引脚由低电平转为高电平复位，TPS2491 会通过 10 倍的 Timer 时间自动重新循环复位。",
            "url": "https://ivanli-cn.github.io/blog-26/posts/ups-design-hardware",
            "title": "UPS 开发笔记：硬件选型与设计",
            "summary": "All-in-One Home Lab Server 一般都会有一个搭档叫 UPS。今天正式开始研究如何做一个适合自己的 UPS。\n本文就记录下选型、设计、初步实现的过程，给自己备个案，后面调整和迭代会方便点。",
            "date_modified": "2025-04-17T00:00:00.000Z",
            "date_published": "2025-04-17T00:00:00.000Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": [
                "Hardware/Circuit",
                "Project/UPS",
                "Hardware/UPS"
            ]
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/bytevirt-lxc-xiao3-ji1-zhong4-zhuang1-zui4-xin1-archliux-xiao3-ji4",
            "content_html": "## 准备工作\n\n1. 在 ByteVirt 的控制面板先重装成最新的 Debian\n\n![控制面板中选择 Debian 系统重装](assets/控制面板中选择%20Debian%20系统重装_534812f9-5961-462c-9106-abc47b37d135.png)\n\n2. 重装完成后登录进去，安装下面的这些软件包\n\n```shell\napt update && apt upgrade\napt install -y git gpg zstd\n```",
            "url": "https://ivanli-cn.github.io/blog-26/posts/bytevirt-lxc-xiao3-ji1-zhong4-zhuang1-zui4-xin1-archliux-xiao3-ji4",
            "title": "ByteVirt LXC 小鸡重装最新 ArchLiux 小记",
            "summary": "最近良心云的 SG 轻量马上到期了，所以入了 ByteVirt LXC，就图性价比了。还挺意外的，居然自带了 Archlinux 系统的选项。可惜用起来怪怪的，我初始化了那么多次，就这次感觉非常不顺手，所以决定找个脚本重新用 ArchLinux 官方的版本重装一下。",
            "date_modified": "2025-04-12T00:00:00.000Z",
            "date_published": "2025-04-12T00:00:00.000Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": [
                "Ops/Linux",
                "IDC/ByteVirt"
            ]
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/usb-hub-for-electronic-lovers-rev-2",
            "content_html": "上次设计的[第一版](../usb-hub-for-electronic-lovers)基本上可以说没通过验证……思路是对的，但是时间比较赶，出现了一些大的纰漏。\n这次重新设计了一版，大部分还是延续了之前的经验，做出了一些简化和改进。\n\n## Rev.2 设计目标\n\n- 去掉 DC-DC 隔离电源\n  外部供电一般使用 AC-DC 转换器，目前常见的都是隔离型的，我就不再在 USB-C HUB 里面再弄一个 DC-DC 隔离了。\n- HUB 改成 3 个外部 USB-C 下行端口\n  由于前面去掉了两个 DC-DC 隔离电源模块，体积就可以做小了。\n  还是考虑到内置的大功率 PD 供电，还是得考虑使用铝合金外壳。我挑选了下公模外壳，决定选 63*25*75mm 的尺寸。这样导致前面板只适合放三个 USB-C 接口了。进而决定：\n  - 使用 4 个下行端口的 HUB 芯片就行 -> CH335F\n  - 内部主控芯片占用一个下行端口，用于与 host 通信\n\n## 修复 USB PD DC-DC 电路\n\n上一版直接漏掉了两个 boost 二极管，导致 DC-DC 部分没有正确启动。\n不过也不是大问题，毕竟第一次用 Boost-Buck 芯片，本想着少打一次样的，结果没省下。后续单独对整个 USB1 端口的 USB PD 部分单独打样验证，已经没问题了。\n\n## 实现 SW2303 高侧检流\n\nSW2303 只支持低侧检流。低侧检流在多电源系统中可能导致“共地问题”：\n当多个电源（A和B）共用同一地平面且均采用低侧检流时：\n\n1. 电源A输出的电流可能通过负载后，经共享地线流经电源B的检流电阻返回\n2. 导致：\n    - 电源A的测量电流值 = 真实输出电流 - 跨接电流ΔI\n    - 电源B的测量电流值 = 真实输出电流 + 跨接电流ΔI\n    - 系统总电流仍满足ΣI测量 = ΣI实际，但各端口独立测量值失真\n\nSW2303 的参考设计是使用低侧检流。说实话，我没找到电源使用低侧检流的可行性。除非，这只是一个聊胜于无的方案？毕竟 DC-DC 芯片是采用高侧检流方案的，或许是前级兜底的信心吧。不知道以后有没有机会让我了解到他真正的价值。\n\n至少来说，对于 HUB 类应用，一旦下游设备同时连接了两个 HUB 端口，低侧检流肯定是不准的，而我平常测试设备，调试器和设备供电很可能会选择连同时连 HUB，所以至少出于这点，我也希望实现高侧检流。更别提更复杂的连接组合了。\n\n为了实现高侧检流，我使用 G=1V/V 的高侧电流检测芯片进行转换，转换后输出的电压范围就是能被 SW2303 接受的、等价于低端检流的信号。\n\n![SW2303+INA138 实现高侧检流的原理图](assets/SW2303+INA138%20实现高侧检流的原理图_9fee4a4e-8bd7-4eab-811d-45a1f83d8f86.png)\n\n## 用 CH335F 作为 HUB 芯片\n\n之前使用的 CH338X 不确定是不是我焊接反了烧坏了还是焊接不良，一片好贵的说！目前确定了外壳尺寸，所以不需要那么多下行接口了，就直接换成 CH335F 了。CH338X 的各种功能配置快把我绕晕了。\n\n### CH335F 介绍\n\nCH335F 便宜的说！不超过 CH338X 三分之一的价格还容易购买。\n支持独立过流检测和独立电源控制，支持每个端口独立指示灯，够用了够用了。\nCH335F 还支持免晶振应用，对于我这种业余玩家跑起来能快不少，验证通过后再增加晶振来避免偏离 HUB 规范。\nCH335F 使用 QFN28_4x4 封装，至少比 CH338X 的 QFN48_7x7 好焊点。希望这次不会出问题了。\n\n\n## TPS25810 USB-C DFP 控制器\n\n见鬼了，上一个版本完全忘记加这个芯片了（或者说加错芯片了），大失策。\nTPS25810 的作用是，通过 USB-C DFP 的控制，可以实现 USB-C DFP 控制器和输出控制开关。\n\n芯片支持双输出协同限流：\n\n![TPS25810 端口电源管理（PPM）和 Power Wake 实现](assets/TPS25810%20端口电源管理（PPM）和%20Power%20Wake%20实现_0baa24c8-41db-48a0-b048-5c6c9d7b45da.png)\n\n我在电路上预留了这部分设计，我准备前期先用硬件实现（用 0Ω 电阻连接）来关控两个 5V 输出的 USB 端口 2 和 3，后期在我的固件中用软件管理三个端口的输出功率，再去掉这个 0Ω 电阻。\n\n## 下行端口 2 和 3 的供电\n\n\n### 独立供电\n\n这两个端口分别使用 DC-DC 转换电路独立输出 5V 电压。参考设计如下：\n\n![TPS62933DRLR 8V-21V to 5.00V @ 3A 参考设计原理图](assets/TPS62933DRLR%208V-21V%20to%205.00V%20@%203A%20参考设计原理图_b3106f07-8105-4402-8f93-f1c6baa3d35b.png)\n\n[TPS62933DRLR 8V-21V to 5.1V @ 3A](hhttps://webench.ti.com/appinfo/webench/scripts/SDP.cgi?ID=89D0467F281D3C18)\n\n![下行端口独立供电原理图](assets/下行端口独立供电原理图_73191fba-2737-4645-a11c-b4c12b840ef7.png)\n\n后面想了下，由于 TPS62933 支持最大持续电流是 3A，完全没冗余好像也不太合适，虽然我自己用不太可能用不支持 PD 的端口跑 3A，但是设计上还是不应该这么搞，所以就没选这个方案。另一个原因就是独立供电电路还是要时刻保持工作，因为 USB-C DFP 控制器需要一直提供 5V 的 $V_{CONN}$ 供电才行。这样看来独立供电作用不太大，毕竟不能插入 USB device 后再启动。\n\n### 共用供电\n\n我选择了 [TPS53319](https://www.ti.com/cn/lit/ds/symlink/tps53319.pdf?ts=1744820608694) 作为 5V 的 DC-DC 电源转换芯片。TPS53319 和 TPS62933 一样，是一款全集成高频同步整流降压开关变换器。\n\n> **[TPS53319](https://www.ti.com/product/TPS53319)**: 德州仪器的高效8A或14A同步降压转换器，集成MOSFET，适用于低外部元件和紧凑型电源系统。\n\n![TPS53319 5.1V 6A 输出在线参考设计](assets/TPS53319%205.1V%206A%20输出在线参考设计_a2e31154-0d6c-4322-88a0-4f49d56e45fe.png)\n\n看参考设计没什么问题。",
            "url": "https://ivanli-cn.github.io/blog-26/posts/usb-hub-for-electronic-lovers-rev-2",
            "title": "造一个支持隔离、PD 供电的全速 USB-C HUB Rev.2",
            "summary": "第二版的隔离 USB-C HUB 开发笔记。对上一版进行了修正和改进，依旧使用 ISOUSB211 作为隔离芯片，改用了 CH335F 作为 HUB。",
            "date_modified": "2025-04-05T00:00:00.000Z",
            "date_published": "2025-04-05T00:00:00.000Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": [
                "Hardware/Circuit",
                "Project/USB-Hub",
                "Hardware/Chip"
            ]
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/quickly-create-a-new-arch-linux-lxc-on-pve",
            "content_html": "## 1. 创建 CT 模板\n\n![创建 CT 模板的入口](assets/创建%20CT%20模板的入口_86d6246f-8934-461a-bbf9-6eb0166e29c7.png)\n\n![下载 PVE 提供的 Arch Linux 模板](assets/下载%20PVE%20提供的%20Arch%20Linux%20模板_246116f5-177e-4c6b-a6a7-42914e1279d6.png)\n\n## 2. 创建 CT 并启动客户机\n\n这步没啥好说的。\n\n## 3. 更新 pacman 的 PGP 公钥\n\n由于 PVE 提供的 Arch Linux 模板稍微有些过时，大概率会因为部分密钥过时或缺失等问题导致无法正常使用软件包管理器，所以需要先更新一下。\n\n```shell\npacman-key --init\npacman-key --populate archlinux\npacman -S archlinux-keyring --force\n```\n\n如果遇到下面这样找不到软件包的问题，大概是系统目前太旧太旧了。需要先执行 `pacman -Syu` 然后再执行 `pacman -S archlinux-keyring --force`\n\n不用在意 `pacman-Syu` 是否完全执行成功，运行完就行。（应该有更好的命令能解决，我懒得找了）\n\n```shell\n archlinux-keyring-20230504-1-any.pkg.tar.zst failed to download\nerror: failed retrieving file 'archlinux-keyring-20230504-1-any.pkg.tar.zst' from geo.mirror.pkgbuild.com : The requested URL returned error: 404\nwarning: failed to retrieve some files\nerror: failed to commit transaction (failed to retrieve some files)\n```\n\n## 4. 更新软件包\n\n```shell\npacman -Syu\n```\n\n## 5. 安装基础软件包\n\n```shell\npacman -S base-devel git\n```\n\n## 6. 创建普通用户\n\n```shell\nuseradd -m -G wheel -s /bin/bash ivan\n# set password for ivan\npasswd ivan\n```\n\n### 允许用户使用 sudo\n\n编辑 `/etc/sudoers` 文件：\n\n```shell\nvisudo\n# or specify the editor \nVISUAL=nano visudo\n```\n\n找到以下行并取消注释（如果未取消）：\n\n```txt\n%wheel ALL=(ALL) ALL\n```\n\n保存退出即可。\n\n## 7. 安装 Paru\n\nParu 是 AUR 辅助工具，可以替代 Yay。这个看个人偏好了，我是 Rust 信徒，所以选择了 Paru，绝对不是因为 `yay -Syu` -> `paru` 这样更新软件能省事才作出决定的。\n\n这里直接安装预构建的二进制程序。从源码构建实一是小鸡资源不够，二是要等很久，不是很方便，所以直接下载预构建的二进制包。\n\n```shell\ncd ~ && git clone https://aur.archlinux.org/paru-bin.git\ncd ~/paru-bin/ && makepkg -rsi --noconfirm\ncd ~ && rm -Rf ~/paru-bin/\n```\n\n## 8. SSH\n\n安装并启用 `sshd`\n\n```shell\nsudo pacman -S openssh\nsudo systemctl start sshd\nsudo systemctl enable sshd\n```\n\n### 禁止密码登录\n\n编辑 `/etc/ssh/sshd_config` 文件:\n\n```txt\nPasswordAuthentication no         # 禁用密码认证\n```\n\n重启SSH服务：\n\n```shell\nsudo systemctl restart sshd\n```",
            "url": "https://ivanli-cn.github.io/blog-26/posts/quickly-create-a-new-arch-linux-lxc-on-pve",
            "title": "快速在 PVE 全新部署 Arch Linux LXC",
            "summary": "这是一个快速步骤备忘录，用于快速手动在 创建 Arch Linux 的 LXC。",
            "date_modified": "2025-04-04T00:00:00.000Z",
            "date_published": "2025-04-04T00:00:00.000Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": [
                "HomeLab/PVE",
                "Ops/Linux"
            ]
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/run-act-runner-on-native-arch-linux",
            "content_html": "## 安装\n\n我在 ArchLinux 下部署 Act Runner。运行 `act_runner` 还需要 docker，所以也一并安装了。\n\n```shell\nsudo paru -S docker act-runner-bin\n```\n\n## 配置 Docker\n\n添加当前用户到 `docker` 组\n\n```shell\nsudo usermod -aG docker $USER\n# log in to a new group\nnewgrp docker\n```\n\n启动 docker：\n\n```shell\nsudo systemctl start docker --now\nsudo systemctl status docker\n```\n\n## 配置 Act Runner\n\n配置实例级的 runner，访问 `https://your.gitea.instance/admin/actions/runners`，点击右上角的 “创建 Runner“：\n\n![创建 Runner](assets/创建%20Runner_c80569eb-b3ac-42e2-be87-b2df4474f569.png)\n\n复制 token。\n\n然后使用下面的命令注册 runner:\n\n```shell\ncd /etc/act_runner\nsudo -u act_runner act_runner register --config /etc/act_runner/act_runner.yaml\n```\n\n填写完后启用服务：\n\n```shell\nsudo systemctl enable act_runner --now\nsudo systemctl status act_runner\n```\n\n大功告成。\n\n![Act Runner 上线](assets/Act%20Runner%20上线_37ed88b7-0293-4cb8-8375-e629ad6d7fa1.png)",
            "url": "https://ivanli-cn.github.io/blog-26/posts/run-act-runner-on-native-arch-linux",
            "title": "在本地运行 Act Runner",
            "summary": "这是一个快速步骤备忘录，用于快速手动在 ArchLinux 上运行 Act Runner 并连接到 Gitea 实例。",
            "date_modified": "2025-04-04T00:00:00.000Z",
            "date_published": "2025-04-04T00:00:00.000Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": [
                "HomeLab",
                "Software/Gitea",
                "Ops/Linux"
            ]
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/new-install-and-recover-pve",
            "content_html": "## Proxmox VE\n\n我使用 [Ventoy](https://www.ventoy.net/cn/index.html) 来启动 PVE 的安装镜像。\n\n从 [Proxmox VE Downloads](https://pve.proxmox.com/wiki/Downloads) 找到你想要的系统镜像，下载下来后并托到 Ventoy 的\n普通文件分区就行了。\n\n然后在目标主机上插入 U 盘启动 Ventoy，选择 \"proxmox-ve_xxx.iso\"，然后**选择 Normal Mode**启动。一定一定不要选 Grab2，会卡在 \"Loading initial ramdisk\" 这个阶段。\n\n![Ventory 启动 PVE 安装器镜像时要选普通模式](assets/Ventory%20启动%20PVE%20安装器镜像时要选普通模式_77fc51ed-f572-423e-a8ff-9a0061eaeb1d.png)\n\n进入 Proxmox VE 安装界面后，**要选 GUI** 的安装方式，选 CLI 的话，管理网口默认的是 DOWN 的，结果就是无法通过网络访问到 PVE。\n\n小声BB：比较可惜这款工具目前只支持在 Windows 和 Linux 下制作 Ventoy 镜像，我之前就在使用 Ventoy 来做各个系统的启动盘，所以这次继续用它。比较吊诡的是，大概放了一年后，U 盘里的启动引导好像出问题了，放的各个系统的镜像好像还正常。看来 U 盘确实不太适合长期存放文件。最后重新在 Windows 下重做了启动盘后才能用。\n\n## OpenWRT\n\n*我尽力了，还是没办法在 LXC 下搞定 OpenWRT + Nikki，LXC 下部署 OpenWRT 问题本来就多，好不容易搞定了结果一开 Nikki 又寄了。不知道是 Nikki 更新出了新冲突还是 OpenWRT 又出新反骨，我是放弃了。~~直接起了 VM 保平安。~~ 现在事情复杂起来了，似乎是构建的各组件依赖有冲突，用 VM 部署还是不正常。我最后换回以前用的 LXC 镜像了，下面是部署方法。* \n\n由于我们需要有良好的网络才能继续后面的操作，所以第一个虚拟机得是软路由。\n\n我没有做网口直通之类的操作，而是使用了两个网桥： `vmbr0` 作为 LAN 口，`vmbr1` 作为 WAN 口。网桥需要事先创建好。因为我的硬件只有两个网口，所以使用 PVE 默认创建的 `vmbr0` 作为 LAN 口的网桥。如果你需要配置多个 LAN 口，可以考虑都加进来或者单独再创一个网桥使用。\n\n![网桥设置](assets/网桥设置.png)\n\n### 在 LXC 中创建 OpenWRT\n\n然后下载构建好的镜像，[这个是我之前构建的](https://github.com/IvanLi-CN/openwrt-lite/actions/runs/13213925172)，解压后找到 `openwrt-23.05.5-x86-64-generic-rootfs.tar.gz` 文件，通过 `scp` 这类工具复制到 PVE 宿主机中。然后执行下面的命令创建 LXC。\n\n```shell\npct create 301 ~/openwrt-23.05.5-x86-64-generic-rootfs.tar.gz \\\n --arch amd64 \\\n --hostname OpenWRT \\\n --rootfs local-lvm:2 \\\n --memory 2048 \\\n --cores 6 \\\n --ostype unmanaged \\\n --unprivileged 1 \\\n --features fuse=1,nesting=1 \\\n --onboot 1 \\\n --startup order=0 \\\n --start 1 \\\n --dev0 /dev/ppp \\\n --dev1 /dev/net/tun \\\n --net0 bridge=vmbr0,name=eth0,gw=192.168.31.1,ip=192.168.31.1/24 \\\n --net1 bridge=vmbr1,name=eth1\n ```\n\n最后在 OpenWRT 客户机中的 `/etc/init.d/dnsmasq` 文件内找到  `procd_add_jail_mount /etc/passwd /etc/group /etc/TZ /etc/hosts /etc/ethers` 这样的行，追加 `/dev/urandom`，最终效果如下：\n\n```txt\nprocd_add_jail_mount /etc/passwd /etc/group /etc/TZ /etc/hosts /etc/ethers /dev/urandom\n```\n\n然后重启容器。\n\n如果有备份之前的 OpenWRT 配置，可以尝试恢复。\n\n### 在 VM 中创建 OpenWRT\n\n拿出事先准备好的 OpenWRT 的 img 镜像文件。通过 PVE 的 Web GUI 上传或者用 scp 等工具传到 PVE 上。如果是 GUI 上传的，文件路径在这：\n\n![通过 GUI 上传镜像后的文件路径显示在日志中](assets/通过%20GUI%20上传镜像后的文件路径显示在日志中_c30e8a5c-6dd2-48af-82c9-597d93842295.png)\n\n执行下面的命令导入镜像到虚拟机的设备列表，这个命令会创建一个带有 OpenWRT 系统的磁盘：\n\n```shell\nqm disk import 201 /var/lib/vz/template/iso/openwrt-23.05.5-x86-64-generic-ext4-combined-efi.img local-lvm\n```\n\n## Proxmox Backup Server\n\n参考这篇文章： [Run Proxmox Backup Server (PBS) on a Proxmox VE host](https://gist.github.com/kdmukai/6d312056e0d4156045356310d07bbd8a)\n\nInstall the PBS apt repo signing key:\n\n```shell\nwget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg\n```\n\nAdd the PBS repo to apt:\n\n1. Open a new file in a text editor:\n\n    ```shell\n    nano /etc/apt/sources.list.d/pbs-install-repo.list\n    ```\n\n2. In the text editor paste in:\n\n    ```shell\n    # Proxmox Backup Server pbs-no-subscription repository provided by proxmox.com,\n    # NOT recommended for production use\n    deb http://download.proxmox.com/debian/pbs bookworm pbs-no-subscription\n    ```\n\n    CTRL-X, y to save.\n\n3. Update apt and install:\n\n    ```shell\n    apt update\n    apt install proxmox-backup-server -y\n    ```\n\n### 挂载旧硬盘\n\n由于使用的是有备份数据的旧盘而不是新盘，所以这点有别于新环境的步骤。\n\n1. 挂载旧硬盘：\n\n    查看旧硬盘的 UUID：\n\n    ```shell\n    ls -l /dev/disk/by-uuid\n    ```\n\n    我的硬盘是 st2000，所以下面示例就用这个 st2000 举例。\n\n    ```shell\n    mkdir /mnt/st2000\n    mount /dev/disk/by-uuid/<uuid> /mnt/st2000\n    ```\n\n    挂载完成后没问题的话，就可以在 `/etc/fstab` 中添加挂载信息，以实现开机自动挂载：\n\n    ```shell\n    UUID=<uuid> /mnt/st2000 xfs defaults 0 2\n    ```\n\n2. 编辑 `/etc/proxmox-backup/datastore.cfg`:\n\n    ```shell\n    nano /etc/proxmox-backup/datastore.cfg\n    ```\n\n    我的 PBS 数据都存在硬盘的 `backups` 目录中，所以增加下面的配置：\n\n    ```ini\n    datastore: st2000\n        path /mnt/st2000/backups\n    ```\n\n    保存后就会直接在界面上出现存储了，数据都在。\n\n    ![PBS 旧硬盘的数据存储配置生效截图](assets/PBS%20旧硬盘的数据存储配置生效截图.png)\n\n    数据存储的目录结构长这样，如果不记得具体位置，可以尝试找到这样结构的目录去试试。\n\n    ![PBS 数据存储的目录结构](assets/PBS%20数据存储的目录结构.png)\n\n    更新：在 3.2.9 后，可以在 GUI 添加已经有数据的目录了。(还没过两周我又重装一次😂。验证过了，从 GUI 添加是 OK 的。)\n\n    ![GUI 添加旧存储](assets/GUI%20添加旧存储.png)\n\n### PVE 连接 PBS\n\n1. 在 PBS 上创建一个用户：\n\n    ![创建用户](assets/在%20PBS%20上创建%20PVE%20用户.png)\n\n2. 为这个用户增加 /datastore 的管理权限：\n\n    ![在 PBS 中为用户增加所有数据存储的管理权限](assets/在%20PBS%20中为用户增加所有数据存储的管理权限.png)\n\n3. 复制 PBS 指纹信息：\n\n    ![PBS 实例指纹](assets/PBS%20实例指纹.png)\n\n4. 到 PVE 中增加备份服务器：\n\n    ![加备份服务器的入口](assets/增加备份服务器的入口.png)\n\n    ![在 PVE 中增加备份服务器](assets/在%20PVE%20中增加备份服务器.png)\n\n### 恢复数据\n\n完成上面操作后，就可以看到所有的备份数据了。选择你要恢复的进行恢复就好了。\n\n![在 PVE 中能查看到备份列表](assets/在%20PVE%20中能查看到备份列表.png)\n\n## 其他\n\n### 邮件通知\n\n默认情况下似乎收不到邮件，还是需要配一下 SMTP，用已有的电子邮箱服务发信。\n\n![创建 SMTP 通知目标入口](assets/创建%20SMTP%20通知目标入口_7bf0cdb9-be4a-4261-9f6a-d9939584640e.png)\n\n创建新的 SMTP 目标后，需要再修改下通知规则，不然其他地方还是不会使用刚刚创建的 SMTP 通知目标的。\n\n![更改规则](assets/更改规则_76b4ad92-4eb2-4cfa-b899-231ed76a74f5.png)\n\n![更改规则2](assets/更改规则2_096d5aeb-3372-490e-9999-402a79d4ab51.png)\n\n这几天一直收到 PVE 实例的邮件系统（mail system）发信失败的通知，是备份成功的通知。但是我确实有收到正常的备份成功的邮件。\n\n![在邮箱中收到发信失败的通知](assets/在邮箱中收到发信失败的通知_d9e0d78d-517a-4d00-baa9-2e6511aa9df6.png)\n\n我想了下，这个邮件系统应该就是 `sendmail` 类型的通知，所以我补了上面的步骤，确保只使用了 `smtp` 类型的通知，但之后还是会在邮箱收到发信失败的通知。又过了两天，我怀疑 PBS 有类似功能，进去看了看，果然有！\n按下面步骤直接禁用吧：\n\n![禁用 Proxmox Backup Server 通知](assets/禁用%20Proxmox%20Backup%20Server%20通知_08f20c44-6502-4132-b6e6-d31528e018ae.png)",
            "url": "https://ivanli-cn.github.io/blog-26/posts/new-install-and-recover-pve",
            "title": "全新安装 PVE 并使用旧数据恢复它",
            "summary": "喜大普奔，All in boom 了。由于意外停电，PVE 宿主机开机数十分钟后会冻结。日志里没找到特别相关的问题，内存测试跑了一圈，用了一个小时没发现错误。我感觉是硬盘的问题，但是没找到证据能证明。由于有日常本地备份，所以想着直接用控制变量法将两块固态分别重装一次 PVE，跑跑看哪个有问题。有问题的就下岗。所以这次记录一下如何从零开始全新安装 PVE，并使用旧数据恢复我的环境。",
            "date_modified": "2025-04-01T00:00:00.000Z",
            "date_published": "2025-04-01T00:00:00.000Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": [
                "HomeLab/PVE",
                "Ops/Linux"
            ]
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/usb-hub-for-electronic-lovers",
            "content_html": "## 需求\n\n我觉得呀，我一直缺一个 USB-C 口的集线器。为了能使用 USB-C，我买了好几个转接头长期插在 USB type-A 口上。所以这次我准备先开发一款 3C1A 的 USB HUB，同时通过 USB-C 数据线与电脑连接。\n\n作为业余爱好者，折腾硬件的时候还是容易不小心接错线，上错电，为了避免把电脑一波带走，还是得考虑搞个隔离。\n\n我预计将来大概会折腾使用 USB-C 接口索要 PD 供电，并且使用同一个接口进行烧录和调试，所以我还准备为下游的 USB-C 口提供 65W PD 输出。\n\n这样的话，电源输入还得折腾。考虑使用 DC 端口进行 HUB 部分以及 PD 部分的供电，输入电压 24V。另外再加一个 USB PD 20V 作为备用的供电输入，通过 PD sink 芯片取电。快充芯片会根据输入电压来决定输出最大的电压档位，所以兼容性应该是 OK 的。这样的话总功率也得做限制，毕竟不是专门用来充电的，不考虑太大功率的使用。预计总输出功率也是限在 100W 以内。\n\n既然 PD 输出安排了，那电流检测也得安排一下，如果电子负载项目的电流电压采集功能验证顺利，这次的 USB HUB 项目准备采用 MCU 的 ADC 采样电流、电压数据。否则考虑直接四个 INA226 采集。\n\n这样看来要不要再加个屏幕呢？感觉没空间放屏幕，先预留 SPI 接口吧。\n\n## 概念\n\n### USB-C 接口\n\n![母座](./assets/usb-c-female-connector.png)\n\n![公头](./assets/usb-c-male-connector.png)\n\n参考资料：\n\n- [USB Type-C 和电力输送应用和要求入门（Rev. A）.pdf](.%2FUSB%20Type-C%20%E5%92%8C%E7%94%B5%E5%8A%9B%E8%BE%93%E9%80%81%E5%BA%94%E7%94%A8%E5%92%8C%E8%A6%81%E6%B1%82%E5%85%A5%E9%97%A8%EF%BC%88Rev.%20A%EF%BC%89.pdf)\n\n### USB-C 接口角色\n\nUSB-C 数据角色分为：\n\n- **下行端口（DFP）**：向下游发送数据；它通常是设备所连接的主机或集线器上的端口。DFP 将为 VBUS 供电（主机与设备之间的电源路径），还可以为 VCONN 供电（为电子标记的电缆供电）。包含 DFP 的典型应用是集线站。\n- **上行端口（UFP）**：连接到主机或集线器的 DFP，接收设备或集线器上的数据。这类端口通常从 VBUS 中取电。包含 UFP的典型应用是显示监视器。\n- **双角色端口（DRP）**：端口可以用作 DFP（主机）或 UFP（设备）。此类端口在连接时的电源角色决定了其初始角色。源端口承担 DFP 的数据角色，而接收端口承担 UFP 的数据角色。不过，通过使用 USB PD 数据角色交换功能，可以动态地更改此类端口的数据角色。包含 DRD 端口的典型应用是笔记本电脑、平板电脑和智能手机。\n\nUSB-C 供电角色分为：\n\n- 源端口（Source, SRC）\n- 接收端口（Sink, SNK）\n- 双角色电源端口（Dual Role Port, DRP）\n\n这两类角色中，如果设备初始角色是双角色角色，那么在物理连接后可以随时协商到具体的角色。数据角色和供电角色可以任意搭配，虽然常见的是 DFP + SRC 和 UFP + SNK 这样的组合，但是它俩之间是相互独立的，并没有绑定关系。\n\n### USB-C 与 USB 2.0\n\n### USB SDP 与 CDP\n\nSDP 和 CDP 能够对连接到它的任何设备进行 USB 枚举，原因是 SDP 和 CDP 是 PC/笔记本电脑或 USB 集线器上的主机/集线器端口。\n\n- 标准充电端口 (SDP)：遵循 USB 2.0 规范，最大输出为 500mA，通常出现在计算机 USB 主机端口或集线器中。\n- 充电下游端口 (CDP)：具有 USB 2.0/3.0 电流限制的扩展，允许高达 1.5A 的输出电流，与计算机或集线器上的 USB 主机端口关联。\n在 USB-C 接口中，USB 2.0的数据传输信道由两组引脚提供：正面的 A6（D+）和 A7（D-），以及背面的 B6（D+）和 B7（D-）。这两组引脚无论在上游设备或是在下游设备，都是直接物理连接的。而 USB-C 公头只连接 A6 和 A7 两个引脚，最终连接的效果与 USB Type-A 接口一致。\n\n### USB-C 与 USB PD\n\nUSB-C 具有四个 VBUS 引脚，它们分别是 A4、A9、B4、B9。这些引脚不应该在插入 USB-C 电缆时立即供电。规范要求的供电过程如下：\n\n1. 连接检测：主机通过 CC 引脚检测到设备连接。\n2. 方向确定：根据哪个 CC 引脚检测到连接，确定插入方向。\n3. 能力协商：如果支持 USB PD，可以通过 CC 引脚进行电源能力协商。\n4. 启动供电：只有在正确检测到连接并完成必要的协商后，才能启动 VBUS 供电。\n\n### USB HUB 与过流检测\n\n出于安全原因，USB 规范（修订版 2.0）要求所有自供电集线器设计具有过流保护。过流检测和电源切换需要外部电源开关。\n\nUSB HUB 一般会在出现过流时自动切断供电并禁用端口，并向标记过流状态，等待主机看到后，由主机决定是否要求 HUB 重新启用端口。\n\nUSB HUB 一般有两种电源切换模式：\n\n- 组模式（Gang Mode）：如果一组端口中所有端口消耗的总电流超过预设限制，则集线器会关闭该组端口。在 CH338F、CH339F 中，是全部下游端口都在同一组。\n- 独立模式（Individual Mode）：如果一个端口的电流超过预设限制，则集线器会关闭该端口。\n\n显然，独立模式在某一端口出现过流时，不会影响到其他端口的供电。\n\n## 分析\n\n### 先 HUB 还是先隔离？\n\nUSB 2.0 分为三种速度：\n\n- 低速 1.5 Mbps\n- 全速 12 Mbps\n- 高速 480 Mbps\n\n隔离芯片目前我看到主要是两种方案，一种支持低速、全速的 ADUM4160 这类 USB 数字隔离器芯片，淘宝大概 15 ~ 20 元，另一种就是 ISOUSB211 这种支持高速的芯片了，价格在45 ~ 80 元的样子。\n\n对于我来说，全速的接口其实带宽不太够用，比如我经常使用的无头 USB 逻辑分析仪，就挺吃速率的。正常来说，下游每一路 USB 接口都应该单独隔离的，避免一波带走其他连接的 USB 设备。但是，我一般不会同时开发多个项目，所以连接在硬件上的调试工具，也是有可能直接从硬件这侧带走工具，所以我就不太考虑每路独立做隔离。\n\n综上，出于成本考虑，我准备使用的连接方案如下图所示：\n\n```mermaid\nflowchart LR\n    Computer --> isoUSB[Isolated USB Repeater]\n    isoUSB --> hub[USB HUB]\n    hub --> port1[USB Port 1]\n    hub --> port2[USB Port 2]\n    hub --> port3[USB Port 3]\n    hub --> port4[USB Port 4]\n```\n\n这样保证了充分发挥 USB 2.0 的带宽，节约了成本。如果需要独立保护，大不了我再搓一个然后继续星形拓扑。\n\n### 供电\n\n从计算机连接到隔离芯片的这部分直接从上游端口取电就行了，这个没啥需要分析的，有点麻烦的是 HUB 以及下游端口如何取电和供电。\n\n首先，\n\n我准备让隔离芯片下游侧和 HUB 芯片使用同一路电源供电。那么这电源就有两种来路了，一种是从上游端通过独立的 DC-DC 隔离电源提供，另一种就是从独立外部供电提供。这是让我想了很久的问题。\n\n我想了想我现在使用的 USB HUB，轻载输出 5V出头的电压，输出 0.3 A 后电压掉到 4.5 V，看起来这点实力属实有点差，毕竟中间有 1.5 米的线，可能是线阻比较大的缘故。\n\n今天我买的 DC-DC 隔离电源模块也收到了，好家伙，10 W 的，还挺大。为了成品的体积不要太大，我毅然决然地决定：\n\n```mermaid\nflowchart LR\n    pd[USB PD IN] --> pdSource[USB PD DC-DC Source]\n    pdSource --> port1[Port 1 USB-C]\n    pd --> iso[ISO DC-DC]\n    iso --> iso2[Isolated USB Repeater]\n    iso --> hub[USB HUB]\n    hub --> port2[Port 2 USB-C]\n    hub --> port3[Port 3 USB-C]\n    hub --> port4[Port 4 USB type A]\n```\n\n这样，我就能拥有一个支持 USB PD 协议的 USB-C 接口，以及三个带有 5V 供电的接口。支持 USB PD 协议的接口电源部分没有与外部的电源输入隔离。另外三个通过 10 W 的隔离电源输出 5 V，虽说它们三个之间没有隔离，但也算是符合我的设计思路，优先保护计算机，然后保护外部电源（我怕它炸我），最后保护下游设备。\n\n只设计一路 USB PD 协议的接口，主要考虑我不太会同时调试两个需要 USB PD 协议的设备。其次，只有一路 USB PD 输出，也省得我去做功率管理。\n\n### 电源输入\n\n正如前文所说，现在这情况就是我必须为这个 USB HUB 提供一路外部供电了，不然没办法使用。输入的接口我准备使用 USB-C 母口，显而易见，输入得支持 USB PD 协议。\n\n还记得我前面提到的，我买了一个 DC-DC 隔离电源模块吗？这是一个支持 9 ~ 36 V 宽电压输入、5 V 稳压输出的 10 W 隔离电源模块。所以这个项目可以允许 9 ~ 28 V 的 PD 输入。不过受限于我所拥有的供电设备和 PD sink 芯片的选择，至少也是会支持 9 ~ 20 V 的输入。我们后面再选，毕竟这个输入还需要作为 65 W 的 PD 输出电路的电源呢。\n\n### USB PD 输出\n\n作为半路还没出家的人，我非常不确定怎么把 Source 电路集成到 UDP 电路中。但是反过来想，我好像很清楚怎么把 UDP 电路连到 Source 电路中。有点迷惑但大概只要共地，然后把 USB 2.0 的两根数据线连到母口的两对 USB 2.0 数据脚上就行了。所以对于 USB HUB，我好像知道怎么做了。\n\n### 其他 USB 电源输出\n\n除了支持 USB PD 的端口 1，另外两个 USB-C 接口，将会提供 5 V 的 $V_{BUS}$ 输出。这个输出不是一直存在的，而是需要通过 CC 引脚进行检测。因为剩下的两个 USB-C 端口只会提供 5V 电压，反推能得，我们需要实现的是“不带 USB PD 的 USB C DFP USB 2.0“ 的接口。下图是这个接口必要的模块：\n\n![USB Type-C DFP USB 2.0 block diagram without USB PD](./assets/usb-type-c-dfp-usb-2-0-block-diagram-without-usb-pd.png)\n\n_受限于我的时间和能找到的资料有限，本文大概会混淆 USB Type-C 1.1 和 1.2 规范，希望不会有什么大问题。最后实现前我会再和 LLM 确认，尽量不要出错。_\n\n我们暂时忽略掉 USB 2.0 DFP 部分，只看 $V_{BUS}$ 和 CC。由于我们不实现 USB 3.1，也不提供 3A 以上的电流，所以 $V_{CONN}$ 的供电可以省略。剩下的主要就是：\n\n- $V_{BUS}$ 开关\n- $V_{BUS}$ Discharge (650ms 内泄放完成)\n- CC logic\n\nUSB Type-C 规范要求源端必须支持过流保护，这两路 USB-C 端口和 USB Type-A 端口共享同一路 5V 电源，这个电源自带过流保护，所以就再而外添加保护电路了。\n\n### USB 2.0\n\nUSB 2.0 通信和物理连接似乎没啥难点，会连连看就行的样子。 根据规范，USB-C DFP、UFP 可以直接将两组 D+、D- 直接连接在一起，这样我们可以省略三份 USB 2.0 Mux 电路。\n\n## 选型\n\n### 隔离式 USB 中继器\n\n根据前面的分析，我们需要一个高速 USB 隔离芯片。在淘宝上，ADUM3165 价格和 ISOUSB211 看起来差不多，不过似乎 ISOUSB211 特性更丰富。\n\n#### ISOUSB211\n\n特性：\n\n- 符合 USB 2.0 要求\n- 支持低速 (1.5 Mbps)、全速 (12 Mbps) 和高速 (480 Mbps) 信号传输\n- 不需要外部晶体或时钟输入\n- 自动速度和连接检测\n- 支持 L1（睡眠）和 L2（挂起）低功耗状态\n- 可编程均衡，用于补偿高速模式中的板迹线损耗\n- 下游端 CDP 广播\n- 对侧电源正常指示\n- 支持 USB On-the-Go (OTG) 和 Type C® 双角色端口 (DRP) 设计的自动角色交换\n- 高 CMTI：100kV/µs\n- 在整个隔离栅具有 ±8kV IEC 61000-4-2 接触放电保护\n- VBUS 电压范围：4.25V 至 5.5V\n  - 3.3V 和 1.8 V 内部 LDO\n- 符合 CISPR32 B 类辐射限制\n- 环境温度范围：--40°C 至 +125°C\n- 小尺寸 28-SSOP 封装\n- 安全相关认证：\n  - 符合 DIN EN IEC 60747-17 (VDE 0884-17) 标准的 7071VPK VIOTM 和 2121VPK VIORM（增强型）\n  - 符合 UL 1577 标准且长达 1 分钟的 5000VRMS 隔离\n  - IEC 62368-1、IEC 60601-1 和 IEC 61010-1 认证\n  - CQC、TUV 和 CSA 认证\n\n#### ADUM3165\n\n特性：\n\n- USB 2.0 signaling with automatic detection of low, full, and high speed connections\n  - 1.5 Mbps, 12 Mbps, and 480 Mbps data rates\n- Bidirectional USB isolator for upstream and downstream ports\n  - Redriving and high speed data retiming for input jitter removal and an open eye\n  - Flexible clock input options\n- 4.5 V to 5.5 V VBUSx or 3 V to 3.6V operation on each side\n  - 21 mA typical idle, low or full speed mode supply current\n  - 48 mA typical idle, high speed mode supply current\n- Ultra low power standby in USB 2.0 suspend (L2) or disconnect\n  - 1.7 mA typical low power standby, upstream supply current\n  - 20 μA typical low power standby, downstream supply current\n\n- ±6000 V IEC 61000-4-2 ESD protection across the isolation barrier\n- Passed CISPR32/EN55032 Class B emissions\n- High common-mode transient immunity: 50 kV/μs typical\n- Safety and regulatory approvals (pending)\n  - UL (pending): 3750 V rms for 1 minute per UL 1577\n  - CSA Component Acceptance Notice 5A (pending)\n    - IEC 62368-1, IEC 61010-1, and IEC60601-1\n  - VDE certificate of conformity (pending)\n    - DIN V VDE V 0884-11 (VDE V 0884-11):2017-01\n    - VIORM = 849 VPEAK (working voltage)\n- Operating temperature range: -55°C to +125°C\n- Compact 20-lead SSOP with 5.3 mm creepage and clearance\n\n#### CH318\n\n[高速USB信号隔离延长器 CH318](https://www.wch.cn/products/CH318.html)\n\n特点：\n\n- 上位机模式提供1个USB2.0下行端口，下位机模式提供2个USB2.0下行端口，向下兼容USB1.1协议规范\n- 支持480Mbps高速、12Mbps全速和1.5Mbps低速USB传输\n- 支持USB控制传输、批量传输、中断传输、同步/等时传输\n- 同一芯片可配置为上位机模式和下位机模式，分别连接USB Host主机和USB Device设备\n- 搭配CH339芯片，可以实现USB读卡器、USB转SPI、转JTAG、转I2C等多种接口的隔离\n- 支持连接状态指示\n- 内置电容耦合驱动电路和网络变压器耦合驱动电路\n- 纯硬件解决方案，对USB协议完全实时和透明，不需要额外安装任何驱动程序，支持各种包含USB接口的系统\n- 提供晶体振荡器，支持外部时钟输入，内置PLL为USB PHY提供480MHz时钟\n- 上行端口内置1.5KΩ上拉电阻，下行端口内置USB Host主机所需下拉电阻，外围精简\n- USB接口引脚具有6kV增强ESD性能，Class 3A\n- 工业级温度范围：-40~85°C\n- 提供TSSOP20封装形式\n\n这里出现了一个不一样的家伙，根据我查到的资料，使用磁耦合方案就能与 ISOUSB211 和 ADUM3165 等价。由于我计划使用 CH338F 芯片作为下游的 HUB 芯片，所以如果能使用 CH318 做隔离芯片的话，那就可以说是恰到好处了。\n\n但是这个似乎没有人能保证传输速率，从公开资料来看，没有找到相关应用示例和性能数据，所以这个方案可能得保留了。或许也可以先用 CH318 + CH338F 做一个版本测试一下。\n\n### USB HUB 芯片\n\n我觉得这部分不是很重要，要么使用 CH339X，要么使用 CH338X。\n\n#### CH338\n\n[7端口USB HUB控制器芯片 CH338](https://www.wch.cn/products/CH338.html?)\n\n![CH338 系列功能对比](./assets/ch338-series-feature-comparison-table.png)\n\nCH338X 支持下游端口独立电源切换模式。\n\n#### CH339X\n\n[7端口多功能USB HUB CH339](https://www.wch.cn/products/CH339.html)\n\n![CH339 系列功能对比](./assets/ch339-series-feature-comparison-table.png)\n\nCH339X 主要比 CH338F 多了 USB 转网卡、读卡器、UART、JTAG、SPI、I2C、SMBus 功能。不过，我看中的转 SPI、I2C 这种功能，似乎需要驱动程序才能使用。目前公开资料似乎没有表明能在 MacOS 上使用，Linux 和 Android 可以通过[WCHSoftGroup/ch341par\\_linux](https://github.com/WCHSoftGroup/ch341par_linux) 驱动。\n\n虽然我很喜欢这些功能，不过我还不清楚具体调用方法，或许后续的版本会使用 CH339X，但是目前的版本我决定使用 CH338F，简化一些设计。如果需要 SPI、I2C 啥的，也可以通过 USB 内置或外置的方式，用 CH437 之类的芯片实现。这方面我想还是后续再验证吧。\n\n### USB PD 快充协议与 DC-DC 调节\n\n因为输入是支持 USB PD 3.0 协议，所以输入电压在 5 V ~ 20 V 之间。我能接受输出电压小于等于输入电压，那么要么找到能在电压相等时直通的芯片，要么选择支持自动升降压的芯片。本来想着为了设计简单点，将寻找的范围缩小在同时支持 PD 协议和 DC-DC 控制的芯片上。我找了英集芯、南芯、智融三家，只找到英集芯有这样的芯片，其他的得分成电源和快充协议两个芯片。\n\n#### IP6557\n\n[IP6557 数据手册](../../Datasheets/Power/Buck-Boost/IP6557%20140W%20快充升降压%20SOC.pdf)\n\nIP6557 是支持 UFCS/PD2.0/PD3.1/EPR28V 等快充协议的升降压 SOC，支持 USB PD 3.1 的 140 W 输出。输入电压范围 5 ~ 31 V。\n\nIP6557 是一个集成度很好的芯片，但是公开的资料中，只能通过调整输出端的检流电阻两端的电压来改变限流能力。如果这样的话，实际上在与接收端协商能力时，是无法声明带载能力的，这样的话我倒不太想用了。并且这种调节方式，我还不知道如何数控。毕竟我需要根据外部供电的情况来调整输出功率，这样看来没办法用这款芯片了。\n\n#### SC8701/SC8703\n\n[SC8703 数据手册](../../Datasheets/Power/Buck-Boost/SC8703%20AC-DC%20控制器规格书.pdf)\n\n输入 2.7 ~ 29 V，输出 2.5 ~ 29 V，支持轻载 FPM 的外置四管同步升降压控制器。[SC8701](../../Datasheets//Power//Buck-Boost/SC8701%20同步%20Buck-Boost%20控制器.pdf) 支持的最高输入输出电压是 36 V，但是没有 FPM 模式，所以轻载条件下功耗偏高。看起来这两款芯片价格好像差不多，那本项目用例下，输入输出最高都不会超过 28V，所以就选择 SC8703 省点电吧。\n\n不过，使用 SC8703 需要外挂 USB 快充协议芯片。\n\n#### SW2303/SW2305\n\n[SW2303 数据手册](../../Datasheets/USB%20PD/SW2303/数据手册/SW2303_数据手册_Release_DS076_v1.6.pdf)\n\n这是外挂的 USB Type-A 、Type-C 多快充协议芯片。\n\n> SW2303 是一款高集成度 Type-C 口/Type-A 口快充协议芯片，支持 PD、QC、FCP、高低压 SCP、AFC、SFCP 以及 PE 等主流快充协议，支持光耦反馈和 FB 反馈两种工作模式。SW2303 集成了 CV/CC 控制环路，Type-C 接口逻辑，快充协议控制器，以及多种安全保护功能。配合 ACDC 或 DCDC 以及少量的外围元器件，即可组成完整的高性能的 Type-C 口/Type-A 口快速充电解决方案。\n\n通过 FB 反馈到电源芯片，可以调整输出电压。\n\n[SW2305](../../Datasheets/USB%20PD/SW2305/数据手册/SW2305_数据手册_Release_DS078_v1.5.pdf) 比 SW2303 多了个 VOOC 协议，不过价格看起来得加两元，达到 4.5 元。这就是 VOOC 税吗？我还是尽量选择 2.5 元的 SW2303 吧,我可没机会开发 OV 系的东西。\n\n这两款芯片明确提示了支持通过电阻或 I2C 来动态配置功率限制。基本上符合这个项目的使用场景。\n\n![SW2303 功率限制配置](./assets/sw2303-power-limit-configuration.png)\n\n#### IP2736\n\n[IP2736 数据手册](../../Datasheets/USB%20PD/IP2736.pdf)\n\nIP2736 最大的亮点就是支持 UFCS 融合快充协议了。支持 28V EPR 档位，140 W 功率。价格 5.4 元。但是公开资料非常的粗略，没有提供调整限制功率的方法，还是不要碰了。\n\n#### 快充芯片选型小结\n\n国内厂家可真是秘密多，智融至少算是公开了一些比较够用的信息，其他两家资料可太难找了。最后敲定的方案就是 SC8703 + SW2303 的组合了，唯一的问题就是不知道 SW2303 在 FB 反馈到底能不能支持 CC 和 CV 了。\n\n![SW2303 环路控制](./assets/sw2303-loop-control.png)\n\n### USB-C 协议芯片\n\nHUB 下游的端口 2 和 端口 3 是计划支持 5 V 1.5 A 的 USB-C 口，所以我们需要 USB-C 协议芯片，来识别和管理供电。其实有个朴素的解决方法，直接判断 CC 脚是否存在 5.1 KΩ 的下拉电阻，有就送电。正常来说这样做不会出太大问题，不过我是讲究人，还是得尽量搞清楚点，省得以后遇到什么奇奇怪怪的问题，到头来发现是自己埋的坑就乐呵了。\n\n大概我的目标是找到集成度高的芯片，最好能自主运行 Source 模式，能内置 VBUS 放电路径，能配置通告的电流能力，要是再集成过流保护就更妙了。\n\n#### FUSB301A\n\n[FUSB301A 数据手册](../../Datasheets/USB%20PD/FUSB301A.pdf)\n\nFUSB301A 支持 USB Type-C 1.1 和 1.0。\n\n> FUSB301A 是一款完全自动化的 Type-C 控制器，优化用于<15 W 应用。FUSB301A 提供源模式、接收模式、双向模式(on)，配件检测支持和死电池支持的 CC 逻辑检测。\nFUSB301A 具有可配置的 IC 地址，以支持每个系统的多个端口。FUSB301A 具有极低的功耗禁用模式以及正常操作时的低功耗。它采用超薄的 12 引脚 TMLP 封装。\n\n作为 source 时，支持通过 I2C 配置 CC 引脚的上拉电流。符合这个项目的使用场景。FUSB301A 比 FUSB301 多了个 I2C 地址配置，这样放两个不会冲突。\n\n#### FUSB302B\n\n[FUSB302B 数据手册](../../Datasheets/USB%20PD/FUSB302B.pdf)\n\nFUSB302B 是 [FUSB302](../../Datasheets/USB%20PD/FUSB302.pdf) 的新版本，支持了 USB-C 的 1.2 版本。这款芯片支持了可编程的 USB PD 协议，目前看至少可以通过软件实现 PD 3.0 PPS。\n\n这款芯片的 I2C 地址是固定的，提供了几个不同地址的版本，但是价格比默认地址的贵了好多。普通的 4 元，特殊地址的要加三五块钱。\n\nFUSB302B 没有内部或外部的 VBUS 放电路径，这部分还需要额外实现。看起来 FUSB302B 是一个底层的 USB PD 芯片。\n\n#### HUSB331\n\n[HUSB331 数据手册](../../Datasheets/USB%20PD/HUSB331.pdf)\n\n特点：\n\n- USB PD双重角色(Dual-Role Port)\n- 支持USB PD3.0和USB TCPCI V1.1\n- Host模式、Device模式和DRP模式的插拔检测\n- 电流能力广播和检测\n- 线缆类型识别\n- 支持VCONN\n- 支持死电池模式\n- 超低功耗待机模式\n- 30V VBUS引脚耐压和24V CC引脚耐压\n- 支持2个I2C通信地址\n- 支持BIST模式\n- e-fuse烧录模式\n- WLCSP-9B (1.35mmx1.4mm)和 QFN-14L (2.5mmx2.5mm)两种封装模式\n- ±2kV HBM ESD\n\nHUSB331 支持 2 个 I2C 地址，配置，其他和 FUSB302B 其实差不多。\n\n#### TUSB320\n\n[TUSB320 数据手册](../../Datasheets/USB%20PD/TUSB320.pdf)\n\nTUSB320 和 FUSB301A 差不多，实现了 USB Type-C 规范 1.1 版本并向下兼容 1.0。支持配置两个不同的 I2C 地址，能够配置 SRC、SNK、DRP、广播电流等功能。\n\nTUSB320 没有提供 PD 协议支持和 VBUS 放电路径。\n\n#### TPS25810\n\n[TPS25810 数据手册](../../Datasheets/USB%20PD/TPS25810%20USB%20Type-C%20Datasheet%20Rev%20C.pdf)\n\n- 兼容 USB Type-C 版本 1.2 的下行数据端口 (DFP) 控制器\n- 连接器连接/断开检测\n- 配置通道 (CC) STD/1.5A/3A 电流能力通告\n- 超高速极性确定\n- VBUS 应用和放电\n- VCONN 应用于电子标记电缆\n- 音频和调试附件识别\n- 端口未连接时，IDDQ 的典型值为 0.7µA\n- 三个输入电源选项\n  - IN1：USB 充电电源\n  - IN2：VCONN 电源\n  - AUX：器件电源\n- 电源唤醒可保证系统冬眠 (S4) 和关闭 (S5) 功耗状态下的低功耗\n- 34mΩ（典型值）高侧金属氧化物半导体场效应晶体管 (MOSFET)\n- 1.7/3.4A ILimit (±7.1%) - 可编程\n- 端口功率管理可实现多端口的功率资源优化\n- 封装：20 引脚晶圆级四方扁平无引线 (WQFN) 封装 (3mm x 4mm) (1)\n\nTPS25810 不支持通过 I2C 编程，但是他支持端口电源管理（PPM）来动态分配电源，看起来能够通过不同的相互连接，实现双 USB-C 口的总功率限制在 4.5 A 或者 2.0 A 或是其他组合。\n\n#### USB-C 协议芯片选型分析\n\n突然发现之前选择的 10 W 隔离电源好像不太够用，准备更换成同尺寸 20 W 的。这样能支持两路 USB-C 的 1.5 A + 一路 USB Type-A 的 500 mA 电流供应。然后剩下 500mA 一些用来供给其他内部芯片和作为裕量。\n\n这样的话我的希望其实是默认广播并限流两个 USB-C 在 1.5 A。但是也可以通过设置来改成一个是 3.0 A，另一个 500 mA。A 口依然是 500 mA 限流。虽然很极限，不过自用还好，毕竟相当于特殊的模式，如果在这个模式下还需要所有端口都占满功率的话，可以考虑单独给 Type-A 口提供隔离电源。\n\n| 模式              | 平均$^*$ | 聚能    |\n| ----------------- | -------- | ------- |\n| Port 1 （Type-C） | 独立 PD  | 独立 PD |\n| Port 2 （Type-C） | 1.5 A    | 3 A     |\n| Port 3 （Type-C） | 1.5 A    | 0.5 A   |\n| Port 3 （Type-A） | 0.5 A    | 0.5 A   |\n\n按照这个计划，我会偏向使用支持 I2C 控制的芯片来处理。所以先排除 TPS25810。剩下的都没自带 VBUS 放电路径的话，那么 1.1 元的 HSUB331 和 2.5 元的 FUSB302B 就是我想选的芯片了。虽然 USB PD 功能暂时用不上，但是后续其他项目的开发可能会使用上，少用一款芯片少折腾一次。反正价格比 FUSB301A 便宜。根据搜索的资料来看 HUSB311 能够 pin to pin 替代 FUSB302。\n\n那么大概结论就是用 HUSB311 来试试了。这样还需要带保护的 USB 开关芯片，以及 VBUS 放电电路。\n\n**我改主意了**，我完全没必要研究 3 A 的电流能力，或者说电流高了其实还不太安全。如果要高电流或者高功率，我应该使用支持 USB PD 的端口 1，而不是在这研究怎么提供 3 A 的电流能力。增加了系统复杂度，开发周期变长了，就很消磨热情了。\n\n所以我准备还是使用两个 TPS25810，固定限流 1.5 A。\n\n### 带保护的 USB 开关芯片\n\n#### CH217K\n\n[CH127 数据手册](../../Datasheets/Power/CH217.pdf)\n\n特点：\n\n- 内置功率开关管，典型70mΩ导通电阻；\n- 可通过外置电阻调节限流门限，支持400mA～2.7A，典型误差±10%；\n- 支持电源电压2.7V～5.5V；\n- 输出短路时快速限流保护；\n- 低功耗，典型 50uA 静态工作电流；\n- 典型关机电流小于 1uA，关断时没有反向电流；\n- SOT23-6封装。\n\n它自带了 VBUS Discharge，有种安全的感觉。\n\n目前只需要一个这个芯片给 USB Type-A 口进行保护，不做开关用途。我就不找其他芯片了，这个感觉挺好的，比一般芯片还多了一个状态指示。\n\nCH217K 价格不到五毛钱，就是没找到能包邮或者凑单的店，运费 2 元，搞几片备用。\n\n## 开发\n\n### CDP 广播\n\nISOUSB211 在隔离两侧都提供 CDP 广播的使能引脚。由于本项目并没有将隔离芯片的下游通过 USB 接口暴露到外部，而是在内直接连接到了 USB HUB 芯片上，所以这个下游的引脚并不需要启用 CDP 广播。而上游侧作为 USB Device，不需要启用 CDP 广播，项目设计上也不提供角色反转，所以两端都下拉 CDP 使能引脚。\n\n下游的端口 1 使用 USB PD 快充，没准备实现 USB BC，所以是不需要管 CDP。\n因为前面已经决定原则上给下游端口 2 ~ 4 只提供 SDP，所以也不考虑 CDP。\n\n### 主隔离电源外围电路\n\n主隔离电源用于为 USB 端口 2 ~ 4 提供 5 V 供电，并为系统中 MCU 等芯片外设的转换器供电。主要是为了保证 USB 端口的电源干净，根据电源模块手册建议，我为主隔离电源的输出端提供了 LC 滤波电路。\n\n![主隔离电源外围电路](./assets/IsoUSB-C-HUB-主隔离电源电路.png)\n\n### USB PD 电源外围电路\n\n#### SC8703 的 MOSFET 选择\n\n根据数据手册建议，我直接把选择范围缩小到 $V_{DS}$ 耐压 40 V、$V_{GS}$ 耐压 ±20 V 的管子。找了一圈决定使用 NCEP4045GU。\n\n#### SC8703 死区时间设置\n\n在同步 4 管升降压控制器（也称为同步 4 开关 Buck-Boost 控制器）中，MOSFET 的死区时间（Dead Time）是指在切换期间，为防止同一桥臂上下管同时导通而设置的一个短暂延时。正确计算并设置死区时间对于防止直通电流（Shoot-through）和提高转换器效率至关重要。\n\n**以下是计算 MOSFET 死区时间的一般步骤和考虑因素：**\n\n1. **了解关键参数：**\n   - **MOSFET 的延迟时间和转换时间：**\n     - **关断延迟时间（t<sub>d(off)</sub>）**：栅极驱动信号下降到漏源电流下降开始的时间。\n     - **下降时间（t<sub>f</sub>）**：漏源电流从高电平下降到低电平所需的时间。\n     - **导通延迟时间（t<sub>d(on)</sub>）**：栅极驱动信号上升到漏源电流上升开始的时间。\n     - **上升时间（t<sub>r</sub>）**：漏源电流从低电平上升到高电平所需的时间。\n\n2. **计算死区时间：**\n   - 死区时间应满足以下条件，以确保在一个开关器件完全关断后，另一个器件才开始导通：\n     $$\n     t_{\\text{dead}} \\geq t_{d(\\text{off})} + t_f - [t_{d(\\text{on})} + t_r]\n     $$\n   - **安全裕度**：为了适应器件参数的分散性、温度变化和电路中的寄生参数，通常在计算的基础上增加一定的安全裕度。\n\n![NCEP4045GU 需要关注的参数](./assets/IsoUSB-C-HUB-NCEP4045GU-1.png)\n\n根据上图可知：\n\n- **导通延迟时间** $ t_{d(\\text{on})} = 6 \\, \\text{ns} $\n- **关断延迟时间** $ t_{d(\\text{off})} = 23 \\, \\text{ns} $\n- **上升时间** $ t_r = 2.8 \\, \\text{ns} $\n- **下降时间** $ t_f = 3 \\, \\text{ns} $\n\n1. **计算关断路径的总延迟时间：**\n\n   $$\n   t_{\\text{off\\_total}} = t_{d(\\text{off})} + t_f = 23 \\, \\text{ns} + 3 \\, \\text{ns} = 26 \\, \\text{ns}\n   $$\n\n2. **计算导通路径的总延迟时间：**\n\n   $$\n   t_{\\text{on\\_total}} = t_{d(\\text{on})} + t_r = 6 \\, \\text{ns} + 2.8 \\, \\text{ns} = 8.8 \\, \\text{ns}\n   $$\n\n3. **计算最小死区时间：**\n\n   $$\n   t_{\\text{dead\\_min}} = t_{\\text{off\\_total}} - t_{\\text{on\\_total}} = 26 \\, \\text{ns} - 8.8 \\, \\text{ns} = 17.2 \\, \\text{ns}\n   $$\n\n4. **计算 20% 安全裕度：**\n\n     $$\n     \\text{安全裕度} = t_{\\text{dead\\_min}} \\times 20\\% = 17.2 \\, \\text{ns} \\times 0.20 = 3.44 \\, \\text{ns}\n     $$\n\n5. **计算推荐的死区时间：**\n\n   $$\n   t_{\\text{dead\\_recommended}} = t_{\\text{dead\\_min}} + \\text{安全裕度} = 17.2 \\, \\text{ns} + 3.44 \\, \\text{ns} \\approx 20.6 \\, \\text{ns}\n   $$\n\n很刚好地超过了 20 ns。 SC8703 的延迟设置如下：\n\n| DT 电阻      | 死区时间 |\n| ------------ | -------- |\n| 0Ω           | 20ns     |\n| 68kΩ (±10%)  | 40ns     |\n| 270kΩ (±10%) | 60ns     |\n| 开路         | 80ns     |\n\n所以为了避免出问题，我决定将死区时间设在 40ns。\n\n#### FB 反馈电路\n\nFB 反馈是协议芯片 SW2303 向 DC-DC 控制器 SC8703 的 feedback 的电路。它连接了 SW2303 的 `OPTO/FB` 引脚、SC8703 的 `FB` 引脚。\n\n智融没有公开协议控制器 SW2303 的 FB 引脚电压或电路设计建议，但是根据在立创开源广场的相关项目，大家都会为 SC8703 的 FB 网络的配置 100 KΩ 的上拉电阻和 31.6 的下拉电阻，将 $V_{OUT}$ 设为 5 V 左右。\n\n以下是固定 $R_{\\text{UP}} = 100 \\, \\text{kΩ}$ 时，通过修改 $R_{\\text{DOWN}}$ 调整输出电压的表格：\n\n| $V_{\\text{OUT}}$ (V) (目标) | $R_{\\text{UP}}$ (kΩ) | $R_{\\text{DOWN}}$ (kΩ) (计算值) | 推荐的 $R_{\\text{DOWN}}$ 标准值 (kΩ) | 实际 $V_{\\text{OUT}}$ (V) |\n|-----------------|-----------------|----------------------|-------------------------------|------------------|\n| 3               | 100             | 72.46                | 75                            | 3.016            |\n| 5               | 100             | 30.25                | 30                            | 5.04             |\n| 9               | 100             | 15.13                | 15                            | 9.07             |\n| 12              | 100             | 11.08                | 11                            | 12.1             |\n| 15              | 100             | 8.67                 | 8.2                           | 15.04            |\n| 18              | 100             | 7.1                  | 6.8                           | 18.11            |\n| 24              | 100             | 5.21                 | 5.1                           | 24.15            |\n\n**计算说明**\n\n1. 固定 $R_{\\text{UP}} = 100 \\, \\text{kΩ}$。\n2. 原始公式：$V_{\\text{OUT}} = V_{\\text{REF}} \\times \\left(1 + \\frac{R_{\\text{UP}}}{R_{\\text{DOWN}}}\\right)$\n3. 使用公式计算 $R_{\\text{DOWN}}$：\n   $R_{\\text{DOWN}} = \\frac{R_{\\text{UP}}}{\\frac{V_{\\text{OUT}}}{V_{\\text{REF}}} - 1}$\n4. 内部参考电压 $V_{REF} = 1.22 V$\n5. 将计算值四舍五入到最近的标准电阻值。\n6. 使用标准电阻值计算实际 $V_{\\text{OUT}}$。\n\n由于 SW2303 的电源由 SC8703 的输出提供，所以 SC8703 默认输出电压需要在 3.0 V 以上。由因为默认的 USB 电压是 5 V，我认为 SC8703 默认的 FB 电阻配置应该是要让电压在 3 V ~ 5 V。固定 $R_{UP}$ 为 100 KΩ，$R_{DOWN}$ 应该在 72.46 KΩ（3.016 V）~ 30.25 KΩ（5.04 V）之间。\n\n#### 输入与输出限流\n\n![电流检测电路原理图](https://viz-tweak.ivanli.cc/s/3DqzEFeNLcGw.webp)\n\n从上图中可以看出，输入输出的限流的电路结构上是一样的，根据数据手册说明，我们可以按比例使用电流采样电路的三个电阻：\n\n1. 使用 10 mΩ 的检流电阻和两个 1 kΩ 的电阻对\n2. 使用 5 mΩ 的检流电阻和两个 510 Ω 的电阻对\n\n给定公式：\n\n$$ IIN\\_LIM = \\frac{VLIM\\_REF}{RILIM1} \\times \\frac{RSS1}{RSNS1} $$\n\n我们需要计算 $RILIM1 $：\n\n$$ RILIM1 = \\frac{VLIM\\_REF \\times RSS1}{IIN\\_LIM \\times RSNS1} $$\n\n代入已知值：\n\n- $ VLIM\\_REF = 1.21 $\n- $ RSS1 = 510 $\n- $ RSNS1 = 0.005 $\n\n计算 $ RILIM1 $ 在 $IIN\\_LIM = 1 $ 到 $10 $ A 的范围内，1A 递增：\n\n$$ RILIM1 = \\frac{1.21 \\times 510}{IIN\\_LIM \\times 0.005} $$\n\n$$ RILIM1 = \\frac{617.1}{IIN\\_LIM \\times 0.005} $$\n\n$$ RILIM1 = \\frac{123420}{IIN\\_LIM} $$\n\n计算结果：\n\n| $IIN\\_LIM $ (A) | $RILIM1 $ (Ω) | 推荐标准电阻阻值 (Ω) | 实际限流值 $IIN\\_LIM $ (A) |\n|-------------------|------------------|--------------------|-----------------------------|\n| 1                 | 123420           | 120k               | 1.03                        |\n| 2                 | 61710            | 60.4k              | 2.04                        |\n| 3                 | 41140            | 40.2k              | 3.07                        |\n| 4                 | 30855            | 30.1k              | 4.10                        |\n| 5                 | 24684            | 24k                | 5.19                        |\n| 6                 | 20570            | 20k                | 6.21                        |\n| 7                 | 17631.43         | 17.8k              | 6.93                        |\n| 8                 | 15427.5          | 15k                | 8.29                        |\n| 9                 | 13713.33         | 13.3k              | 9.28                        |\n| 10                | 12342            | 12k                | 10.29                       |\n\n实际限流值是根据使用的标准电阻重新计算得到的。",
            "url": "https://ivanli-cn.github.io/blog-26/posts/usb-hub-for-electronic-lovers",
            "title": "造一个支持隔离、PD 供电的全速 USB-C HUB Rev.1",
            "summary": "需求 我觉得呀，我一直缺一个 USB-C 口的集线器。为了能使用 USB-C，我买了好几个转接头长期插在 USB type-A 口上。所以这次我准备先开发一款 3C1A 的 USB HUB，同时通过 USB-C 数据线与电脑连接。 作为业余爱好者，折腾硬件的时候还是容易不小心接错线，上错电，为了避免把电脑一波带走，还是得考虑搞个隔离。 我预计将来大概会折腾使用 USB-C 接口索要 PD...",
            "date_modified": "2024-10-29T00:00:00.000Z",
            "date_published": "2024-10-29T00:00:00.000Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": [
                "Hardware/Circuit",
                "Project/USB-Hub",
                "Hardware/Chip"
            ]
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/dian4-zi3-fu4-zai4-kai1-fa1-bi3-ji4",
            "content_html": "## 选型\n\n### 运算放大器\n\n作为核心部件，我找了几款容易购买的运放芯片做为候选。\n\n| 参数               | OPA2277                     | SGM8552                 | AD8666         |\n| ------------------ | --------------------------- | ----------------------- | -------------- |\n| 单电源供电         | --                          | 2.5 V 到 5.5 V | 5 V 到 16 V    |\n| 双电源供电         | ±2 V 至 ±18 V               | --                      | ±2.5 V 到 ±8 V |\n| 输入失调电压       | ±10 μV                      | 4 μV                    | 最大2.5 mV     |\n| 输入偏置电流       | ±0.5 nA                     | 10 pA                   | 最大1 pA       |\n| 开环增益           | 134 dB                      | 145 dB                  | 未提供         |\n| 共模抑制比(CMRR)   | 140 dB                      | 105 dB                  | 100dB          |\n| 电源抑制比(PSRR)   | 130 dB                      | 110 dB                  | 115dB          |\n| 带宽               | 1MHz                        | 1.53MHz                 | 4MHz           |\n| 输入电压           | (V-) + 2 V ~ (V+) - 2 V     | 轨到轨                  | -0.1 V ~ V - 2 |\n| 输出电压           | (V-) + 0.5 V ~ (V+) - 1.2 V | 轨到轨                  | 轨到轨         |\n| 静态电流(每放大器) | ±790 μA                     | 930 μA                  | 1.1 mA         |\n| 优信价格           | ¥ 2.4                       | ¥ 2.8                   | ¥ 6.9          |\n\n从上面的表格，我决定使用 SGM8552 作为主选，OPA2277 作为备选。所以电路设计上，会使用双电源方案，其中负电源是专门给 OPA2277 选配的。负电源输出保留一个 0 Ω 电阻，如果使用 SGM8552，则不贴。\n\n### 供电设计\n\n根据上面的选型，我选择使用 USB-PD 方案输入供电，电压在 +5 V ~ + 12 V。这样能为 OPA2277 提供 12V 的供电。如果使用 SGM8552，则只索要 5V 电压。负电压电源使用电荷泵从正电压电源生成。\n\n#### USB-C 输入\n\n为了能支持 12V 的电压输入，选择了 USB-C 母口作为电源输入接口。后续通过 USB PD 协议进行电压选择。\n\n由于电子负载内部有敏感的模拟电路，所以特地在输入端口附近增加 LC 滤波电路，目的是滤除高频干扰。\n\n#### 数字电路供电\n\n作为系统主要芯片的供电电压，使用支持 40 V 输入电压的 LDO SY6345。SY6345 输出的电压可调，非常适合本次项目的功能验证。这是因为这路电源将会限制 DAC 和 ADC 的参考电压范围。\n\n#### 参考电压源\n\n计划使用 MCU 内置的参考电压源。\n\n#### 运放电源\n\n目前有四种情况：\n\n1. 使用 5V 输入 + SGM8552。只需要将 USB-C 的电源直接供给 SGM8552 就好了，不需要额外的电源。\n2. 使用 12V 输入 + SGM8552。得增加一路 LDO 给 SGM8552 供电。LDO 选择 SY6345 就好。\n3. 使用 5V ~ 12V 输入 + OPA2277。USB-C 输入作为正电源供给 OPA2277，然后使用 ICL7660A 为 OPA2277 的负电源提供 -12V 的供电。\n4. 使用 5V 输入 + OPA22777。USB-C 输入作为正电源供给 OPA2277，负电源直接接地。\n\n上面这几种情况，是用来做功能验证的。等验证完再决定后续使用哪个方案。\n\n除了接地外，运放的正负电源输入端与电源都连接了一个 10 Ω 电阻，以降低电源的噪声。\n\n#### ICL7660A\n\nICL7660、ICL7660A 是一款电荷泵芯片，电荷泵其中一个功能就是产生一个与电源幅值相同但极性相反的电压。\n\n1. 工作电压范围广:1.5V到12V\n2. 温度范围:-40°C到+85°C (工业级)或0°C到+70°C (商业级)\n3. 低功耗:典型供电电流为26μA (3V供电,25°C条件下)\n4. 高效率:功率转换效率高达96-98%\n5. 输出源电阻低:在3V供电、10mA输出电流条件下,典型值为97Ω\n6. 振荡频率:在3V供电条件下,典型值为5.08kHz\n7. 只需要两个外部电容即可工作,使用简单\n8. 可用作电压反相器、倍压器或分压器\n9. 内置振荡器,频率可通过外部电容调节\n10. 具有低电压(LV)引脚,可以改善低电压工作性能\n\nICL7660 支持 10V 的电源，而 ICL7660A 支持 12V 的电源，所以本项目使用的是 ICL7660A。\n\n由于负电压电源是提供给运放的，所以增加了个磁珠及额外的电容器，以改善纹波噪声。\n\n### 信号采集\n\nSTM32G431CBU6 有两个 ADC，但是很多地方需要用到 ADC，出于整体性能考虑，我将一个 ADC 用于负载电压采集，另一个用于电流、温度采集。\n\n其中，电压和电流的采集使用了差分输入，理论上有助于抵抗干扰。\n\n#### 负载电压信号采集\n\n本次的项目准备实现本地电压采集和远端电压采集，但是受限 ADC 数量的不足。本着不浪费的原则，使用一个四刀双掷的模拟开关来切换电路连接，目前准备使用的型号是 CH445P。\n\nCH445P 导通电阻大概 7 Ω，似乎有一点大，但本菜鸡认为影响不大。\n\n研究了一下，准备使用和前面同型号运放实现一个~~电压跟随器~~差分放大器。因为有近端和远端之分，所以正好能用掉两路运放。电源和之前的也一样，直接连接。负载电源正极首先经过电阻分压网络，所以不会超过运放输入限制。\n\n#### 负载电流信号采集\n\n为了降低检流电阻的功耗，我们需要选择低阻值的电阻。但是 MCU 的 V~REF~ 最低也得 1.71V。假设使用 100 mΩ 采样电阻，我们以 5A 的最大设计电流为例，电阻的功耗为：\n\n$$\nW = I^2 \\cdot R = 5^2 \\cdot 0.1 \\Omega = 2.5 W\n$$\n\n产生的分流电压为：\n\n$$\nV_{shunt} = I \\cdot R = 5 \\cdot 0.1 \\Omega = 0.5 V\n$$\n\n可以说非常低了。有一种方案是将 DAC 输出的电压进行分压后再输入到运放，这样会失去一些抗干扰的能力。另一方面，ADC 采集电流时，精度也因为检流电阻的分压太低而造成精度下降。\n\n如此看来，应该选择对采样电流的分压进行增益。INA193 提供了 20V/V 的增益，具有 500KHz 带宽，理论上可以响应了微秒级的电流变化。设 $V_{REF+}$ = 2.9V$，$I_{max} = 5 A$，理想的电阻最大值是：\n\n$$\nV_{REF+} = 20 \\cdot I_{max} R = 2.9 \\cdot 5 \\cdot 0.025 \\Omega = 2.9 V\n$$\n\n$$\nR = \\frac{V_{REF+} \\div 20}{I_{max}} = \\frac{2.9 V \\div 20}{5 A} = 0.029 \\Omega\n$$\n\n根据计算，25 mΩ 的合金采样电阻是个不错的选择。\n\n$R = 0.025 \\Omega$，满量程 $V_{max_shunt} = 2.9 V$：\n\n$$\nV_{max_shunt} = 20 \\cdot I_{limit} \\cdot R\n= 20 \\cdot 5.8 \\cdot I_{limit} \\Omega\n= 2.9 V\n$$\n\n$$\nI_{limit} = \\frac{V_{max_shunt} \\div 20}{R} = \\frac{2.9 V \\div 20}{0.025 \\Omega} = 5.8 A\n$$\n\n$$\nW = I_{limit}^2 \\cdot R\n= 5.8^2 \\cdot 0.025 \\Omega\n= 0.841 W\n$$\n\n计算可得在满量程的情况下，功耗为 0.941W，选择 2W 功率的电阻即可。\n\n### 主控\n\n首先我先考虑 STM32，看到 STM32G4 系列似乎是与电源相关领域有关的，再加上 Arm® Cortex®-M4 带有浮点加速单元，感觉很合适。\n\n然后直接看淘宝买不买得到，发现 STM32G431CBU6 价格很美丽，目前正经店铺七八元人民币就能包邮带走。\n\n#### ADC\n\n根据STM32G431的数据手册，这个微控制器具有以下ADC配置：\n\n1. ADC数量：\n   STM32G431有2个ADC（模数转换器）。\n\n2. ADC特性：\n   - 这两个ADC都是12位分辨率的。\n   - 支持单端和差分输入模式。\n   - 最大采样率可达5 MSPS（每秒500万次采样）。\n\n3. ADC通道：\n   - 每个ADC有16个外部通道和3个内部通道。\n   - 内部通道包括温度传感器、内部参考电压和VBAT/3。\n\n4. 工作模式：\n   - 支持单次转换、连续转换、扫描和不连续模式。\n   - 支持注入通道模式。\n   - 具有过采样和数字滤波功能。\n\n5. 其他特性：\n   - 支持DMA（直接内存访问）。\n   - 具有模拟看门狗功能。\n   - 支持硬件校准。\n\n这两个ADC可以独立工作，也可以配置为交错模式以提高总体采样率。有了这两个ADC，您可以同时采样多个模拟信号，满足各种应用需求。\n\n#### DAC\n\n1. STM32G431配备了2个DAC。\n\n2. 每个DAC有2个输出通道。\n\n3. DAC特性：\n   - 12位分辨率。\n   - 支持8位和12位数据对齐。\n   - 具有输出缓冲器。\n\n4. 工作模式：\n   - 支持单次和连续转换模式。\n   - 可以使用DMA（直接内存访问）进行数据传输。\n   - 支持波形生成（三角波和噪声波）。\n\n5. 其他功能：\n   - 支持同步更新功能。\n   - 具有校准功能。\n\n6. 性能：\n   - 建立时间通常小于4μs。\n   - 可以达到1 MSPS（每秒100万次采样）的转换速率。\n\n#### USB Power Delivery\n\nSTM32G431CB 支持 USB Power Delivery，所以我们不需要额外购买 USD PD Sink 芯片。如果使用 5V 供电，也能劲剩两个电阻 😜。是的，对应引脚默认有下拉。\n\n哈哈哈哈我人傻了，只有默认的那对 CC 引脚是 DBCC，其他的几对并不支持死电池模式，没有默认的下拉。下个版本修复。\n\n- [x] 更改 CC 引脚\n\n#### 小结\n\nSTM32G431CBU6 DAC 数量和精度都很符合项目要求，ADC 确实不够用，我看了下 G4 系列其他芯片，高端点的就不太能随随便便买了，而且还贵不少。所以 ADC 部分只能牺牲一下采样频率，让电压采集专用一个 ADC，其他的全部连到另一个 ADC 上，通过配置采样序列来分时采样。\n\n## 功能设计\n\n### 负载输入电压检测\n\n电压检测电路使用双端输入，所以连接到 ADC 上会有一对差分线。当然根据设计，后续使用单端检测也是没问题的。\n\n目前电压检测在电路设计上使用了远端检测和近端检测，两路检测信号拥有独立的前端处理电路。这两路电压信号可以有主副之分，通过模拟开关来交换连接到主、副 ADC 进行采样。\n\n#### 负载输入电压信号处理\n\n每路电压信号通过一个差分放大器（减法器）来提升输入阻抗并抑制共模电压。本来是准备实现电压跟随器的，但是我参考开源项目中，有一个使用了看起来更复杂的电路，我感觉那个靠谱些就先抄了过来，电路就是比电压跟随器多了几个阻容。后面有时间了研究了下才知道是这是差分放大器。\n\n![电压差分放大电路原理图](assets/电子负载开发笔记-电压差分放大电路原理图.png)\n\n图中的电路增益倍数是 $\\dfrac{10}{124} \\approx 0.0806$。目前测试下来，其中一路的输出误差偏大，我怀疑是电阻精度的问题，目前使用的是 1% 的厚膜贴片电阻，接下来：\n\n- [ ] ~~使用 0.1%、25 PPM 的厚膜贴片电阻测试~~\n- [ ] ~~使用 0.1%、25 PPM 的厚膜贴片电阻测试~~\n\n#### 主副电压信号交换\n\n![主副电压信号交换电路原理图](assets/电子负载开发笔记-主副电压信号交换电路原理图.png)\n\n这里使用了四刀双掷的模拟开关 CH445P，用了个有点凌乱的连接方法实现了交换连接的功能。切换信号的输入引脚加了个下拉电阻，想着避免开发过程避免代码没实现到控制部分，这边信号不确定的问题。\n\n### 负载电流\n\n![负载电流模拟采样原理图](https://viz-tweak.ivanli.cc/s/z6dDQ-6V6_d5.webp)\n\n这是版本 2 的电路图。右侧是低端采样的检流电阻，将信号通过 INA193 放大 20 倍后分别输出给控制负载 N-MOS 的运放芯片作为负反馈信号，和 MCU ADC 采样电路。\n\n- [ ] 采样电阻两端需要使用同阻值电阻以实现低通滤波。\n\nGrok 2 告诉我低通滤波应该放在 INA193 之后，我感觉似乎有道理：\n\n> 采样电阻上的信号主要是低频信号，不会包含大量的高频噪声和干扰。而INA193的输出信号是经过放大的信号，放大过程中会将采样电阻上的微小噪声和干扰放大，同时INA193本身和电源也会引入额外的噪声和干扰。因此，INA193的输出信号中会包含高频噪声和干扰，而采样电阻上的信号则不会有明显的高频噪声和干扰。\n>\n根据 INA193 的功能框图可知其内部已经有相关的电阻了。\n\n![INA193 功能框图](https://viz-tweak.ivanli.cc/s/5Bu-1rFEmrAr.webp)\n\n#### 电流采样\n\n我使用了低阻值的采样电阻，这主要是为了降低发热量。降低发热量能从源头降低温漂影响，也能避免多处理一处发热量，顺便避免使用大功率电阻而占用过多空间。\n\n用于采样电阻是低阻值的。根据前面的选型，使用的是 25 mΩ 的合金采样电阻，其两端电压大概是 $ V_{Shunt} = I_{max} \\times R_{shunt} = 5 A \\times\n 25 \\mathrm{m\\Omega} = 125 \\mathrm{mV} $\n\n#### 负载电流读取\n\n负载电流读取\n\n### 恒流模式\n\n我将通过控制 DAC 输出的电压作为与增益后的电流采样分压对比的参考电压，通过运放控制 N-MOS 的导通程度使参考电压与实际采样转换后的电压一致，从而实现硬件恒流模式 。\n\n#### DAC 无法输出 0 V\n\n初始化 DAC 后，要求 DAC 输出在 0 ~ 40 mV 是失调状态，实际输出一直是 40 mV 没变化，直到超过 40 mV 才正常。数据手册上说：\n\n![STM32G4 DAC输出电压公式](https://viz-tweak.ivanli.cc/s/QPeYFQn4E70o.webp)\n\n通过直接读取 `DAC_DORx` 寄存器上的数据，看起来是正确的。\n\n根据 ST 论坛内容，似乎问题出在启用了内置的缓冲器上。看起来确实是这样，默认是启用的，禁用掉就正常了，下面是代码。手册上似乎没有提到这个问题，我还以为内部运放都是轨到轨的，草率了，哈哈。\n\n```rust\nlet dac1 = Dac::new(p.DAC1, p.DMA1_CH2, p.DMA1_CH3, p.PA4, p.PA5);\n\nlet (mut dac1_ch1, mut dac1_ch2) = dac1.split();\n\ndac1_ch1.set(dac::Value::Bit12Right(0));\ndac1_ch2.set(dac::Value::Bit12Right(0));\n\n// Disabling the buffer allows the voltage to be set to zero.\n\ndac1_ch1.set_mode(dac::Mode::NormalExternalUnbuffered);\ndac1_ch2.set_mode(dac::Mode::NormalExternalUnbuffered);\n\ndac1_ch1.enable();\ndac1_ch2.enable();\n```\n\n![SM32G4 双通道DAC框图](https://viz-tweak.ivanli.cc/s/WCUjYtDI383r.webp)",
            "url": "https://ivanli-cn.github.io/blog-26/posts/dian4-zi3-fu4-zai4-kai1-fa1-bi3-ji4",
            "title": "电子负载开发笔记",
            "summary": "我准备开发第一版的电子负载，并在此记录一些流水账。这个版本作为我第一次开发电子负载以及运放相关的硬件，希望能实现 CC 模式和 CV 模式，不求精度，只求大概。",
            "date_modified": "2024-10-27T00:00:00.000Z",
            "date_published": "2024-10-27T00:00:00.000Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": [
                "Hardware/Circuit",
                "Project/ElectronicLoad",
                "Hardware/Component/OperationalAmplifier",
                "Hardware/MCU/STM32G431CB"
            ]
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/learn-note-electronic-load",
            "content_html": "最近计划 DIY 一个电子负载仪。但是我对电子负载的实现原理只有一个很模糊的认识。在努力地搜索了一些资料学习后，大概知道了一些实现方向。再具体点的确实难搜，这次得主要依靠 Claude Sonnet 3.5 来救我了。\n\n本文相当于我和 AI 的问答 + 我的理解，再转化成笔记。Claude Sonnet 3.5 至少不会像 OpenAI-4o 及之前版本那样满嘴跑火车，希望后续实现第一版时，硬件电路部分核心功能没有大问题。\n\n## 什么是电子负载\n\n可编程直流电子负载（Programmable DC Electronic Load, EL），是一种用于测试和评估电源设备性能的电子仪器。它可以模拟各种电气负载条件,帮助工程师分析和优化电源系统的性能。\n\n主要功能：\n\n- 恒流模式（CC）\n- 恒压模式（CV）\n- 恒功率模式（CW）\n- 恒阻模式（CR）\n\n一般，电子负载的核心组件是功率晶体管，通过精确的电流控制来消耗电能。\n\n### 工作过程\n\n1. 输入控制:用户设定所需的负载参数,如恒流、恒压、恒阻或恒功率模式。\n2. 采样和反馈:电子负载会实时监测输入电压和电流。\n3. 比较和调节:将采样值与设定值进行比较,生成误差信号。\n4. 驱动控制:根据误差信号调整功率晶体管的导通程度。\n5. 负载效应:功率晶体管消耗电能,对被测电源产生负载效应。\n6. 循环调节:通过不断的采样、比较和调节,使负载参数稳定在设定值。\n\n## 实现原理\n\n一般来说，电子负载可以纯模拟电路实现，也可以使用数字电路实现。\n\n1. 硬件实现的电子负载以其高精度、快速响应和高可靠性为特征，但面临着高成本和低灵活性的挑战。\n2. 软件实现的电子负载优势在于低成本、高灵活性和易于更新，但在精度和响应速度方面可能不如硬件实现。\n3. 软硬件结合的方式试图在性能和成本之间取得平衡，提供了良好的灵活性和可扩展性，但设计更为复杂，需要注意软硬件的协调。\n\n### 核心电路\n\n由功率晶体管（一般是 MOSFET ）充当可调电阻，控制电流的流动并消耗电能。与其串联一个精密低阻值的检流电阻来计算电流值。\n\n负载两端的电压和检流电阻的两端的电压将传给控制电路，控制器通过对比电压的值与设定的值来动态调节功率器件的电流，从而确保符合设定。\n\n### 运算放大器\n\n电子负载中非常重要的一个部分就是误差放大，常用运算放大器来实现。\n\n#### 工作原理\n\n运算放大器是一种具有高增益的直流耦合差分放大器,广泛应用于模拟电路中。它通常有两个输入端和一个输出端:\n\n1. 同相输入端(+)\n2. 反相输入端(-)\n3. 输出端\n\n运放的共模输入是指同时施加在两个输入端上的相同信号。换句话说,当两个输入端接收到相同的电压时,这个电压就被称为共模输入电压。\n\n共模输入的主要特点和作用包括:\n\n1. 理想情况下,运放应该只对差模信号(两个输入端之间的电压差)做出响应,而完全抑制共模信号。这种能力称为共模抑制。\n2. 在实际应用中,共模输入常常代表着不需要的干扰或噪声。例如,在测量微小差分信号时,可能会有较大的共模干扰存在。\n3. 运放的共模抑制比(CMRR)是衡量其抑制共模信号能力的重要参数。CMRR越高,运放对共模信号的抑制能力越强。\n4. 共模输入范围(CMIR)定义了运放能够正常工作的最大共模输入电压范围。超出这个范围可能导致运放失真或饱和。\n5. 在某些应用中,如仪表放大器,利用共模输入可以有效地消除共同存在于两个输入信号中的噪声或干扰。\n6. 在差分放大器电路中,共模输入可用于设置输出的直流偏置电平。\n\n#### 选型\n\n购买适用于电子负载 CC 模式、CV 模式中用来放大误差的运放时，应该选择：\n\n1. 高增益：\n   运放需要有较高的开环增益，通常在 100,000 (100dB) 以上。这确保了电路能够精确地维持恒定电流，即使在负载变化时也能快速响应。\n2. 低输入失调电压：\n   低输入失调电压对于精确控制小电流尤为重要。理想情况下，输入失调电压应该在毫伏级或更低。\n3. 低输入偏置电流：\n   输入偏置电流应尽可能小，以减少对检测电阻上电压的影响，特别是在低电流应用中。\n4. 宽输出摆幅：\n   运放应能提供接近电源电压的输出摆幅，以便在各种负载条件下都能有效地控制 MOS 管。\n5. 适当的带宽：\n   带宽需要足够宽以确保快速响应，但也不宜过宽以避免不必要的噪声。对于大多数恒流应用，几百 kHz 到几 MHz 的带宽通常就足够了。\n6. 低噪声：\n   特别是在控制小电流时，低噪声特性变得尤为重要，以确保输出电流的稳定性。\n7. 良好的共模抑制比（CMRR）：\n   高 CMRR 有助于抑制共模噪声，提高电路的整体性能。\n8. 适当的斜率率：\n   足够快的斜率率能确保运放能够快速响应负载变化，维持恒定电流。\n9. 电源电压范围：\n   运放的工作电压范围应与整个电路的电源要求相匹配。\n10. 温度稳定性：\n    在宽温度范围内保持稳定性能对于保证恒流源的精度很重要。\n11. 输出电流能力：\n    运放应能提供足够的输出电流来驱动 MOS 管的栅极，特别是在高频操作或大型 MOS 管的情况下。\n12. 保护特性：\n    某些应用可能需要内置的过压保护或短路保护功能。\n\n#### 选择非轨到轨运放的可行性\n\n出于成本和实际情况考虑，可以选择非轨到轨（rail-to-rail）的运放。\n\nCC 模式（恒流模式）：\n\n可行性：\n\n1. 中高电流范围：在中等到高电流范围内，使用非轨到轨运放是完全可行的。\n2. 电压裕度：如果系统设计保证了足够的电压裕度，非轨到轨运放可以正常工作。\n\n挑战：\n\n1. 低电流检测：在极低电流时，检流电阻上的电压降可能接近0V，这可能超出非轨到轨运放的输入范围。\n2. 动态范围：如果需要非常宽的电流动态范围，可能会遇到输入信号超出运放工作范围的问题。\n\n解决方案：\n\n1. 使用双电源供电，提供负电压，扩大运放的工作范围。\n2. 采用电压偏置技术，将低电压信号抬升到运放的有效输入范围内。\n3. 对于低电流范围，可以使用更大的检流电阻来产生更大的电压信号。\n\nCV 模式（恒压模式）：\n\n可行性：\n\n1. 中等电压范围：在不接近电源轨的电压范围内，非轨到轨运放通常可以正常工作。\n2. 输出控制：如果控制 MOSFET 所需的电压在运放的输出范围内，使用非轨到轨运放是可行的。\n\n挑战：\n\n1. 低电压设定：当需要设定非常低的电压时，可能会接近运放的下限。\n2. 高电压检测：在接近电源电压的高电压设定时，可能超出运放的输入范围。\n\n解决方案：\n\n1. 使用电压分压器网络来降低高电压输入。\n2. 采用电平转换电路来处理接近电源轨的信号。\n3. 对于低电压设定，可以考虑使用偏置电路。\n\n总结：\n\n在电子负载的 CC 和 CV 模式中，使用非轨到轨运放是可行的，但需要仔细考虑电路设计以克服潜在的限制。关键在于：\n\n1. 合理选择电源电压和参考电压。\n2. 适当设计信号调理电路。\n3. 在必要时使用双电源供电。\n4. 针对特定的工作范围优化电路。\n\n#### 使用双电源\n\n在 CC 模式下，处理低电流时，电流反馈的电压降非常低，即使使用轨到轨的运放也无法避免在没有负电源的情况下良好工作。所以我们直接考虑使用双电源。\n\n下面以 OPAx227 系列芯片为例，来说明选择双电源的必要性：\n\n1. 输入信号范围：\n   - 在 CC 模式下，您需要比较检测电阻上的电压与参考电压。\n   - 如果这些电压可能接近地电位或为负值，那么单电源可能不足以确保正常工作。\n2. 输出要求：\n   - 误差放大器的输出通常用于控制功率器件（如 MOSFET）。\n   - 如果需要输出接近地电位的电压来关断 MOSFET，单电源可能无法满足要求。\n3. OPAx277 的特性：\n   - 输入共模电压范围：V- + 2V 到 V+ - 2V\n   - 输出摆幅：距离正负电源轨约 1.5V 到 2V\n4. 精度考虑：\n   - 在单电源情况下，接近地电位的信号可能会引入额外的误差。\n\n基于以上分析，可以得出一些结论：\n\n1. 使用双电源：\n   - 考虑到 OPAx277 的特性和电子负载的要求，使用双电源是更好的选择。\n   - 这将允许运放在正负电压范围内工作，提供更大的动态范围和更高的精度。\n2. 电源电压选择：\n   - 根据您的具体需求选择合适的正负电源电压。\n   - 例如，±12V 或 ±15V 是常见的选择。\n3. 电路设计考虑：\n   - 确保所有信号都在运放的有效输入范围内。\n   - 考虑使用电压跟随器或缓冲级来处理接近电源轨的信号。\n4. 替代方案：\n   - 如果确实需要使用单电源，您可能需要考虑更换为轨到轨输入输出型运放。\n   - 但这可能会牺牲一些 OPAx277 的高精度特性。\n\n小结一下。考虑到 OPAx277 的特性和电子负载 CC 模式的要求，我建议使用双电源供电。这将充分发挥 OPAx277 的性能优势，提供更高的精度和更大的操作余量。\n\n在 CV 模式下，同样使用双电源，原因也很简单，已经有双电源的情况下，使用双电源有性能优势，并且没有什么额外的坏处。不过双电源时，需要考虑运放输出负电压时，对功率 MOSFET 的保护了。\n\n### 电荷泵\n\n电荷泵可以用非常少的外围元件为运方生成与正电压电源相同的负电压，从而实现电子负载的负电源供电。\n\n对于电荷泵电路，选择合适的电容是非常重要的，因为它们直接影响电荷泵的效率和输出质量。电荷泵通常需要两个主要电容：一个用于电荷转移（飞跃电容），另一个用于输出滤波。让我们详细讨论这两种电容的选择：\n\n1. 飞跃电容（Charge Transfer Capacitor）：\n\n   推荐类型：多层陶瓷电容（MLCC）\n   原因：\n\n   - 低 ESR（等效串联电阻）\n   - 高频特性好\n   - 体积小\n   - 可靠性高\n\n   建议规格：\n\n   - 容值：通常为 1μF 到 10μF，具体取决于您的电荷泵IC和所需的输出电流\n   - 电压额定：至少是输入电压的两倍\n   - 介质：X7R 或 X5R（温度特性较好）\n\n2. 输出滤波电容：\n\n   推荐类型：固态铝电解电容或大容量 MLCC\n   原因：\n\n   - 较大容量\n   - 低 ESR\n   - 良好的纹波抑制能力\n\n   建议规格：\n\n   - 容值：通常为 10μF 到 100μF，取决于负载需求和纹波要求\n   - 电压额定：至少是输出电压的 1.5 倍\n   - 如果选择 MLCC，考虑使用 X7R 或 X5R 介质\n\n具体建议：\n\n1. 飞跃电容：\n   - 使用 4.7μF 或 10μF 的 X7R MLCC\n   - 电压额定选择 16V 或更高（假设您的输入电压为 5V）\n\n2. 输出滤波电容：\n   - 使用 22μF 或 47μF 的固态铝电解电容\n   - 或者使用 22μF X7R MLCC（可能需要并联多个以达到所需容值）\n\n额外考虑：\n\n1. 并联小容量电容：\n   - 在输出滤波电容旁并联一个 0.1μF 的陶瓷电容，以提供更好的高频去耦。\n\n2. 温度因素：\n   - 如果您的设备可能在宽温度范围内工作，确保选择的电容在整个温度范围内保持良好的特性。\n\n3. 布局考虑：\n   - 将飞跃电容尽可能靠近电荷泵IC放置。\n   - 输出滤波电容也应靠近电荷泵输出引脚。\n\n4. 电压应力：\n   - 考虑电荷泵工作时电容可能承受的最大电压，选择具有足够裕度的电压额定。\n\n5. 生命周期：\n   - 固态铝电解电容通常具有比普通电解电容更长的使用寿命，这对长期可靠性很重要。\n\n通过选择这些类型的电容，您应该能够获得一个高效、低噪声的电荷泵输出。这将为您的运算放大器提供一个稳定的负电源。\n\n### N-MOS 栅极电压\n\nN-MOS 栅极电压考虑：\n\n1. 正常操作范围：\n   - N-MOS 管通常在栅源电压（V `<sub>`GS `</sub>`）为正时导通。\n   - 典型的阈值电压（Vth）范围在 0.5V 到 3V 之间，具体取决于器件。\n2. 负栅极电压的影响：\n   - 对大多数 NMOS 来说，施加负栅极电压并不会导致导通。\n   - 然而，过大的负栅极电压可能会损坏栅极绝缘层。\n3. 保护措施：\n   - 许多 NMOS 设备内置有栅极保护二极管，但不应依赖这些来承受持续的负电压。\n\n解决方案：\n\n1. 电平转换：\n   - 使用电平转换电路将运放的输出转换为仅正电压范围。\n   - 可以考虑使用简单的二极管钳位电路。\n2. 偏置电路：\n   - 在运放输出和 NMOS 栅极之间添加一个偏置电路，确保栅极电压始终为正。\n3. 运放输出限制：\n   - 通过适当的反馈设计，限制运放的输出永远不会低于某个安全的正电压值。\n4. 缓冲级：\n   - 在运放输出和 NMOS 栅极之间添加一个缓冲放大器，可以更好地控制栅极电压范围。\n\n### 恒压/恒流模式（CV/CC）\n\n电子负载同时实现CV模式并在必要时切换到CC模式的过程如下：\n\n1. 初始设置：\n   - 用户设置目标电压（CV模式）和最大电流限制。\n   - 控制电路初始化为CV模式。\n2. 持续监测：\n   - 电子负载持续监测输入电压和电流。\n   - 使用高速ADC（模数转换器）进行实时采样。\n3. CV模式操作：\n   - 控制电路调整MOSFET的栅极电压，以维持设定的电压值。\n   - 使用电压反馈回路进行精确控制。\n4. 电流监控：\n   - 同时，通过电流感测电阻持续监控负载电流。\n5. 模式切换逻辑：\n   a) 如果实际电压 ≥ 设定电压 且 电流 < 限制值：\n   - 保持CV模式。\n     b) 如果实际电压 < 设定电压 或 电流 ≥ 限制值：\n   - 切换到CC模式。\n6. CC模式操作：\n   - 控制电路调整MOSFET，以限制电流至设定的最大值。\n   - 使用电流反馈回路进行控制。\n7. 动态响应：\n   - 控制电路能够快速响应负载条件的变化。\n   - 通常能在微秒级别内完成模式切换。\n8. 滞后设计：\n   - 为防止在临界点附近频繁切换，通常会设置一个小的滞后范围。\n   - 例如，可能允许电压比设定值低0.1%或电流超过限制值0.1%才触发切换。\n9. 软件控制：\n   - 现代电子负载通常使用微控制器或DSP实现控制逻辑。\n   - 这允许复杂的决策算法和平滑的模式转换。\n10. 保护机制：\n    - 除了基本的模式切换，还包括过压、过流、过温等保护机制。\n    - 这些机制可能导致负载完全关闭以保护设备。\n11. 用户界面反馈：\n    - 当模式切换发生时，通过显示屏或LED指示灯通知用户。\n12. 数据记录：\n    - 许多高级电子负载会记录模式切换的时间和原因，用于后续分析。\n\n实际应用示例：\n假设测试一个12V电源，电子负载设置如下：\n\n- CV模式设定为11.5V\n- 最大电流限制为5A\n\n工作过程：\n\n1. 初始状态下，负载在CV模式，维持11.5V。\n2. 如果电源电压降至11.4V，负载尝试增加电流以维持11.5V。\n3. 如果电流达到5A限制，负载自动切换到CC模式，限制电流在5A。\n4. 如果之后电源电压恢复到11.6V以上，且电流需求低于5A，负载可能切回CV模式。\n\n这种设计允许电子负载在不同的工作条件下提供最佳的测试和负载模拟，同时保护被测设备和负载本身免受潜在的损坏。\n\n在现代电子负载中，电压误差放大器和电流误差放大器确实是同时工作的。这种设计有几个重要的优点和特点：\n\n1. 并行处理：\n   - 两个误差放大器同时监测和处理电压和电流信息。\n   - 这种并行处理提高了系统的响应速度和精确度。\n2. 快速模式切换：\n   - 由于两个放大器同时工作，系统可以瞬时切换between CV和CC模式。\n   - 不需要启动或初始化另一个放大器，减少了切换延迟。\n3. 动态响应：\n   - 系统可以实时响应负载条件的变化。\n   - 即使在CV模式下，电流误差放大器也在监测电流，为可能的CC模式切换做准备。\n4. 控制逻辑决策：\n   - 控制逻辑（通常是微控制器或DSP）接收来自两个误差放大器的输出。\n   - 基于这两个输入，控制逻辑决定使用哪个误差信号来调节MOSFET。\n5. 无缝过渡：\n   - 当负载条件变化时，系统可以平滑地从一个模式过渡到另一个模式。\n   - 这减少了测试过程中的瞬态干扰。\n6. 复合控制策略：\n   - 一些高级电子负载可能使用两个误差信号的组合来优化控制。\n   - 例如，在CV模式下也可能使用电流信息来改善动态响应。\n7. 保护机制：\n   - 即使在CV模式下，电流误差放大器也在监测过流情况。\n   - 这允许快速触发保护机制，无论当前工作模式如何。\n8. 高级功能实现：\n   - 同时处理电压和电流信息使得实现更复杂的负载模拟成为可能。\n   - 例如，模拟非线性负载或实现动态阻抗测试。\n9. 校准和精度：\n   - 两个放大器的同时工作有助于系统的自校准和交叉验证。\n   - 这可以提高整体测量精度。\n10. 反馈环路优化：\n    - 设计者可以独立优化电压和电流反馈环路，以获得最佳性能。\n\n工作原理示例：\n\n1. 在CV模式下：\n   - 电压误差放大器的输出主要用于控制MOSFET。\n   - 电流误差放大器持续监测，但其输出暂时不用于主要控制。\n2. 在CC模式下：\n   - 电流误差放大器的输出主要用于控制MOSFET。\n   - 电压误差放大器继续监测，为可能的模式切换做准备。\n3. 模式切换时：\n   - 控制逻辑快速切换使用哪个误差信号来控制MOSFET。\n   - 由于两个放大器一直在工作，切换可以几乎瞬时完成。\n\n这种设计方法使得电子负载能够更灵活、更快速地响应各种测试场景，提高了整体性能和可靠性。\n\n### 电压检测\n\n作为电子负载的电压检测并通过软件实现CV（恒压）模式，建议使用以下方案检测电压：\n\n1. 高精度运算放大器电路：\n   使用高精度、低偏移的运算放大器构建一个电压跟随器电路，配合精密电阻分压网络。这种方案可以提供：\n   - 高精度的电压检测\n   - 低输出阻抗，不会影响ADC的采样\n   - 快速响应，适合CV模式的实时控制\n\n2. 精密电阻分压网络：\n   使用高精度（0.1%或更好）、低温漂的电阻进行分压。这可以确保在不同温度下保持稳定的分压比。\n\n3. 过压保护：\n   在运放输入端添加齐纳二极管或瞬态抑制二极管，以保护ADC输入免受可能的过压损坏。\n\n4. 低通滤波：\n   在运放输出端添加一个RC低通滤波电路，以滤除高频噪声，提高ADC采样的稳定性。\n\n5. ADC配置：\n   - 使用STM32G431CB的高分辨率ADC（最高12位）\n   - 适当配置采样时间，以获得最佳的转换精度\n   - 利用ADC的DMA功能，实现高速、连续的电压采样\n\n6. 软件实现：\n   - 使用ADC采样数据实时计算实际电压值\n   - 根据设定的CV值和实际电压值，通过PID或其他控制算法调整电子负载的电流\n   - 利用STM32G431CB的高性能内核，实现快速的控制循环\n\n这种方案结合了硬件的高精度和软件的灵活性，非常适合实现电子负载的CV模式。它可以提供精确的电压检测，同时允许您通过软件算法实现复杂的控制策略，如软启动、过压保护等功能。",
            "url": "https://ivanli-cn.github.io/blog-26/posts/learn-note-electronic-load",
            "title": "学习笔记：电子负载实现原理",
            "summary": "最近计划 DIY 一个电子负载仪。但是我对电子负载的实现原理只有一个很模糊的认识。在努力地搜索了一些资料学习后，大概知道了一些实现方向。再具体点的确实难搜，这次得主要依靠 Claude Sonnet 3.5 来救我了。 本文相当于我和 AI 的问答 + 我的理解，再转化成笔记。Claude Sonnet 3.5 至少不会像 OpenAI-4o...",
            "date_modified": "2024-10-25T00:00:00.000Z",
            "date_published": "2024-10-25T00:00:00.000Z",
            "author": {
                "name": "Ivan"
            },
            "tags": [
                "Hardware/Circuit",
                "Project/ElectronicLoad",
                "Hardware/OperationalAmplifier"
            ]
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/dai4-gong1-l4-ji4-liang2-de-pd-you4-pian4-qi4-ver2",
            "content_html": "## 书接上文\n\n我打算做个 PD 诱骗器，用来获取几个固定档位的电压，以便测试我的 [[Project/PowerDesk]]。第一版大概因为开发到功率计算时，flash 用尽，对应的高配 MCU 还没发布，这次也正好结合之前发现的问题，重新做一个第二版。\n\n## 改进之处\n\n### 系统供电\n\n之前使用 LDO 进行供电，诱骗到 12V以上后，温度是真的有亿点点高，所以这次换了 DC-DC 降压。现在温度表现很好，没有明显发热。\n\n### 两片 PCB\n\n由于供电部分电路的面积大概比之前大四倍，而我又不想双面表贴元件，所以这次也从一块板子换成了两块板子。一层就叫功率板，放了输入输出接口、DC-DC 电路、功率计和输出开关。二层叫控制板，带有屏幕、按键、MCU。\n\n![](assets/pd-sink-v2-pcbs.webp)\n\n两片 PCB 之间通过 BTB 连接器进行硬连接。选了合高 3mm 的连接器，USB-C 母座厚度 3mm，但是引脚上方有点凸起，厚 3.1 mm…… 会磨到控制板，所以我把控制板在 USB-C 母座开了槽。\n\n后续做双 USB-C 口的功率计，换掉功率板就行了。感觉这样玩，打样的 PCB 也算能尽量用上。\n\n功率板上应该开螺丝孔的，因为太赶了，一时没想起来贴片螺柱的固定方案，隔天做主控板时灵光一现，先预留了贴片螺柱的位置，后续迭代的时候再补吧。\n\n### 屏幕\n\n从 0.96 寸的 TFT 换成了 1.47 寸的。这个 1.47 寸的，封装工艺好像很不错，感觉比 0.96 的先进不少。分辨率直接长宽都翻倍。黑边也小，厚度也薄，我感觉我以后不会再选 0.96 寸的屏幕了。\n\n![](assets/0_96-tft-vs-1_47-tft.webp)\n\n上图主要对比下厚度和屏幕黑边。因为上面一块屏幕进焊油了所以亮度不均匀，下面屏幕上边玻璃和下层开胶了，所以漏光了。 另外我感觉我这手机拍出来的照片，电脑看着，感觉色彩空间没全部显示，亮度特低。手机转兼容格式导出也这样，将就看吧。\n\n唯一的问题就是这块屏幕显示效果有点不好。可视角度好像不太好，另外感觉没有一般屏幕那么通透，细看比较难受。不过因为就显示上图那种内容，倒是可以完全忽略这个问题。\n\n### MCU\n\n由于五毛钱的 CH32V003 不够用，同一个产品线就只有这一款在售，感觉还是不靠谱，官方也没有成熟的 macOS IDE 方案，还是换别的吧。所以这次选了 STM32G0X1 系列，选了 UFQFPN 28 封装的芯片，这个封装下，同系列也有很多规格可选，丰富的产品线可太舒服了。本来选了有 64KiB Flash 的 STM32G031G8U6，但是屏幕选的分辨率提高了字体换成了更高清的，结果就是字体挤不下，所以又换成了 128KiB STM32G071GBU6。封装一样，引脚也对应，扣下旧的换上新的，这感觉就是爽。\n\n## 程序设计\n\n目前设计的功能大概是五个：\n\n- [x] 电压诱骗\n- [x] 功率计\n- [x] 软件控制的过流保护\n- [ ] PWM 输出\n- [ ] 电能计\n\n## 外壳设计\n\n还是使用 FreeCAD 进行建模，前面试了下 Fusion CAD，也不是知道是不是 macOS 版本不受重视，感觉操作非常卡顿，云服务非常拖沓，用起来痛苦不矣。\n\n其实建模过程也没什么可说的，这次准备使用树脂光固化打印，听说精度控制比 FDM 好不少，所以公差每边留 0.1 mm。\n\n去淘宝找商家打印，结果起步价 50 元，再见，我穷。嘉立创有 3D 打印服务，算上 5 元邮费，12.64 元拿下。打印出来质感不错，还提供粗磨服务。唯一的小问题就是我的卡扣做太小了，内部一个模型的卡扣被打磨掉了……不过还好，那个卡扣只是用来改善装配体验的，也算是冗余设计，所以没了这几对卡扣对整体没什么影响。\n\n精度高就是好，缝隙更小了，按钮晃动也小了很多。\n\n![组装后的模样](./assets/voltage-spy-hardware-v2.webp)\n\n如果有下一个版本，会考虑将屏幕的黑边再遮多一些，然后输出的排针那边再做厚点，让屏幕左右的白框对称，也让排针能再被包裹一些长度，露出得越少，感觉能越安全点。\n\n## 存在的问题\n\n### 输出开关 P-MOS 温度高\n\n输出功率大时，作为输出开关的 P-MOS 温度偏高。考虑下个版本用两个 P-MOS 来改善发热。这个小 MOS 管太省空间了，我很喜欢它。",
            "url": "https://ivanli-cn.github.io/blog-26/posts/dai4-gong1-l4-ji4-liang2-de-pd-you4-pian4-qi4-ver2",
            "title": "带功率计量的 PD 诱骗器 Ver.2",
            "summary": "书接上文 我打算做个 PD 诱骗器，用来获取几个固定档位的电压，以便测试我的 [[Project/PowerDesk]]。第一版大概因为开发到功率计算时，flash 用尽，对应的高配 MCU 还没发布，这次也正好结合之前发现的问题，重新做一个第二版。 改进之处 系统供电 之前使用 LDO 进行供电，诱骗到 12V以上后，温度是真的有亿点点高，所以这次换了 DC-DC...",
            "date_modified": "2024-10-23T00:00:00.000Z",
            "date_published": "2024-10-23T00:00:00.000Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": [
                "Hardware",
                "Project/PD-Sink",
                "Develop/Rust",
                "DIY"
            ]
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/esp32-c3-reboot-due-to-power-desk-supply-issue",
            "content_html": "突然从某一天开始， Power Desk 待机发热量骤减。果不其然，作为主控的 ESP32-C3 没有正常工作。不过不影响平常从 Power Desk 取电使用，所以一直没管。积压的待办事项太多了，昨天终于准备继续开发 LumiDock Flex 了，这时我想监控  LumiDock Flex  外部供电情况。得了，得先处理 Power Desk 的问题，才能看得到输出情况。\n\n### 到底是谁撂了挑子\n\n最先怀疑程序问题，因为 esp-rs 最近几个版本（v0.17.x-v0.20.x）的稳定性令人堪忧，尝试连接电脑烧录升级到 v0.21.1 的程序，发现连接不上。通过几次尝试，成功复位到下载模式烧录进去了。发现情况不对，似乎 WiFi 初始化到某个阶段就会重启。像啊，很像啊，太像了，太像供电问题了。这个情况我遇到了好多次。\n\n因为之前已经正常工作好长一段时间了，所以我怀疑是焊接问题。毕竟使用的是低温锡，焊接品质还是比较难把控的。我测试了半天，发现只要对 MCU 所在的主控板提供另外一路 3.3V 供电，就能让 MCU 与电脑稳定连接。但是用万用表测量 Power Desk 内部 3.3V 供电，数值稳定显示在 3.3V。\n\n这时，我想起来之前给这个 MCU 从连接电脑的廉价 USB HUB 直接让 VBUS 给原本是 3.3V 供电端口的引脚上过好长一段时间的电，不由地让我怀疑 MCU 是不是岌岌可危了，所以我直接替换一颗新的 MCU，没任何改善。\n\n一不做，二不休。既然不确定现在这片主控板上，是不是某些元件存在焊接问题导致的异常，现在搬板试试。除了 MCU，其他元器件都换新的，板子也是新的，用中温锡来一遍。问题依旧。\n\n终于想起来回到梦开始的时候怎么调程序的了。现在使用开发板烧录程序并用转接线连接 PCB 上对应的网络。经过一些排列组合，确定只要提供一路外部的 3.3V 电源就能正常工作，只使用内部或带载能力不够的电源就会在相同的位置重启。基本上能确定是供电问题导致的了。\n\n### MP2560？\n\n看来不能偷懒了，得上示波器测试下。凭着我业余选手的认知，我赌 3.33V 输出的 DC-DC 电路，有一个 2V 左右的凹陷是不对的。现在得想想怎么修电源电路了。\n\n换了芯片没效果，测量了外围器件，参数看起来都是正常的。最后我用示波器测了下输入……恭喜，自恢复保险丝又坏了一个。功率一大，自恢复保险丝后级直接掉到 2 V 左右！万万没想到，又是被自恢复保险丝坑的一天。\n\n### 又是被自恢复保险丝玩弄的一天\n\n换了个新的自恢复保险丝，问题解决。我已经不能理解，我用过的自恢复保险丝，只有 2920 封装的没出过问题，其他封装的，不论参数，都是翻车过的，不知道什么时候因为什么就坏了，变得很敏感，老是喜欢作出动作。\n\n我怀疑是我焊接的问题，似乎这种器件经不起我拙劣的焊接手艺。工作时 PCB 温度大概在 50-70 度，我觉得不太可能导致 PPTC 损坏。具体什么情况我还是不知道，也不知道啥时候能知道，不过我以后大概会优先使用保护 IC 来替代 PPTC，反正 DIY，不能在一颗树上吊死，我吊了好久了，实在搜不到答案，得换颗树试试了。",
            "url": "https://ivanli-cn.github.io/blog-26/posts/esp32-c3-reboot-due-to-power-desk-supply-issue",
            "title": "Power Desk 的供电问题导致 ESP32-C3 主控重启",
            "summary": "突然从某一天开始， Power Desk 待机发热量骤减。果不其然，作为主控的 ESP32-C3 没有正常工作。不过不影响平常从 Power Desk 取电使用，所以一直没管。积压的待办事项太多了，昨天终于准备继续开发 LumiDock Flex 了，这时我想监控  LumiDock Flex  外部供电情况。得了，得先处理 Power Desk 的问题，才能看得到输出情况。 到底是谁撂了挑子...",
            "date_modified": "2024-10-20T00:00:00.000Z",
            "date_published": "2024-10-20T00:00:00.000Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": [
                "Hardware",
                "Project/PowerDessk",
                "Electronic/PPTC"
            ]
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/lumidock-flex-kai1-fa1-bi3-ji4",
            "content_html": "## 功能需求\n\n我需要一个台灯来帮助我照亮工作台，改善我焊接和调试硬件电路时的照明效果。目前我使用了之前开发的便携灯夹在支架上来照明，固定方式不太好。再加上便携灯在 LED 驱动能力、主动散热能力以及外壳上有一些设计缺陷，所以这次准备开发它的下一个版本的主控板，以及应用这个主控板的新款台灯项目。\n\n我希望这个新项目能继承之前项目的经验，保留以下几个特点：\n\n- 支持 USB-C 输入和内置电池双路供电\n- 支持快充协议输入\n- 按需主动风冷散热\n- 双色温无级调光\n- 主动热保护\n- 小体积\n\n然后再新增几个特点：\n\n- 大约 10W 的 LED 输入功率\n- 5~12V 的外部供电输入，并直通 LED 驱动电路\n- 更偏硬件侧的过温保护\n- 屏幕显示\n\n### 10W 的 LED 输入功率\n\n之前设计的便携灯，LED 灯板额定的输入功率是 10W，但是受驱动芯片实际的升压大概在 31 V 左右的限制，不能满载驱动 10 个 LED 串联的灯条，实际整体。\n\n这次继续使用升压能力至高 30V 的 LED 驱动芯片 SY7203DBC，但是改用单路先 8 串后 2 并的方案，理论单串 4W，单路 8W，灯板总额定输入功率 16W。\n\n根据实际亮度、温度情况决定是否需要启用并联部分来增加通过电流。\n\n### 直通 9V、12V 的外部供电到 LED 驱动电路\n\n之前的便携灯设计时，使用了的 PMIC（电源管理芯片）是具备电池充放电管理功能的。下面我不再强调这个功能，只称做 PMIC。\n\n之前设计一大问题就是，外部供电时，虽然 PMIC 内建了电源路径管理，但是他的输出电压 $V_{SYS}$ 并没有直通输入 $V_{IN}$ 的能力，电流会由 PMIC 先降压，再提供给 LED 驱动电路，这时 LED 驱动电路要将 3.6-4.2V 的电压再升压到 30V，这中间出现了至少两次的损耗。因为没什么时间充分验证电路，我只能猜测缩小压差能改善 LED 驱动芯片的温度表现。至于 PMIC ，如果能绕过它，那么它自己的温度表现肯定会变得更好。\n\n再加上这次主要是为了实现台灯功能，基本上都会插着外部输入，而电池实际上是选配，并且因为一体化设计，内部温度不可避免地会偏高，为了安全起见，实际使用的时候可能也不会安装电池。\n\n所以，这次必须在 PMIC 外部实现电源路径管理，用于外部直接供电。\n\n### 更偏硬件的过温保护\n\n不知道发生了什么，之前设计的便携灯温控功能好像失效了，因为设计上没有为装配后的调试预留方便的窗口，再加上有那么一点点懒，所以也没深究问题所在。那这次索性进一步，使用硬件电路将数字温度传感器的信号改作故障信号，异常时保持住特定电平，拉低两路 LED 灯的使能 PWM　信号，从而阻止温度进一步上升。\n\n### 屏幕显示\n\n主要是不太想连电脑调试，又因为不具备无线通信功能，索性加个屏幕，监视当前状态的同时，提升下价值感。\n\n如果稳定的话还是会考虑去掉屏幕。毕竟对于一个双色温调光的灯来说，发出的光其实就能代表大部分信息了。异常情况做个“灯语”也就完事了。\n\n最后还是没有加屏幕。软件部分实现完成后，感觉系统还是比较稳定，这样的话屏幕用处就不大了。\n\n## 硬件和电路设计\n\n一些参数：\n\n- 输入电压：5-12V\n- 输入电流：3A MAX\n- MCU、数字温度传感器供电电压：3V\n- PMIC 输出 3.3V-4.2V\n- LED 驱动输入：3.3V-12V\n- LED 驱动输出：约 30V（8 串白光 LED）@ 0.1666A\n- 设计输入功率：18W\n  - LED 输入功率：~10W\n  - 电池充电功率：~5W\n- LED 驱动输入过流保护：$15W / 5V = 3A$\n\n### LED 驱动电路\n\nLED 驱动电路之前验证过好多次了，最后还是有一个问题悬而未决，在某些情况，大概是输入电流限流了并且温度偏高时，高占空比的情况下 LED 会异常闪烁。我没啥时间研究电路，所以没独立出验证电路来测试，目前方案也是换了芯片后比较稳定可用的，但是似乎不能完全杜绝这个问题。或许是做了温控逻辑，现在没再遇到类似问题了。\n\n这次继续使用之前的 LED 驱动电路，每路使用两个并联的 LED 限流电阻，用来适应 1 并和 2 并模式。限流电阻改用高精度低温漂的电阻。\n\n![./assets/led-driver-sch.png](assets/led-driver-sch.png)\n\n主控芯片 [SY7203](../Datasheets/Power/LED%20恒流芯片/SY7203DBC%20LED驱动规格书.pdf)，输入配 2 × 10uF 电容器。这个电容器也是主备电源切换时的临时电源。\n\n目前有一个问题，在驱动电路中，续流二极管目前选择的是 DSK34，发热量很大，紧跟 SY7203 温度。\n\n### USB-C 输入\n\n为了减少 LED 驱动电路输入与输出之间的电压差，我选择了 [HUSB238](../Datasheets/USB%20PD/HUSB238%20数据手册.pdf) 来实现 12 V 的输入电压协商。\n\nHUSB238 是一款高度集成的USB Power Delivery（PD）受电端控制芯片（PD Sink），支持高达 100W 的快充功率。HUSB238 符合PD3.0 与 Type-C V1.4 规范，也支持Apple divider 3、BC1.2 SDP、CDP、DCP 充电协议。\n\nHUSB238 支持通过电阻配置默认请求的电压和电流，并支持通过 I2C 读取和请求其他电压和电流。\n\n![husb238-sch](assets/husb238-sch.png)\n\n不连接 $I_{SET}$，电流 3.25A，$V_{SET}$ 接地，电压 5V。GATE 脚主要是用来连接 PMOS 管的栅极，在电源未就绪时断开后级。当前项目不在意供电协商是否成功，所以悬空 GATE 引脚。\n\n### PMIC\n\nPMIC 我找了很久，一直没找到理想的那种，放电时能不主动升压。或许我应该只找锂电池充电管理芯片，毕竟我已经准备使用外部的电源路径管理芯片了。不过最后我还是找到了一款参数比较匹配的芯片，[SGM41511](../Datasheets/Power/PMIC/SGM41511.pdf)。\n\nSGM41511 具有高输入电压能力和窄电压直流（NVDC）电源路径管理的I2C控制3A单节电池充电器。在这里，它将被用来为锂电池充电，并在锂电池放电电压不足时，升压到 3.3V 左右，以维持为其他芯片供电的 LDO 正常工作。\n\n![sgm41511-sch](./assets/sgm41511-sch.png)\n\n通过控制 SGM41511 的 nQON 引脚似乎能让电池断电一下，所以在原理图中，将 BTN2 和 nQON 引脚做了可选连接。经过测试，连接电池并断开外部供电的情况下，长按大概 16 秒以上，PMIC 会暂时停止输出约 250ms。\n![](./assets/sgm41511-full-system-reset-nQqon.webp)\n\n- [x] 验证 SGM41511 的 nQON 引脚是否能让电池供电硬复位。 ✅ 2024-10-22\n\n### 独立的电源路径管理\n\n[TPS2121](../Datasheets/Power/电源多路复用器/TPS212x%20Seamless%20Switching%20Datasheet.pdf) 是一款支持无缝切换的 2.7V 至 22V、56mΩ、4.5A 电源多路复用器。\n\n由于外部供电为 5-12V，电池供电 3.3-4.2V，所以直接使用电压对比模式，使用电压高的电源供电。\n\nTPS2121 提供了过压保护和过流功能，本着不用浪费的原则，也配置了一下，如下图所示，$V_{REF}$ 大概在 1.05V 左右。\n![[。/assets/tps2121-vref.png]]\n\n配置电阻可以使用 [PMUX Switchover Calculator.xlsx](https://webdav-syncthing.ivanli.cc/Ivan-Personal/%E6%95%B0%E6%8D%AE%E6%89%8B%E5%86%8C/%E7%94%B5%E6%BA%90/%E7%94%B5%E6%BA%90%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8%E5%99%A8/PMUX%20Switchover%20Calculator.xlsx) 计算。\n![[assets/pmux-calc.png]]\n根据我手上有的电阻，我选择了上图所示的电阻配置。PRI 和 CP2 直接接地，可以实现高电压电源优先供电，正好对应有外部供电时，$V_{IN1}$ 最低电压 5V，高于 $V_{IN2}$ 最高电压 4.6V。\n\n根据 TPS2121 手册建议，在 LumiDock Flex 主控板 v2 中，增加了两路输入的 TVS，用来在切换输入时防止冲击造成的影响。\n\n\n### 主动散热\n\n经过验证，这个风扇加了 $ 40 * 40 * 5 mm $ 散热片的情况下，很勉强能吃得下 8 W 的 LED 功耗，或许再增加散热片规模就能刚好吃得下 LED 的功耗了。但是有一个问题，驱动电路的温度散不掉，即使在主板和 LED 灯之间贴导热硅胶片也没有帮助。\n\n![LumiDock Flex with blower](./assets/LumiDock-Flex-with-blower.webp)\n\n使用上图的布局，散热片放鼓风机出风口，并且用胶带将风全部导流到散热片上。目前是三条胶带依次从鼓风机贴到另一端的，效果也是越来越好，不过最后还是只能让温度传感器温度维持在 52 °C 内，亮度也被温控策略压在 92% 左右。\n\n当前这个布局就比较尴尬，鼓风机所在的位置才更应该放散热片。或许从另一头往主板反向吹能改善这个问题，但是这个风扇线没那么长，我就没测了。另外，我感觉让主板吃尾气好像也不太好，风道也受阻，想让热量散出去，外壳应该是不好设计了。\n\n和散热片一起，我买了另一款风扇。这款风扇上进风，左右出风的。这样的话，把风扇放中间，散热片和主板在两侧，能左右兼顾。\n\n![LumiDock Flex with 4 cm Fan](./assets/LumiDock-Flex-with-2-line-fan.webp)\n\n效果确实好，风扇自带散热片，直接放在 LED 灯板上，散热效果就很好了。 0.18 W 的功率，就能让温度传感器维持在 46℃ 左右。这让我不由地想将 LED 灯板的功率翻倍试试了！\n\n现在感觉给主板吹到风好像很有必要，毕竟温度传感器都在主板上，我的目的也是让设备整体温度控制在 50 ℃ 内，电池待机温度 40 ℃ 内。所以我想试下换回之前的鼓风机，将电压调到 4.2 V 看看。4.2 V 是这路供电的最大电压了，我没计划去改这个硬件。\n\n![LumiDock-Flex-with-blower-mode-2](./assets/LumiDock-Flex-with-blower-mode-2.webp)\n\n改到这个方向后，温度维持在 50.5 ℃ 左右，亮度被控制在 95% 左右。这是没插电池，鼓风机全速是在 3.5 V 电压的条件下测得的。现在我把电池插上，供电来到 4.2 V，噪音变得很明显了，温度维持在 50 ℃ 内，亮度没有降低。虽然能用了，但是效果确实远不及那个 4 cm 的风扇。毕竟那个 4 cm 的风扇比这个 3.5 cm 的鼓风机在长宽高都多了一些，优势还是挺明显的。可惜便宜货，没有动平衡。不过这 4 cm 风扇低转速能压得住，抖动还不算无法接受。\n\n最后模拟了下外壳，最后这个方案确实是积热严重，温度立马就上去了。看来必须得用 4 cm 的风扇居中放直的方案了。\n\n所以我又斥资买了个再薄一点的 4 cm 自带散热片的风扇。请看图：\n\n![4cm x 1.2cm 风扇带散热片](./assets/LumiDock-Flex-4012-fan.webp)\n\n之前那款 1.5cm 厚的风扇是高转速版的。这个风扇转速比 1.5 cm 的慢了不少，但是功率相当时，抖动和噪音明显小很多。话不多说，去掉背胶摆上试试。\n\n![安装 4cm x 1.2cm 风扇测试](./assets/LumiDock-Flex-with-4cm-fan.webp)\n\n同样调整到 0.18 W 的风扇功率，温度传感器检测到的温度最后稳定在 46 ℃ 左右。表现还挺理想的，不比 1.5 cm 厚的那款差。看来可以确定用这个了。这个风扇价格 8.2 元包邮，1.5 cm 的那款 7.5 元 + 2 元邮费。另外这款散热片是银色的，我觉得比黑的更适合这个项目，嘿嘿。\n\n## 固件设计\n\n### 初始化流程\n\n- 配置 PMIC 输入过压保护为 12V\n- 配置 PD Sink 输入期望 12V\n- 设置温度传感器保护逻辑\n- 初始化屏幕\n- 初始化按键操作\n\n#### 配置 PMIC\n\n我用 Rust 语言为 SGM41511 开发了一个驱动，[Git Repo](https://github.com/IvanLi-CN/sgm41511-rs)。\n\n由于 MCU 是由 PMIC 供电，为了避免触发保护动作导致掉电，得先将 PMIC 的过压保护从默认的 5V 调整到 12V。\n\n#### 风扇调速和转速检测\n\n硬件上，选用了价格相对较低的三线无刷风扇，只有电源正、负线和测速线，所以调速需要通过 PWM 模拟。\n\n![3-pin-blower-fan](assets/3-pin-blower-fan.webp)\n\n### 软件实现\n\n选择的 MCU 是 STM32G031G8 或 STM32G071GB，使用 [embassy-stm32](https://docs.embassy.dev/embassy-stm32/git/stm32g031g8/index.html) 作为 HAL。\n\n因为最后决定不使用屏幕，所以使用了 STM32G031GBU6\n\n#### 风扇调速和转速检测（软件）\n\n第一版设计上使用 `TIM2` 的 1、2 通道来实现转速检测，3 通道实现风扇调速。但是不知道是 MCU 的限制还是 `embassy-stm32` 的限制，无法同时工作。所以：\n\n- [x] 第二版把分到两个定时器上\n\n 第二版的硬件已经实现了速度读取和调速功能。但是，调速状态下读的速度不准确，目前是低侧 PWM 调速，或许换成高侧 PWM 调速能正常，这个以后有机会再验证了。因为风扇要换成两线的了。\n\n### 未触发高电压的 USB 供电会导致灯光闪烁\n\n当使用 16 颗 0.5W 的 LED 时，由于整机满载照明部分需要消耗 20W 的功率，同时电池充电消耗 5W 功率。不考虑不支持快充的电源，一般的快充电源在 5V 的输出功率只有 15 ~ 18 W。所以在本机的硬件层面限制了 LED 驱动电路的电源输入，不超过 3.2 A。即使这样，LED 驱动电路还是会因为无法吸取到更多电流，导致闪烁。\n\n更要命的是，一但出现这种闪烁，即使后续协商到了高电压，还是会因为反复触发了本机的过流保护，导致几乎无法恢复到正常状态。我尝试堆叠了一些电容到 LED 驱动电路的电源输入，也无法有效缓解这种情况。6\n\n所以在软件层面，加快了 PD 握手状态的检测，并限制了 VBUS 电压低于 8 V 时的亮度，以缓解这种情况，不有希望从这种情况中恢复到正常状态。\n\n## 外壳模型\n\n### 外壳存在的问题\n\n#### PCB 按钮凸出的安装导轨\n\n由于外壳比较厚，不容易形变，并且比以前设计的模型都深，导致 PCB 按钮的凸出不容易安装到预定位置。后续得考虑在外壳上给每个按钮挖一个 1mm 的安装轨道。\n\n#### 嵌入螺母与模型咬合不力\n\n不知道是不是我嵌螺母的技术不行，目前的模型预留的孔看起来很理想，但是螺母进去后，受不住比较大的扭矩，会打滑。或许应该再减小一些预留的孔的大小。\n\n目前买个瓶胶水拯救了一下，不会打滑了。",
            "url": "https://ivanli-cn.github.io/blog-26/posts/lumidock-flex-kai1-fa1-bi3-ji4",
            "title": "LumiDock Flex 开发笔记",
            "summary": "记录一下我开发 LumiDock Flex 的过程。",
            "date_modified": "2024-10-13T00:00:00.000Z",
            "date_published": "2024-10-13T00:00:00.000Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": [
                "Hardware",
                "台灯",
                "Project/LumiDockFlex",
                "Develop/Rust"
            ]
        },
        {
            "id": "https://ivanli-cn.github.io/blog-26/posts/dai4-gong1-l4-ji4-liang2-de-pd-you4-pian4-qi4",
            "content_html": "## 背景与目标\n\n最近正在开发一款支持多协议快充的桌面供电设备，需要测试输出的情况，所以迫切需要拥有一个 PD Sinker。之前还没机会用到相关的芯片，这次借机搓一个。\n\n因为自己的首要需求是测试快充输出，其次是其他场景下也能发挥最大的功能，所以考虑要实现的目标如下：\n\n1. 支持 PD sink\n\n    1. 5-20V 支持，不追求细分的电压档位\n\n    2. 数控，避免误操作\n\n    3. 带有记忆功能\n\n2. 支持显示电流和功率\n\n    1. 自带显示屏\n\n    2. 实时显示输出，不做历史记录\n\n3. 工作电压 4-25V，电流 10A\n\n## 选型与设计\n\n### 大体思路\n\n项目整体上是分为两个部分，一个是 PD sink，一个是实际输出的参数采集。这俩部分由 MCU 控制。MCU 通过微动开关收集用户输入的指令，通过显示屏输出系统状态。\n\n尽量选择支持双向通信的 PD sink 芯片，用来采集可选的 PD 档位，避免误选了不存在的档位，导致输出的电压不符合预期。\n\n作为串联在电源与用电器之间的设备，功耗要尽量地低，避免拖累电源。\n\n### PD Sink 芯片\n\nUSB Power Delivery 受电芯片是本项目的核心部件，用于向 PD Source 申请指定的电压与电流。第一步就是选择 PD sink 芯片。\n\n首先映入眼帘的就是经常见到的 **CH224K**，支持模拟和数字两种方式配置诱骗的电压，其中数字方式适合本项目，支持 5V、9V、12V、15V、20V。\n\n我更喜欢 **CH224D** 这款芯片。一是相比 CH224K 的 ESSOP-10 封装，没有脚的 QFN20 好焊很多。二是它有控制 NMOS 的能力，具体功能就不清楚了，因为某宝买不到，就没继续研究了。\n\n然后发现 **FS312** 这款芯片，支持的档位和 CH224K 一样，只支持模拟方式配置，虽然 MCU 也有办法控制，但是没必要折磨自己。\n\n主角来了，**HUSB238**，比 CH224K 多了 18V 档位，还能通过 I2C 配置，并且能读取 PD Source 支持的档位信息，加上 DFN10 封装，满足了。某宝上价格还行，比 CH224K 贵一点点。\n\n### 功率计芯片\n\n**INA226** 支持 36V 母线电压， 我一直在使用 INA226，正好有日常备料，直接使用了。\n\n我还没发现其他更好的选择。\n\n### 主控芯片\n\n主控芯片我目前只会从 ESP32-C3 和 CH32V003 中选择，这个项目我就直接选择 **CH32V003** 了，0.5 CNY，买不了吃亏买不了上当，能在 macOS 上开发，芯片性能也足够了。\n\n### 显示屏\n\n我是根据 PCB 尺寸来选的，考虑到上一个项目已经使用了使用 ST7735S 主控的 0.96 寸 TFT，用在这个项目上尺寸正好。我大概估算了下功率，觉得还行就直接选这个了。\n\n因为我觉得看起来会比单色的 OLED 舒服些，所以选择了彩屏。后续考虑做自动熄屏来节约功耗。\n\n### 电源芯片\n\n由于系统整体功耗不算小，所以不考虑通过 PD sink 芯片取电，而是使用单独的供电。目标供电电压在 2.8-3.3V 之间（受限于显示屏，其他器件 2.7-5.5V）。\n\n**SY6345** 支持 40V、300mA 输入的 LDO，支持最低 300mV 的压差。这款在优信上有卖，价格也低。\n\n其它的选择我忘记了（来自一周后才开始写这篇文章的我），受限于体积，没有选择封装更大的 LDO，SY6345AAC 使用 SOT23-5 封装，体积足够小。\n\n### 输出接口\n\n我选 2.54mm 弯排针，我比较常用这个。我买了 24AWG 的镀金的杜邦线，测试时走 12V 3A 是 OK 的。\n\n## 软件设计\n\n### 操作逻辑\n\n主界面是功率计界面，显示电压、电流、功率、当前申请的电压档位。\n\n设备的按键 A 和按键 B 分别位于屏幕长边的两侧，为了方便说明，根据屏幕方向，将上方按键作为_按键上_，下方按键作为_按键下_。\n\n主界面下短按_按键上_进入或退出睡眠模式，长按_按键上_启用或禁用自动睡眠，短按_按键下_切换界面内容，长按_按键下_切换屏幕方向。\n\n同时短按两个按键开启或关闭输出，关闭输出时显示诱骗档位选择界面。按键上和按键下切换选中项，同时短按两个按键生效并开启输出。\n\n同时长按两个按键进入设置界面，设置界面功能待定。\n\n### 按键处理\n\n本次使用 `SysTick` 和 GPIO 中断实现按键触发、长按短按识别。按键 A 和按键 B 连接 PA1 和 PA2，MCU 内部上拉，低电平表示按下。500 ms 内算短按，否则算长按，不支持自动连击。\n\n`SysTick` 是以 `HCLK` 或 `HCLK/8` 作为时基，我选用 `HCLK`。 `HCLK` 又由 `RCC_CFGR0` 寄存器 `SW[1:0]` 配置，我选用默认的内置高速时钟源 `HSI` ， 频率 24 MHz。所以我希望的 500 ms 等于 `0.5s * 24MHz = 12M`\n\n## 测试与调整\n\n### 在 12V 及以上输入时，LDO 温度偏高\n\n目前屏幕背光 100% 亮度，MCU 和功率计正常工作，LDO 温度偏高。目前考虑降低背光亮度和实现屏幕待机逻辑。\n\n我还没等到实现屏幕背光亮度控制逻辑，CH32V003 的 Flash 已经被我的程序和字体占得满满的了。现在得去做下一版了。",
            "url": "https://ivanli-cn.github.io/blog-26/posts/dai4-gong1-l4-ji4-liang2-de-pd-you4-pian4-qi4",
            "title": "带功率计量的 PD 诱骗器",
            "summary": "背景与目标 最近正在开发一款支持多协议快充的桌面供电设备，需要测试输出的情况，所以迫切需要拥有一个 PD Sinker。之前还没机会用到相关的芯片，这次借机搓一个。 因为自己的首要需求是测试快充输出，其次是其他场景下也能发挥最大的功能，所以考虑要实现的目标如下： 1. 支持 PD sink     1. 5-20V 支持，不追求细分的电压档位     2. 数控，避免误操作     3....",
            "date_modified": "2024-07-22T00:00:00.000Z",
            "date_published": "2024-07-22T00:00:00.000Z",
            "author": {
                "name": "Ivan Li"
            },
            "tags": [
                "Hardware",
                "Project/PD-Sink",
                "Develop/Rust",
                "DIY"
            ]
        }
    ]
}