惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Archives - TechRepublic
Security Archives - TechRepublic
博客园 - 三生石上(FineUI控件)
云风的 BLOG
云风的 BLOG
C
Check Point Blog
Engineering at Meta
Engineering at Meta
Y
Y Combinator Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Forbes - Security
Forbes - Security
IT之家
IT之家
L
LINUX DO - 最新话题
N
News and Events Feed by Topic
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
雷峰网
雷峰网
N
News | PayPal Newsroom
The Last Watchdog
The Last Watchdog
V
Visual Studio Blog
月光博客
月光博客
Microsoft Azure Blog
Microsoft Azure Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Webroot Blog
Webroot Blog
TaoSecurity Blog
TaoSecurity Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Schneier on Security
Schneier on Security
P
Privacy International News Feed
G
Google Developers Blog
博客园 - 聂微东
博客园 - 叶小钗
M
MIT News - Artificial intelligence
Apple Machine Learning Research
Apple Machine Learning Research
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
WordPress大学
WordPress大学
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Simon Willison's Weblog
Simon Willison's Weblog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
宝玉的分享
宝玉的分享
H
Hacker News: Front Page
Martin Fowler
Martin Fowler
L
Lohrmann on Cybersecurity
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
罗磊的独立博客
T
The Exploit Database - CXSecurity.com
S
Security @ Cisco Blogs
博客园_首页
AWS News Blog
AWS News Blog
P
Proofpoint News Feed
人人都是产品经理
人人都是产品经理
Help Net Security
Help Net Security
Google DeepMind News
Google DeepMind News
T
Threatpost

Ivan's Blog

untitled - Ivan 搓一个 USB PD 协议与 DC-DC 反馈 在 UTM 中创建一个带有 xfce 桌面环境的 ArchLinux 升级 All in One: PVE 8.4 -> PVE 9.1, PBS 3 -> 4 Cloudflare Tunnel 实现内网穿透小记 SK150C 外壳套件——硬件设计篇 电子负载 Rev.3 开发笔记 使用 CH335F 构建一个支持独立供电的 2A2C USB HUB UPS 开发笔记:硬件选型与设计 ByteVirt LXC 小鸡重装最新 ArchLiux 小记 造一个支持隔离、PD 供电的全速 USB-C HUB Rev.2 快速在 PVE 全新部署 Arch Linux LXC 在本地运行 Act Runner 全新安装 PVE 并使用旧数据恢复它 造一个支持隔离、PD 供电的全速 USB-C HUB Rev.1 电子负载开发笔记 学习笔记:电子负载实现原理 带功率计量的 PD 诱骗器 Ver.2 Power Desk 的供电问题导致 ESP32-C3 主控重启 带功率计量的 PD 诱骗器
LumiDock Flex 开发笔记
Ivan Li · 2024-10-13 · via Ivan's Blog

功能需求

我需要一个台灯来帮助我照亮工作台,改善我焊接和调试硬件电路时的照明效果。目前我使用了之前开发的便携灯夹在支架上来照明,固定方式不太好。再加上便携灯在 LED 驱动能力、主动散热能力以及外壳上有一些设计缺陷,所以这次准备开发它的下一个版本的主控板,以及应用这个主控板的新款台灯项目。

我希望这个新项目能继承之前项目的经验,保留以下几个特点:

  • 支持 USB-C 输入和内置电池双路供电
  • 支持快充协议输入
  • 按需主动风冷散热
  • 双色温无级调光
  • 主动热保护
  • 小体积

然后再新增几个特点:

  • 大约 10W 的 LED 输入功率
  • 5~12V 的外部供电输入,并直通 LED 驱动电路
  • 更偏硬件侧的过温保护
  • 屏幕显示

10W 的 LED 输入功率

之前设计的便携灯,LED 灯板额定的输入功率是 10W,但是受驱动芯片实际的升压大概在 31 V 左右的限制,不能满载驱动 10 个 LED 串联的灯条,实际整体。

这次继续使用升压能力至高 30V 的 LED 驱动芯片 SY7203DBC,但是改用单路先 8 串后 2 并的方案,理论单串 4W,单路 8W,灯板总额定输入功率 16W。

根据实际亮度、温度情况决定是否需要启用并联部分来增加通过电流。

直通 9V、12V 的外部供电到 LED 驱动电路

