· 20 min read
LumiDock Flex 开发笔记
记录一下我开发 LumiDock Flex 的过程。
功能需求
我需要一个台灯来帮助我照亮工作台,改善我焊接和调试硬件电路时的照明效果。目前我使用了之前开发的便携灯夹在支架上来照明,固定方式不太好。再加上便携灯在 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 内建了电源路径管理,但是他的输出电压 并没有直通输入 的能力,电流会由 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 驱动输入过流保护:
LED 驱动电路
LED 驱动电路之前验证过好多次了,最后还是有一个问题悬而未决,在某些情况,大概是输入电流限流了并且温度偏高时,高占空比的情况下 LED 会异常闪烁。我没啥时间研究电路,所以没独立出验证电路来测试,目前方案也是换了芯片后比较稳定可用的,但是似乎不能完全杜绝这个问题。或许是做了温控逻辑,现在没再遇到类似问题了。
这次继续使用之前的 LED 驱动电路,每路使用两个并联的 LED 限流电阻,用来适应 1 并和 2 并模式。限流电阻改用高精度低温漂的电阻。
主控芯片 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 读取和请求其他电压和电流。
不连接 ,电流 3.25A, 接地,电压 5V。GATE 脚主要是用来连接 PMOS 管的栅极,在电源未就绪时断开后级。当前项目不在意供电协商是否成功,所以悬空 GATE 引脚。
PMIC
PMIC 我找了很久,一直没找到理想的那种,放电时能不主动升压。或许我应该只找锂电池充电管理芯片,毕竟我已经准备使用外部的电源路径管理芯片了。不过最后我还是找到了一款参数比较匹配的芯片,SGM41511。
SGM41511 具有高输入电压能力和窄电压直流(NVDC)电源路径管理的I2C控制3A单节电池充电器。在这里,它将被用来为锂电池充电,并在锂电池放电电压不足时,升压到 3.3V 左右,以维持为其他芯片供电的 LDO 正常工作。
通过控制 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 提供了过压保护和过流功能,本着不用浪费的原则,也配置了一下,如下图所示, 大概在 1.05V 左右。 ![[。/assets/tps2121-vref.png]]
配置电阻可以使用 PMUX Switchover Calculator.xlsx 计算。 ![[assets/pmux-calc.png]] 根据我手上有的电阻,我选择了上图所示的电阻配置。PRI 和 CP2 直接接地,可以实现高电压电源优先供电,正好对应有外部供电时, 最低电压 5V,高于 最高电压 4.6V。
根据 TPS2121 手册建议,在 LumiDock Flex 主控板 v2 中,增加了两路输入的 TVS,用来在切换输入时防止冲击造成的影响。
主动散热
经过验证,这个风扇加了 散热片的情况下,很勉强能吃得下 8 W 的 LED 功耗,或许再增加散热片规模就能刚好吃得下 LED 的功耗了。但是有一个问题,驱动电路的温度散不掉,即使在主板和 LED 灯之间贴导热硅胶片也没有帮助。
使用上图的布局,散热片放鼓风机出风口,并且用胶带将风全部导流到散热片上。目前是三条胶带依次从鼓风机贴到另一端的,效果也是越来越好,不过最后还是只能让温度传感器温度维持在 52 °C 内,亮度也被温控策略压在 92% 左右。
当前这个布局就比较尴尬,鼓风机所在的位置才更应该放散热片。或许从另一头往主板反向吹能改善这个问题,但是这个风扇线没那么长,我就没测了。另外,我感觉让主板吃尾气好像也不太好,风道也受阻,想让热量散出去,外壳应该是不好设计了。
和散热片一起,我买了另一款风扇。这款风扇上进风,左右出风的。这样的话,把风扇放中间,散热片和主板在两侧,能左右兼顾。
效果确实好,风扇自带散热片,直接放在 LED 灯板上,散热效果就很好了。 0.18 W 的功率,就能让温度传感器维持在 46℃ 左右。这让我不由地想将 LED 灯板的功率翻倍试试了!
现在感觉给主板吹到风好像很有必要,毕竟温度传感器都在主板上,我的目的也是让设备整体温度控制在 50 ℃ 内,电池待机温度 40 ℃ 内。所以我想试下换回之前的鼓风机,将电压调到 4.2 V 看看。4.2 V 是这路供电的最大电压了,我没计划去改这个硬件。
改到这个方向后,温度维持在 50.5 ℃ 左右,亮度被控制在 95% 左右。这是没插电池,鼓风机全速是在 3.5 V 电压的条件下测得的。现在我把电池插上,供电来到 4.2 V,噪音变得很明显了,温度维持在 50 ℃ 内,亮度没有降低。虽然能用了,但是效果确实远不及那个 4 cm 的风扇。毕竟那个 4 cm 的风扇比这个 3.5 cm 的鼓风机在长宽高都多了一些,优势还是挺明显的。可惜便宜货,没有动平衡。不过这 4 cm 风扇低转速能压得住,抖动还不算无法接受。
最后模拟了下外壳,最后这个方案确实是积热严重,温度立马就上去了。看来必须得用 4 cm 的风扇居中放直的方案了。
所以我又斥资买了个再薄一点的 4 cm 自带散热片的风扇。请看图:
之前那款 1.5cm 厚的风扇是高转速版的。这个风扇转速比 1.5 cm 的慢了不少,但是功率相当时,抖动和噪音明显小很多。话不多说,去掉背胶摆上试试。
同样调整到 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 模拟。
软件实现
选择的 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 的安装轨道。
嵌入螺母与模型咬合不力
不知道是不是我嵌螺母的技术不行,目前的模型预留的孔看起来很理想,但是螺母进去后,受不住比较大的扭矩,会打滑。或许应该再减小一些预留的孔的大小。
目前买个瓶胶水拯救了一下,不会打滑了。