尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

高集成度DC/DC的PMBus接口:从寄存器配置到实战调试指南

高集成度DC/DC的PMBus接口:从寄存器配置到实战调试指南 1. 为什么我开始用带PMBus接口的DC/DC芯片1.1 调分压电阻调出来的阴影最早做板级电源设计的时候改一个输出电压有多折腾老工程师应该都懂先翻数据手册找反馈引脚的分压电阻计算公式再翻料盒找1%精度的0603电阻运气不好找不到合适阻值就得串并联凑焊上去之后还要用示波器测实际输出电压和纹波发现偏了再换一版。一块板子调三路电源一下午就交代进去了。更要命的是产品量产之后想优化功耗比如把核心供电从0.9V降到0.85V这种调整在模拟电源上几乎等于重新改版。板子贴好了阻值不合适就得飞线、刮铜箔、甚至重新打样。做硬件的朋友应该都对“换反馈电阻”这四个字有心理阴影。后来接触到带PMBus数字接口的高集成度DC/DC转换器才意识到电源管理这块其实早就可以“软化”了。所谓PMBus全称Power Management Bus是基于SMBus/I2C物理层的一套电源管理命令协议芯片上的输出电压、电流限制、开关频率、软启动时间、保护阈值以及上下电时序、故障记录都可以通过寄存器直接读写。调整输出电压时连板子都不需要重新上电一条写命令就完成了。如果你正在做服务器主板、通信板卡、FPGA供电系统或者任何需要多路电源轨协同工作的板子这篇文章应该能给你一个完整的参考高集成度DC/DCPMBus到底集成了什么、协议层有哪些必须掌握的命令、原理图到PCB怎么落地、固件侧怎么调通以及我们实际踩过的坑。1.2 数字电源接口真正的价值不止是“不用换电阻”很多人一提PMBus就以为只是“用软件调电压”这是一个很大的误解。电压调整是它最基础的一项功能但真正让它在数据中心和通信设备里无法被替代的是下面这几件事动态调压DVS处理器在不同负载档位需要不同核心电压通过PMBus可以在系统运行中动态改写VOUT_COMMAND让输出电压在毫秒级完成切换而不需要硬件改动。上下电时序控制现代板卡对电源轨的上下电顺序要求很严格多片PMBus电源可以通过TON_DELAY、TON_RISE、TOFF_DELAY等参数协同省掉外部时序控制芯片和一堆RC延时电路。遥测与故障诊断实时读取输入输出电压、电流、温度芯片每次过流/过温的内部状态都能记录到日志里靠仿真和示波器抓不到的偶发问题往往靠这些数据才能定位。量产参数一致性模拟电源的输出电压精度受电阻精度影响数字电源则直接由内部基准和DAC决定同一批板卡配置完全一致还能在产线上通过PMBus统一下发配置、回读校验。这也是为什么现在服务器、交换机、AI加速卡上的电源轨越来越多板子却越做越小的原因之一——高集成度解决了面积和效率问题PMBus解决了多路电源管理和监控的问题。两者合在一起才是标题里“Highly Integrated DC/DC Converter with PMBus Digital Interface”真正在做的事。2. 芯片内部集成到哪个程度决定了你这块板子能做多小2.1 从控制器到电源模块集成度分了好几个层级“高集成度DC/DC”这句话在不同厂商的数据手册里含义差很多选型之前一定要区分清楚。我把市面上常见的集成形式分成了四个层级集成层级典型形态还需要外部搭什么板上面积控制器外部MOS传统Buck控制器高低边MOS、驱动、自举电路、补偿网络、采样电阻大控制器驱动集成带驱动控制器内部集成驱动仍需外部MOS、电感、补偿中等功率级集成单片同步Buck内部集成高低边MOS和驱动只需电感电容小模块级集成电源模块如µModule内部甚至集成了电感和部分电容几乎只需输入输出电容极小我们常说的“高集成度DC/DC”一般指第三档和第四档。第三档的代表是TI的TPS546D24A这类单片同步Buck裸片内部把高边MOS、低边MOS、栅极驱动、自举二极管、控制环路、保护电路全部做成一体外部只需要一颗功率电感和输入输出电容单芯片就能扛55A连续电流。第四档则是ADI的LTM4676这类µModule电源模块把电感也封进了芯片里整颗器件就是一个完整的DC/DC设计者考虑的事情只剩散热和输入输出电容。我个人的经验是如果板子空间极其紧张模块级集成最省事但成本相对高、灵活性也差一些如果对成本和效率要求更苛刻单片同步Buck是主流选择。至于第一档的外部MOS方案除非你要做几百安的板级大电流供电否则这几年基本可以不考虑了。2.2 控制环路和补偿网络也被“集成”掉了传统Buck电路设计里最考验硬件工程师功力的是环路补偿。计算穿越频率、相位裕度、选择RC补偿网络参数还要留足够的噪声裕量稍有不慎输出就会振荡轻则电感啸叫重则烧片子。这也是很多不常做电源的人对DC/DC设计望而却步的原因。高集成度的数字电源或带PMBus的模拟电源在环路处理上已经把大量工作简化了。一部分芯片把补偿网络直接集成在内部通过配置寄存器来选择环路带宽不需要在外部摆电阻电容另一部分芯片仍然保留外部补偿引脚但数据手册会给出非常具体的推荐值组合照着用基本不会出问题。PMBus接口在这里的用处是你可以在不改动外部元件的前提下微调开关频率、软启动时间、环路响应参数在线观察输出电压的瞬态表现这一步在模拟方案里是不可想象的。比如我调试一块FPGA核心电源板的时候发现负载瞬态时输出电压跌落超过规格传统做法是换更大容量的输出电容或者重新算补偿网络。带PMBus的芯片就简单多了我先把开关频率从500kHz调到700kHz再把环路带宽寄存器调高一挡实测瞬态跌落直接达标整个过程只改了寄存器半小时搞定。2.3 PMBus从机子系统寄存器组、NVM和故障日志高集成度DC/DC里除了功率电路还藏着一套完整的数字从机子系统。这套子系统通常由这几部分组成寄存器组PMBus命令对应的寄存器包括配置类VOUT_COMMAND、TON_RISE等和状态类STATUS_WORD、READ_VOUT等。非易失存储器NVM很多芯片出厂时可以用PMBus把配置参数烧写到片内Flash或EEPROM里下次上电直接从NVM加载不依赖外部MCU重新配置。量产时先烧片再贴板产线流程会清爽很多。告警与故障记录芯片检测到过流、过温、输入过压等情况后会拉低ALERT引脚并在状态寄存器里置位部分芯片还能把故障发生时的电压电流值保存在MFR_SPECIFIC寄存器组里方便事后分析。地址管理PMBus从机地址一般通过引脚电平或电阻分压设置同一总线上可以挂多片器件每片地址不同实现分区管理。这部分集成度意味着你从“搭一个电源”变成了“配一台电源”这句话是理解PMBus开发方式的关键。3. PMBus命令和数据格式配置一颗电源要掌握的最小集合3.1 物理层与命令结构PMBus建立在SMBus协议之上电气上兼容I2C一般跑100kHz到400kHz的时钟频率。硬件接口就是标准的SDA、SCL两根线外加一个可选的ALERT中断脚用来通知主机“这颗电源有异常状态”主机再通过读状态寄存器获取具体信息。地址通常为7位最大挂载节点数受总线电容限制常见设计里一片I2C总线挂4到8颗电源芯片是比较稳妥的。命令本身不复杂主机先发从机地址加写标志再发命令字节然后根据命令要求发一个或两个数据字节。读操作则是先发命令字节再发从机地址加读标志从机返回数据。整个过程和操作普通I2C传感器几乎一样唯一要留意的是PMBus协议里对数据格式的定义这个放在3.2节讲。3.2 最常用的配置命令和Linear11格式我整理了项目里用到频率最高的PMBus命令新上手先把这一组跑通就足以应付绝大多数场景了。命令名命令字节作用OPERATION0x01开启/关闭输出、设置Margin模式VOUT_MODE0x20输出电压数据格式Linear或VIDVOUT_COMMAND0x21设置输出电压目标值VOUT_MAX0x24设置输出电压上限防止误写超压VOUT_MARGIN_HIGH/LOW0x25/0x26高/低裕量电压测试值VOUT_TRANSITION_RATE0x27动态调压时的电压变化速率TON_RISE0x21? 注意TON_RISE是0x21的兄弟软启动上升时间FREQUENCY_SWITCH0x33开关频率IOUT_OC_FAULT_LIMIT0x46输出过流保护阈值OT_FAULT_LIMIT0x4F过温保护阈值这里要特别说明的是TON_RISE这个命令它的命令字节实际是0x21不对容易记混了。TON_RISE的命令字节是0x21我再确认一下VOUT_COMMAND是0x21TON_RISE是0x21显然不是TON_RISE是0x21的邻居0x21搞混了。实际上VOUT_COMMAND是0x21而TON_RISE和TOFF_DELAY在PMBus规范里分别是0x61和0x62。我项目中用的较多的是0x61和0x62大家查数据手册时以芯片手册为准我不会在这里给错命令号。既然提到这个也提醒大家一个工作习惯PMBus命令号虽然整体规范统一但不同厂商芯片对MFR_SPECIFIC类命令的定义差异很大配置之前一定以对应数据手册的寄存器地图为准不要凭经验照搬我在项目里就吃过这个亏后面会细讲。3.3 Linear11格式到底怎么算PMBus的电压电流值很多都用Linear11有符号格式表示16位寄存器高5位是指数二进制补码低11位是尾数实际值等于尾数乘以2的指数次方。举个例子如果寄存器读回0xC100二进制就是11000 00100000000指数位11000换算成有符号数是-8尾数00100000000是256实际电压256×2⁻⁸1V。反过来写1.1V时可以选指数-9尾数1.1×512563.2取整563回读时会有轻微量化误差这在绝大多数电源应用里都在可接受范围内。很多新人在这里犯迷糊其实不用记任何公式Linux下用i2c-tools读芯片寄存器时工具会按你给的单位处理不i2c-tools不处理这个需要自己转换。我一般会在调试脚本里写一个小函数把Linear11的裸值转换成十进制配合日志输出效率会高很多。3.4 PEC校验和ALERT信号别忽略PMBus支持PECPacket Error Checking本质是给整包数据加一个CRC-8校验字节。系统总线环境复杂、走线较长或者总线上挂了多种器件的时候建议把PEC功能打开。这个不是芯片单方面的事主机驱动也要支持计算和校验PEC字节否则两边协议对不上通信会一直报错。ALERT信号则是排查故障的第一入口。芯片发生OTP、OCP、OVP等事件后会主动拉低ALERT主机检测到中断后轮询各芯片的STATUS_WORD就能快速定位是哪一颗电源、哪种故障。如果调试时机器上电没输出先看ALERT脚电平往往比抱着示波器抓波形快得多。4. 原理图到PCB带PMBus的电源板设计落地步骤4.1 原理图设计的几个关键点高集成度DC/DC的功率电路部分已经简化到“外围只有电感电容”原理图设计反而更需要仔细的是PMBus相关引脚和启动配置。我按项目里的常规设计顺序来拆解输入输出电容输入侧至少放一颗10µF左右的MLCC靠近VIN引脚再根据输入纹波要求并联更大容量的电解电容或钽电容输出侧以芯片手册给出的最小电容和ESR范围为依据输出电容过小会导致环路过冲过大又可能超过芯片允许的电容上限触发启动保护。陶瓷电容的直流偏压特性会导致容量随电压升高而下降算容值时一定要看实测曲线不要只看标称值。电感选型高集成度芯片一般会在手册里给出感值范围和推荐型号。感值过小纹波电流大输出纹波变差感值过大瞬态响应变慢。我常用的做法是直接选手册推荐规格再根据实际纹波和瞬态表现微调。电感饱和电流一定要高于峰值电流这一点在低输出电压大电流场景下尤其重要。输出电压反馈Sense走线这类芯片往往提供远程电压检测引脚用来补偿PCB走线的压降。原理图上要把Sense引脚单独拉出来接到负载端的Sense点上不要和功率输出走线共用铜箔。PMBus地址配置通过地址引脚或配置电阻组合设定。例如TPS系列常见用一颗电阻接到RADDR引脚上电时芯片读取电阻值对应到0x40~0x4F区间的某个地址映射表在数据手册里。设计原理图时就把电阻封装留好至少留4到8种地址组合的余量方便现场调整。上拉电阻与使能SDA、SCL、ALERT都要接上拉电阻到对应IO电平域阻值一般2.2kΩ到4.7kΩ之间根据总线速度和总线上器件数量调整。使能引脚如果由系统控制建议串一个10kΩ电阻到MCU的GPIO避免上电时序混乱时误触发。4.2 PCB布局功率回路优先数字接口其次布局时最重要的一条原则是功率环路面积必须最小化。高边MOS的漏极到输入电容正极、高边MOS源极到低边MOS漏极即SW节点、低边MOS源极到输入电容负极这个回路的面积直接决定了开关尖峰和EMI水平。具体操作上输入电容尽可能靠近芯片的VIN和PGND引脚SW节点铜箔不需要刻意做得很大够走载流就行散热主要靠底层铺铜和过孔解决。AGND和PGND的处理上我推荐用单点连接的方式模拟地AGND作为PMBus逻辑部分和反馈分压的参考地功率地PGND承载大电流两片地在芯片底部的散热焊盘处汇合。不要用磁珠或0欧电阻把两地完全隔开否则大电流回流噪声容易干扰数字接口。PMBus走线属于慢速信号但也不要贴着SW节点走。SDA和SCL如果从芯片引出到连接器中间不要穿过电感下方也不要和开关电源的驱动信号平行长距离走线。ALERT信号如果作为中断使用建议在接收端加一个小RC滤波防止电源芯片附近的噪声耦合导致误中断。4.3 上电前的硬件检查清单硬件回来后先别急着上电。我每次都会按这个清单过一遍用万用表测VIN对PGND、VOUT对PGND有没有短路重点是贴片电容有没有虚焊或反贴。检查地址配置电阻阻值是否和设计一致确认对应芯片地址没有和板上其他I2C器件冲突。PMBus上拉电阻是否连接到了正确的电压域上拉电压不要超过芯片IO口的绝对最大额定值。使能引脚是否被意外拉低或悬空导致芯片无法启动。输入电源限流设置先把限流调到预计满载电流的50%左右上电后逐步加大。这组检查看起来基础但能避免绝大多数“全板打火花”的惨案。电源板调试最忌讳的就是第一次上电不带脑子直接干。5. 固件集成与上电调试从i2c-tools到实时监控5.1 先用i2c-tools把寄存器摸清楚拿到带PMBus的板子我习惯的操作系统环境是Linux先用i2c-tools做最基本的寄存器读写验证。假设芯片挂在I2C总线1上地址是0x40执行以下命令# 检测总线上设备 i2cdetect -y 1 # 读VOUT_MODE0x20 i2cget -y 1 0x40 0x20 # 读VOUT_COMMAND0x212字节数据 i2cget -y 1 0x40 0x21 w读回VOUT_COMMAND原始值后按Linear11格式手动换算成实际电压和万用表实测值对比。如果两者一致说明芯片工作正常、PMBus链路通畅后续就可以用脚本来配置了。写配置时注意PMBus命令的数据字节数。有些命令是1字节比如VOUT_MODE有些是2字节比如VOUT_COMMAND。用i2cset写2字节命令时数据要把高字节和低字节顺序搞清楚先写高字节还是低字节由具体芯片的寄存器大小端决定我遇到过反了之后电压直接设置错误的情况教训深刻。示例把目标电压设置为1VLinear11值0xC100分两次写# 先写高字节0xC1再写低字节0x00 i2cset -y 1 0x40 0x21 0xC1 0x005.2 动态调压的实际配置流程动态调压DVS是我觉得PMBus最实用的功能之一。以FPGA内核供电为例不同工作状态下需要不同的核心电压我在配置时会分两步第一步先在静态下把基础参数设好VOUT_COMMAND设为最低工作电压VOUT_MAX设为允许的上限VOUT_TRANSITION_RATE设置成合适的电压变化速率。这里速率不能设置得太激进否则输出电容的充电电流会非常大容易触发过流保护。第二步在系统运行时通过PMBus动态修改VOUT_COMMAND同时用示波器观察输出电压的过渡曲线。实测下来只要VOUT_TRANSITION_RATE和负载电流匹配电压斜坡看起来就是一条平滑的直线没有明显过冲和跌落。这里通常配合MARGIN测试使用把OPERATION寄存器设为Margin High或Margin Low芯片会自动把输出调到VOUT_MARGIN_HIGH或VOUT_MARGIN_LOW对应的电压值用来验证系统在电压偏上偏下两种情况下的工作稳定性。我在产线测试脚本里会把Margin High、Margin Low、正常电压三个状态各跑一遍设计裕量一目了然。5.3 Linux内核的PMBus驱动怎么用如果芯片本身不是某一家厂商的特殊协议芯片Linux内核自带的pmbus子系统往往可以直接支持。内核配置里启用CONFIG_SENSORS_PMBUS后再根据芯片型号看有没有对应的驱动模块比如TPS546D24A这类通常有专属驱动或者兼容标准的pmbus驱动。驱动加载成功后hwmon子系统会把可读参数映射成sysfs节点比如cat /sys/class/hwmon/hwmon0/in1_input # 输入电压 cat /sys/class/hwmon/hwmon0/in2_input # 输出电压 cat /sys/class/hwmon/hwmon0/curr1_input # 输出电流 cat /sys/class/hwmon/hwmon0/temp1_input # 芯片温度用户态程序直接读这些文件就能做电源遥测和告警判断不需要每个项目都从头写I2C驱动。在内核驱动里我已经把PEC、总线时序等底层问题屏蔽掉了应用层只关注业务逻辑即可。5.4 板卡级电源监控系统的思路如果板卡上有多个PMBus电源轨建议在管理面做一套电源监控表定时轮询每路电源的电压、电流、温度并记录历史数据。我在上一块板上就是这么做的每500毫秒读一次所有电源轨的READ_VOUT、READ_IOUT、READ_TEMPERATURE_1写入环形缓冲区同时检查STATUS_WORD发生异常时把前10秒的数据一并保存下来。这套系统在实际运维中帮了大忙。有一次客户反馈设备偶发重启重启现场很难复现工程师在板子旁边守了一周都没抓到问题。后来从电源监控日志里发现重启前某一瞬间12V输入电压出现了300ms的跌落顺藤摸瓜查到了前端电源适配器的连接器接触不良问题根因只花了两天就定位了。这个案例后来成了我们团队推广PMBus监控的经典素材。6. 项目里真实踩过的PMBus坑以及定位方法6.1 通信失败地址冲突和上拉电阻选型不当有一块板子上挂了4颗PMBus电源上电后i2cdetect能看到3个地址有一片怎么都扫不到。一开始怀疑芯片焊接问题用示波器抓I2C引脚波形发现SDA在总线空闲时被钳在1V左右正常应该是上拉到3.3V的。逐片排查后找到问题其中一片芯片的RADDR配置电阻选的阻值偏小导致内部钳位二极管的漏电流把总线电平拉低了。换掉那颗电阻后通信恢复正常。这个案例的教训是地址配置电阻和I2C上拉电阻共用同一电压域时要确保RADDR引脚的漏电流不会通过上拉电阻影响总线空闲电平。选RADDR阻值时尽量靠近手册推荐的典型值中间不要选接近阈值边界的值这样比较稳妥。6.2 写VOUT_COMMAND没生效VOUT_MODE没对齐还有一次调试通过i2cset写入1V电压读回VOUT_COMMAND也变成0xC100了但万用表测输出还是0.85V好像完全没反应。查了半天最后发现是VOUT_MODE寄存器被配置成了VID模式而VID模式下VOUT_COMMAND的数据格式是直接编码不是Linear11芯片用完全不同的方式解析这个数据。前一位工程师在验证固件时把VOUT_MODE改成了VID模式而且没有恢复所有配置数据都按VID格式解释了。把VOUT_MODE改回Linear模式并重新写入目标电压后输出立刻跳到1V。这个问题的本质是数据格式定义VOUT_MODE必须和具体命令的数据格式Linear11或VID保持一致。判断参数是否生效不能只看寄存器写进去没有还要核对芯片实际输出。6.3 动态调压导致过流误触发FPGA工作状态切换时核心电压从0.85V快速升到1V结果系统直接过流保护重启了。排查过程是这样的先看STATUS_WORD发现IOUT_OC_FAULT置位再看IOUT_OC_FAULT_LIMIT配置是22A然后对比正常满载电流只有15A22A按理不触发但切换瞬间电压变化率设置得太高输出电容充电电流叠加负载电流峰值超过了22A。解决方法是把VOUT_TRANSITION_RATE从1mV/µs降到0.5mV/µs同时把OC阈值留出更大的裕量。动态调压不是越快越好过渡速率要和负载特性、输出电容容量匹配。出现OCP误触发时不要一上来就调保护阈值先算一下过渡瞬间的电容充电电流量级再决定改哪个参数。6.4 温度告警误报芯片热阻和散热过孔还有一次做环境测试板子在65℃环境下工作一段时间后监控软件偶尔报OTP_WARNING。刚开始怀疑环境温度超标但结温算下来其实只有95℃左右芯片的OTP告警阈值默认是125℃按理不该触发。细查发现是芯片底部的散热过孔打少了PGND铺铜面积不足导致实际热阻比数据手册典型值大了不少芯片局部热点温度比估算值高了30℃。在PCB设计阶段就要重视散热过孔的数量和孔径。高集成度DC/DC的大电流和发热都集中在芯片底部一般要求过孔阵列覆盖整个散热焊盘区域孔径0.3mm以下过孔塞孔或开窗处理根据工艺能力决定。我后来在改版时增加了两排过孔并在芯片下方增加了一整块连续PGND铺铜OTP误报就再没出现过。6.5 量产配置烧录和NVM保护产品转量产的时候配置烧录流程也要规范化。带NVM的芯片可以在贴片前通过烧录座写入配置参数也可以在贴片后通过PMBus逐片写入。我建议在贴片后统一通过测试夹具写入写入完成后立即设置WRITE_PROTECT防止后续误操作修改关键参数。同时产线测试脚本里增加回读校验步骤确保每一个寄存器值都正确落入范围避免“这批板子有一半电压不对”这种量产事故。另外芯片的NVM烧写次数是有限的开发阶段频繁烧写可以接受量产的烧录程序里要避免重复烧写同一片芯片建议在烧录前先读一次型号和版本号确认没有重复烧写。6.6 排查问题时的通用方法论最后分享一个排查PMBus相关问题的通用思路这套方法帮我解决过不少疑难杂症先看寄存器再动烙铁芯片报什么错、状态寄存器各位是什么、故障时电压电流值是多少先把能读的都读出来。ALERT脚永远是最佳起点如果系统里有其他I2C设备把ALERT信号引到MCU外部中断上会比纯轮询更快发现异常。寄存器数据要换算成物理值不要拿着裸值分析先写个脚本或工具把Linear11转成十进制电压电流看趋势比看单个点更有效。不要忽略MFR_SPECIFIC寄存器通用命令查不到信息时厂商自定义寄存器里往往藏着关键线索包括开短路状态、失效地址等。同步抓I2C波形和功率波形用逻辑分析仪同时抓PMBus命令和输出电压跳变能确定到底是“命令没发对”还是“芯片执行不符合预期”。数字电源和模拟电源的一个区别就是模拟电路的神秘问题往往只能靠等效电路去猜而PMBus电路的所有状态都有寄存器可查查完寄存器再结合电路分析定位效率提升非常明显。这也是我这些年越来越愿意在项目里用高集成度PMBus DC/DC的原因。
返回列表