之前的便携灯设计时,使用了的 PMIC(电源管理芯片)是具备电池充放电管理功能的。下面我不再强调这个功能,只称做 PMIC。

之前设计一大问题就是,外部供电时,虽然 PMIC 内建了电源路径管理,但是他的输出电压 VSYSV_{SYS} 并没有直通输入 VINV_{IN} 的能力,电流会由 PMIC 先降压,再提供给 LED 驱动电路,这时 LED 驱动电路要将 3.6-4.2V 的电压再升压到 30V,这中间出现了至少两次的损耗。因为没什么时间充分验证电路,我只能猜测缩小压差能改善 LED 驱动芯片的温度表现。至于 PMIC ,如果能绕过它,那么它自己的温度表现肯定会变得更好。

再加上这次主要是为了实现台灯功能,基本上都会插着外部输入,而电池实际上是选配,并且因为一体化设计,内部温度不可避免地会偏高,为了安全起见,实际使用的时候可能也不会安装电池。

所以,这次必须在 PMIC 外部实现电源路径管理,用于外部直接供电。

更偏硬件的过温保护

不知道发生了什么,之前设计的便携灯温控功能好像失效了,因为设计上没有为装配后的调试预留方便的窗口,再加上有那么一点点懒,所以也没深究问题所在。那这次索性进一步,使用硬件电路将数字温度传感器的信号改作故障信号,异常时保持住特定电平,拉低两路 LED 灯的使能 PWM 信号,从而阻止温度进一步上升。

屏幕显示

主要是不太想连电脑调试,又因为不具备无线通信功能,索性加个屏幕,监视当前状态的同时,提升下价值感。

如果稳定的话还是会考虑去掉屏幕。毕竟对于一个双色温调光的灯来说,发出的光其实就能代表大部分信息了。异常情况做个“灯语”也就完事了。

最后还是没有加屏幕。软件部分实现完成后,感觉系统还是比较稳定,这样的话屏幕用处就不大了。

硬件和电路设计

一些参数:

  • 输入电压:5-12V
  • 输入电流:3A MAX
  • MCU、数字温度传感器供电电压:3V
  • PMIC 输出 3.3V-4.2V
  • LED 驱动输入:3.3V-12V
  • LED 驱动输出:约 30V(8 串白光 LED)@ 0.1666A
  • 设计输入功率:18W
    • LED 输入功率:~10W
    • 电池充电功率:~5W
  • LED 驱动输入过流保护:15W/5V=3A15W / 5V = 3A

LED 驱动电路

LED 驱动电路之前验证过好多次了,最后还是有一个问题悬而未决,在某些情况,大概是输入电流限流了并且温度偏高时,高占空比的情况下 LED 会异常闪烁。我没啥时间研究电路,所以没独立出验证电路来测试,目前方案也是换了芯片后比较稳定可用的,但是似乎不能完全杜绝这个问题。或许是做了温控逻辑,现在没再遇到类似问题了。

这次继续使用之前的 LED 驱动电路,每路使用两个并联的 LED 限流电阻,用来适应 1 并和 2 并模式。限流电阻改用高精度低温漂的电阻。

./assets/led-driver-sch.png

主控芯片 SY7203,输入配 2 × 10uF 电容器。这个电容器也是主备电源切换时的临时电源。

目前有一个问题,在驱动电路中,续流二极管目前选择的是 DSK34,发热量很大,紧跟 SY7203 温度。

USB-C 输入

为了减少 LED 驱动电路输入与输出之间的电压差,我选择了 HUSB238 来实现 12 V 的输入电压协商。

HUSB238 是一款高度集成的USB Power Delivery(PD)受电端控制芯片(PD Sink),支持高达 100W 的快充功率。HUSB238 符合PD3.0 与 Type-C V1.4 规范,也支持Apple divider 3、BC1.2 SDP、CDP、DCP 充电协议。

HUSB238 支持通过电阻配置默认请求的电压和电流,并支持通过 I2C 读取和请求其他电压和电流。

husb238-sch

不连接 ISETI_{SET},电流 3.25A,VSETV_{SET} 接地,电压 5V。GATE 脚主要是用来连接 PMOS 管的栅极,在电源未就绪时断开后级。当前项目不在意供电协商是否成功,所以悬空 GATE 引脚。

