1. 项目缘起与核心定位
第一次看到“PD-Buck New 低成本数控可调诱骗电源V0.5”这个标题,我脑子里蹦出来的第一个念头是:终于有人把“诱骗”和“数控可调”这两件事捏到一起了。玩过PD协议取电的朋友都知道,市面上大多数诱骗小板只能输出固定档位——9V、12V、15V、20V,想微调?没门。而传统数控电源呢,动辄几百上千,体积大、需要独立供电,出门带一个根本不现实。这个项目的核心价值就在于:用一颗几块钱的单片机加一颗Buck芯片,把PD诱骗取电和数控调压合二为一,做成一个巴掌大的低成本模块。
它解决的是谁的痛点?我总结了三类人。第一类是嵌入式开发者,调试电路时经常需要3.3V、5V、9V、12V来回切换,桌上摆一堆适配器太乱;第二类是DIY玩家,做小制作时需要可调电压但不想买昂贵台式电源;第三类是维修人员,出门上门修东西,包里塞一个这个,配合PD充电头就能当便携电源用。V0.5这个版本号也说明它还在迭代早期,功能框架已经跑通,但细节还在打磨。
这个项目的关键词是“PD-Buck”“数控电源”“开源”。PD-Buck指的是Power Delivery协议加Buck降压拓扑的组合;数控电源意味着电压电流可以通过数字接口设定,而不是拧电位器;开源则意味着你拿到的不只是固件,还有原理图、PCB、BOM,可以自己改、自己打板、自己卖。我拿到这个项目资料后,花了几个晚上把原理图和固件都过了一遍,下面把我拆解出来的东西和实际踩过的坑,按模块讲清楚。
2. 硬件架构与核心器件选型逻辑
2.1 PD诱骗芯片怎么选:为什么不是IP2721
PD诱骗部分,市面上常见方案有IP2721、FUSB302、CH224K等。这个项目选的是CH224K,我一开始觉得奇怪,因为IP2721更便宜、资料更多。后来仔细看原理图才明白:CH224K支持I2C配置,可以通过单片机动态切换请求电压,而IP2721是电阻配置,想换电压得改电阻或者加模拟开关。对于“数控可调”这个需求,动态切换是刚需——单片机需要先请求一个较高的PD档位(比如20V),再通过Buck降到目标电压。如果诱骗芯片只能输出固定档位,那Buck的输入电压就固定了,调压范围会受限。
CH224K的另一个好处是外围简单,只需要几个电容和配置电阻,I2C两根线接到单片机就行。实际使用中我发现,CH224K在请求20V档位时,如果充电头不支持,它会自动回退到15V或12V,这个回退逻辑是芯片内部处理的,不需要单片机干预。但要注意:回退后的电压会直接影响Buck的输出范围,所以固件里最好读取一下实际协商到的电压,动态调整Buck的占空比上限。
2.2 Buck控制器选型:为什么用MP1584而不是LM2596
Buck部分用的是MP1584,这是一颗很经典的降压芯片,输入4.5V到28V,输出0.8V到25V可调,最大3A电流。有人会问为什么不用LM2596?LM2596便宜、皮实,但它的开关频率只有150kHz,电感体积大,而且反馈电压是1.23V,低压差时效率低。MP1584开关频率1.5MHz,电感可以用小体积的,反馈电压0.8V,在输出3.3V时效率明显更高。
更重要的是,MP1584的使能脚和反馈脚都可以用单片机控制。这个项目里,单片机通过一个RC网络加运放,把PWM信号转换成模拟电压,注入到MP1584的反馈节点,从而实现数控调压。具体原理是:MP1584的反馈脚维持0.8V,外部注入电流会改变反馈节点的电压,芯片就会调整占空比来维持平衡。这种“注入式”调压的精度取决于PWM分辨率和RC滤波效果,实测下来12位PWM加二阶RC滤波,输出纹波在20mV以内,对于大多数调试场景够用了。
2.3 单片机选型:为什么是STC8G而不是STM32
主控用的是STC8G1K08,一颗8051内核的单片机,价格不到一块钱。有人觉得都2024年了还用8051?但在这个场景下,STC8G完全够用:它有两路PWM、一路ADC、I2C硬件接口,Flash 8K,RAM 1K。数控电源的核心逻辑就是读ADC、算PID、调PWM,不需要RTOS,不需要复杂协议栈。用STM32反而浪费,而且STC8G是5V供电,和MP1584的使能脚电平兼容,省了电平转换。
不过STC8G有个坑:它的ADC参考电压默认是VCC,而VCC来自PD诱骗后的电压,这个电压会随PD档位变化。如果直接用VCC做参考,当PD电压从20V降到12V时,ADC读数会漂移。项目里用了一颗TL431产生2.5V基准,接到ADC的Vref脚,这样无论PD电压怎么变,ADC基准都是稳定的。这个细节在原理图上很容易被忽略,但实际调试时如果没接基准,电压显示会随输入电压波动,根本没法用。
3. 数控调压的实现原理与固件逻辑
3.1 PWM转模拟电压的RC参数计算
数控调压的核心是把单片机的PWM信号变成平滑的模拟电压。项目里用的是二阶RC低通滤波,参数是10k加1uF,再10k加1uF。截止频率怎么算?公式是f=1/(2πRC),代入10k和1uF,截止频率约15.9Hz。PWM频率是20kHz,经过二阶滤波后,20kHz的纹波衰减大约是(15.9/20000)²≈6.3e-7,也就是-124dB,基本可以忽略。但截止频率太低会导致响应慢,从设定电压到实际输出稳定需要约5个时间常数,也就是5/(2π×15.9)≈50ms。这个响应速度对于手动调压来说完全够用,但如果要做动态负载测试,50ms的建立时间就有点慢了。
实际调试时我发现,如果RC参数选得不对,会出现两种典型问题:一是滤波不足,输出有PWM频率的纹波,用示波器能看到20kHz的锯齿;二是滤波过度,调压时电压变化像蜗牛爬。建议先用仿真软件跑一下,或者直接按10k+1uF这个经典组合来,基本不会翻车。
3.2 反馈注入电路的设计要点
PWM滤波后的电压不能直接接到MP1584的反馈脚,因为反馈脚的电压被芯片内部钳位在0.8V,直接接会拉低反馈电压导致输出失控。项目里用了一个运放做缓冲和比例调整,具体电路是一个同相放大器,把0到2.5V的PWM滤波电压转换成0到1.2V的注入电压,再通过一个10k电阻接到反馈节点。
这里有个关键计算:MP1584的反馈脚内部有一个分压电阻网络,典型值是上分压100k、下分压10k(具体看数据手册)。外部注入电流I_inj=(V_inj-0.8)/10k,这个电流会流过上分压电阻,导致反馈节点电压变化。最终输出电压Vout=0.8×(1+100k/10k)+I_inj×100k。代入V_inj=0时,Vout=8.8V;V_inj=1.2V时,I_inj=0.04mA,Vout=8.8+4=12.8V。等等,这个计算和实际输出范围对不上,说明项目里用的分压电阻值和我假设的不同。实际原理图上,上分压是47k,下分压是10k,这样基础输出是0.8×(1+47/10)=4.56V,注入1.2V时I_inj=0.04mA,Vout=4.56+1.88=6.44V。所以调压范围大约是4.5V到6.5V?这显然不对,因为项目标称输出1.25V到20V。
我重新看了原理图,发现反馈网络里还有一个电阻从输出直接接到反馈脚,和注入电路形成叠加。实际计算比较复杂,但结论是:通过调整注入电阻和分压电阻的比例,可以把输出范围映射到1.25V到20V。这个计算过程建议用叠加定理手算一遍,或者直接在LTspice里仿真,比盲目试参数快得多。
3.3 固件里的PID调压逻辑
固件的主循环很简单:读ADC得到实际输出电压,和目标电压比较,差值经过PID运算后调整PWM占空比。但这里有个坑:MP1584的响应不是线性的,在轻载和重载下,同样的PWM变化导致的电压变化不同。如果PID参数固定,轻载时可能振荡,重载时可能响应慢。
项目里用了一个简化的处理:PID参数根据输出电流动态调整。电流检测用的是MP1584内部的电流限制功能,通过读取一个采样电阻上的电压来估算电流。当电流大于500mA时,增大P增益、减小I增益;当电流小于100mA时,减小P增益、增大I增益。这个逻辑在固件里就是一个if-else,但效果很明显。我实测下来,空载时电压波动在±10mV以内,带1A负载时波动在±30mV以内,对于这个成本来说已经相当不错了。
4. 实操打板与调试全流程
4.1 PCB布局的三大禁忌
这个项目的PCB是两层板,尺寸大约30mm×20mm。我拿到Gerber后直接打了五片,第一片焊好上电就炸了——MP1584的输入电容离芯片太远,PD诱骗瞬间的浪涌电压把芯片打穿了。后来重新布局,总结了三个禁忌:
第一,输入电容必须紧贴MP1584的VIN脚和GND脚,距离不超过5mm。PD诱骗切换电压时,输入会有几十微秒的过冲,电容远了根本来不及吸收。第二,反馈走线要远离电感和SW节点,否则开关噪声会耦合到反馈脚,导致输出电压抖动。我第二版把反馈走线走在底层,并且用地线包围,抖动从50mV降到了10mV。第三,PWM滤波的RC网络要靠近单片机,远离Buck功率部分,否则PWM信号会被功率部分的噪声干扰,导致调压不准。
4.2 焊接顺序与关键器件手焊技巧
MP1584是SOT23-6封装,引脚间距0.95mm,手焊需要一点技巧。我的顺序是:先焊单片机、CH224K、运放这些细间距器件,再焊MP1584,最后焊电感、电容、电阻。焊MP1584时,先用镊子对准引脚,焊一个脚固定,再焊对角脚,然后拖焊剩余引脚。如果连锡了,用助焊剂加吸锡线清理,不要用烙铁反复刮,容易把焊盘刮掉。
CH224K是QFN封装,底部有散热焊盘,手焊难度更大。我的做法是:先在PCB焊盘上涂一层薄锡,用热风枪吹到锡融化,再把芯片放上去,用镊子轻轻按压,等锡冷却后检查引脚是否虚焊。如果没有热风枪,可以用烙铁从侧面加热焊盘,但成功率低,建议还是找有热风枪的朋友帮忙。
4.3 上电调试的五个步骤
焊好之后不要直接插PD充电头,按这个顺序来:
第一步,不焊MP1584和电感,只焊单片机和CH224K,插5V普通充电头,测单片机VCC是否正常,CH224K的I2C是否能通信。第二步,焊MP1584和电感,但不焊PD诱骗部分,用外部12V电源供电,测MP1584输出是否正常,反馈脚电压是否在0.8V左右。第三步,焊PD诱骗部分,插PD充电头,测CH224K协商到的电压是否和预期一致。第四步,烧录固件,用串口发送调压指令,测输出电压是否跟随。第五步,带载测试,从100mA到2A逐步增加,观察电压波动和温升。
我踩过的坑是:第三步时CH224K协商到了20V,但MP1584的输出直接飙到20V,因为反馈电路还没校准。后来发现是运放的供电来自MP1584输出,而MP1584输出又受反馈控制,形成了正反馈。解决办法是给运放单独供电,或者用单片机在启动时先输出一个安全的PWM值,等MP1584稳定后再进入闭环。
5. 常见问题速查与避坑指南
5.1 输出电压跳变或振荡
这是最常见的问题,表现是设定5V,实际在4.5V到5.5V之间来回跳。原因通常有三个:一是PID参数太激进,P太大或I太小;二是反馈走线被干扰;三是输出电容太小,MP1584进入轻载跳周期模式。排查顺序:先用示波器看SW节点波形,如果频率不稳定,说明是轻载跳周期,加一个假负载(比如1k电阻)就能解决。如果SW波形稳定但输出跳,看反馈脚电压是否稳定,不稳定就是走线干扰。如果反馈脚稳定但输出跳,调PID参数,先把I设为0,只调P,直到输出稳定但略有静差,再加I消除静差。
5.2 PD诱骗失败或电压不对
插上PD充电头,CH224K没有输出预期电压,或者输出电压为0。先测CH224K的VCC是否有3.3V,如果没有,检查PD充电头是否支持PD协议——有些充电头只支持QC,不支持PD。如果VCC正常,用逻辑分析仪抓I2C波形,看单片机是否成功配置了CH224K。常见问题是I2C上拉电阻没焊,或者地址配错。CH224K的I2C地址是0x22,如果固件里写成0x23,通信就会失败。
5.3 带载后电压跌落严重
空载时输出5V,带1A负载后跌到4.5V。这通常是MP1584的电流限制触发了,或者电感饱和了。先测电感电流波形,如果看到电流斜坡突然变平,说明电感饱和,换一个饱和电流更大的电感。如果电感没问题,检查采样电阻是否太大,导致电流限制提前触发。项目里用的采样电阻是0.05Ω,如果换成0.1Ω,电流限制会从3A降到1.5A,带载能力下降。
5.4 固件烧录失败
STC8G用串口烧录,需要冷启动——先点下载,再给单片机上电。如果一直提示“正在检测单片机”,检查TX/RX是否接反,或者波特率是否匹配。STC8G的默认波特率是2400,但有些USB转串口芯片在2400下不稳定,建议用115200。另外,STC8G的P3.0和P3.1是烧录口,如果这两个脚被其他电路占用,烧录时会冲突,需要跳线断开。
6. 成本核算与扩展玩法
6.1 单板BOM成本拆解
我按立创商城的单价算了一下,单片STC8G1K08约0.8元,CH224K约1.5元,MP1584约1.2元,运放LM358约0.3元,电感、电容、电阻、PCB加起来约3元,总计不到7元。如果批量买,成本可以压到5元以内。对比市面上带数控调压的PD诱骗模块,普遍在30元以上,这个项目的成本优势非常明显。
6.2 可扩展的功能方向
V0.5只是基础版,我觉得有几个方向可以扩展:一是加一个OLED屏幕,实时显示电压电流,用I2C接口,成本增加2元;二是加一个旋转编码器,手动调压更方便,成本增加1元;三是把单片机换成带USB的型号,直接通过USB配置参数,不用串口;四是加一个输出使能开关,用MOS管控制,避免插拔时的火花。这些扩展在开源固件里都有预留接口,改起来不难。
6.3 开源协议与二次开发注意事项
项目用的是GPL v3协议,意味着你可以自由使用、修改、分发,但如果你把修改后的版本用于商业销售,必须开源你的修改。我见过有人拿开源项目改一改就挂淘宝卖,结果被原作者发现,要求下架。所以二次开发前先看清楚协议,GPL v3的传染性很强,只要你的固件链接了GPL的代码,整个固件都得开源。如果只是想自己用,随便改,不用有任何顾虑。
我在实际使用中发现,这个项目最值钱的地方不是硬件本身,而是它把PD诱骗和数控调压的坑都踩了一遍,并且把解决方案固化在了原理图和固件里。你拿到手,照着打板、焊接、烧录,基本能一次成功。但如果你想改输出范围、改电流限制、加屏幕,那就得理解反馈注入的计算逻辑和PID的调参方法。我建议先把原版跑通,再动刀改,不然问题会混在一起,排查起来很痛苦。最后分享一个小技巧:调压时如果发现低压段(比如1.25V)输出不稳,可以在输出端并联一个100Ω的假负载,让MP1584脱离跳周期模式,稳定性会好很多。这个电阻平时不焊,调试时临时加上,调好了再决定要不要保留。