PMIC

PMIC 我找了很久,一直没找到理想的那种,放电时能不主动升压。或许我应该只找锂电池充电管理芯片,毕竟我已经准备使用外部的电源路径管理芯片了。不过最后我还是找到了一款参数比较匹配的芯片,SGM41511

SGM41511 具有高输入电压能力和窄电压直流(NVDC)电源路径管理的I2C控制3A单节电池充电器。在这里,它将被用来为锂电池充电,并在锂电池放电电压不足时,升压到 3.3V 左右,以维持为其他芯片供电的 LDO 正常工作。

sgm41511-sch

通过控制 SGM41511 的 nQON 引脚似乎能让电池断电一下,所以在原理图中,将 BTN2 和 nQON 引脚做了可选连接。经过测试,连接电池并断开外部供电的情况下,长按大概 16 秒以上,PMIC 会暂时停止输出约 250ms。

  • 验证 SGM41511 的 nQON 引脚是否能让电池供电硬复位。 ✅ 2024-10-22

独立的电源路径管理

TPS2121 是一款支持无缝切换的 2.7V 至 22V、56mΩ、4.5A 电源多路复用器。

由于外部供电为 5-12V,电池供电 3.3-4.2V,所以直接使用电压对比模式,使用电压高的电源供电。

TPS2121 提供了过压保护和过流功能,本着不用浪费的原则,也配置了一下,如下图所示,VREFV_{REF} 大概在 1.05V 左右。 ![[。/assets/tps2121-vref.png]]

配置电阻可以使用 PMUX Switchover Calculator.xlsx 计算。 ![[assets/pmux-calc.png]] 根据我手上有的电阻,我选择了上图所示的电阻配置。PRI 和 CP2 直接接地,可以实现高电压电源优先供电,正好对应有外部供电时,VIN1V_{IN1} 最低电压 5V,高于 VIN2V_{IN2} 最高电压 4.6V。

根据 TPS2121 手册建议,在 LumiDock Flex 主控板 v2 中,增加了两路输入的 TVS,用来在切换输入时防止冲击造成的影响。

主动散热

经过验证,这个风扇加了 40∗40∗5mm40 * 40 * 5 mm 散热片的情况下,很勉强能吃得下 8 W 的 LED 功耗,或许再增加散热片规模就能刚好吃得下 LED 的功耗了。但是有一个问题,驱动电路的温度散不掉,即使在主板和 LED 灯之间贴导热硅胶片也没有帮助。

LumiDock Flex with blower

使用上图的布局,散热片放鼓风机出风口,并且用胶带将风全部导流到散热片上。目前是三条胶带依次从鼓风机贴到另一端的,效果也是越来越好,不过最后还是只能让温度传感器温度维持在 52 °C 内,亮度也被温控策略压在 92% 左右。

当前这个布局就比较尴尬,鼓风机所在的位置才更应该放散热片。或许从另一头往主板反向吹能改善这个问题,但是这个风扇线没那么长,我就没测了。另外,我感觉让主板吃尾气好像也不太好,风道也受阻,想让热量散出去,外壳应该是不好设计了。

和散热片一起,我买了另一款风扇。这款风扇上进风,左右出风的。这样的话,把风扇放中间,散热片和主板在两侧,能左右兼顾。

LumiDock Flex with 4 cm Fan

效果确实好,风扇自带散热片,直接放在 LED 灯板上,散热效果就很好了。 0.18 W 的功率,就能让温度传感器维持在 46℃ 左右。这让我不由地想将 LED 灯板的功率翻倍试试了!

现在感觉给主板吹到风好像很有必要,毕竟温度传感器都在主板上,我的目的也是让设备整体温度控制在 50 ℃ 内,电池待机温度 40 ℃ 内。所以我想试下换回之前的鼓风机,将电压调到 4.2 V 看看。4.2 V 是这路供电的最大电压了,我没计划去改这个硬件。

LumiDock-Flex-with-blower-mode-2

改到这个方向后,温度维持在 50.5 ℃ 左右,亮度被控制在 95% 左右。这是没插电池,鼓风机全速是在 3.5 V 电压的条件下测得的。现在我把电池插上,供电来到 4.2 V,噪音变得很明显了,温度维持在 50 ℃ 内,亮度没有降低。虽然能用了,但是效果确实远不及那个 4 cm 的风扇。毕竟那个 4 cm 的风扇比这个 3.5 cm 的鼓风机在长宽高都多了一些,优势还是挺明显的。可惜便宜货,没有动平衡。不过这 4 cm 风扇低转速能压得住,抖动还不算无法接受。

最后模拟了下外壳,最后这个方案确实是积热严重,温度立马就上去了。看来必须得用 4 cm 的风扇居中放直的方案了。

所以我又斥资买了个再薄一点的 4 cm 自带散热片的风扇。请看图:

4cm x 1.2cm 风扇带散热片

之前那款 1.5cm 厚的风扇是高转速版的。这个风扇转速比 1.5 cm 的慢了不少,但是功率相当时,抖动和噪音明显小很多。话不多说,去掉背胶摆上试试。

安装 4cm x 1.2cm 风扇测试

同样调整到 0.18 W 的风扇功率,温度传感器检测到的温度最后稳定在 46 ℃ 左右。表现还挺理想的,不比 1.5 cm 厚的那款差。看来可以确定用这个了。这个风扇价格 8.2 元包邮,1.5 cm 的那款 7.5 元 + 2 元邮费。另外这款散热片是银色的,我觉得比黑的更适合这个项目,嘿嘿。

固件设计

初始化流程

  • 配置 PMIC 输入过压保护为 12V
  • 配置 PD Sink 输入期望 12V
  • 设置温度传感器保护逻辑
  • 初始化屏幕
  • 初始化按键操作

配置 PMIC

我用 Rust 语言为 SGM41511 开发了一个驱动,Git Repo

由于 MCU 是由 PMIC 供电,为了避免触发保护动作导致掉电,得先将 PMIC 的过压保护从默认的 5V 调整到 12V。

风扇调速和转速检测

硬件上,选用了价格相对较低的三线无刷风扇,只有电源正、负线和测速线,所以调速需要通过 PWM 模拟。

3-pin-blower-fan

软件实现

选择的 MCU 是 STM32G031G8 或 STM32G071GB,使用 embassy-stm32 作为 HAL。

因为最后决定不使用屏幕,所以使用了 STM32G031GBU6

风扇调速和转速检测(软件)

第一版设计上使用 TIM2 的 1、2 通道来实现转速检测,3 通道实现风扇调速。但是不知道是 MCU 的限制还是 embassy-stm32 的限制,无法同时工作。所以:

  • 第二版把分到两个定时器上

第二版的硬件已经实现了速度读取和调速功能。但是,调速状态下读的速度不准确,目前是低侧 PWM 调速,或许换成高侧 PWM 调速能正常,这个以后有机会再验证了。因为风扇要换成两线的了。

未触发高电压的 USB 供电会导致灯光闪烁

当使用 16 颗 0.5W 的 LED 时,由于整机满载照明部分需要消耗 20W 的功率,同时电池充电消耗 5W 功率。不考虑不支持快充的电源,一般的快充电源在 5V 的输出功率只有 15 ~ 18 W。所以在本机的硬件层面限制了 LED 驱动电路的电源输入,不超过 3.2 A。即使这样,LED 驱动电路还是会因为无法吸取到更多电流,导致闪烁。

更要命的是,一但出现这种闪烁,即使后续协商到了高电压,还是会因为反复触发了本机的过流保护,导致几乎无法恢复到正常状态。我尝试堆叠了一些电容到 LED 驱动电路的电源输入,也无法有效缓解这种情况。6

所以在软件层面,加快了 PD 握手状态的检测,并限制了 VBUS 电压低于 8 V 时的亮度,以缓解这种情况,不有希望从这种情况中恢复到正常状态。

外壳模型

外壳存在的问题

PCB 按钮凸出的安装导轨

由于外壳比较厚,不容易形变,并且比以前设计的模型都深,导致 PCB 按钮的凸出不容易安装到预定位置。后续得考虑在外壳上给每个按钮挖一个 1mm 的安装轨道。

嵌入螺母与模型咬合不力

不知道是不是我嵌螺母的技术不行,目前的模型预留的孔看起来很理想,但是螺母进去后,受不住比较大的扭矩,会打滑。或许应该再减小一些预留的孔的大小。

目前买个瓶胶水拯救了一下,不会打滑了。