尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
两串电池被动均衡方案:MP2642GR-Z与PIC18F87J50实战
1. 从两个串联电芯的电压差说起为什么被动均衡在储能场景里依然能打储能和备用电源系统里电池组的寿命往往不取决于最强的那颗电芯而是被最弱的那颗拖垮。两串电芯的架构在中小功率备用电源、便携储能、UPS 电池包中非常常见——电压不高成本敏感但一致性要求一点不低。刚出厂时两颗电芯的容量、内阻、自放电率看着都差不多可经过几十上百次充放电循环之后差异就会被放大充电时电压高的那颗先到截止电压放电时电压低的那颗先到欠压保护点整组可用容量被硬生生砍掉一截。均衡要解决的就是这件事。主动均衡靠电感、电容或变压器把能量从高电压电芯搬到低电压电芯效率高但电路复杂、成本高、EMI 难搞被动均衡则是把高电压电芯的多余能量通过电阻或功率器件消耗掉简单、可靠、便宜。很多人一听“消耗能量”就觉得落后但在两串小容量电池的备用电源场景里被动均衡的性价比往往是最优解——电路简单意味着故障点少备用电源最怕的就是均衡电路自己先坏掉。这次要聊的方案是用MP2642GR-Z这颗电池管理前端配合PIC18F87J50单片机对两个串联电芯做均衡控制。MP2642GR-Z 负责电芯电压采集和均衡开关的驱动PIC18F87J50 负责逻辑判断、状态机和与上位机的通信。整套方案的核心思路是用专用模拟前端保证采样精度和均衡驱动的可靠性用一颗资源充裕的 8 位 MCU 做控制大脑两者通过 I2C 或 SPI 交互实现“谁电压高就放谁的电”的被动均衡策略。适合读这篇内容的人有三类一是正在做两串电池包 BMS 的硬件工程师想找一个经过验证的器件组合二是嵌入式软件工程师需要理解均衡状态机怎么写才不会误动作三是储能产品的系统设计者想搞清楚被动均衡的边界在哪里、什么时候该换主动方案。下面我会从器件选型逻辑、硬件连接细节、均衡算法实现、实测踩坑四个维度展开把每个决策背后的“为什么”讲透。2. MP2642GR-Z 与 PIC18F87J50 的分工逻辑为什么不是一颗芯片全包2.1 MP2642GR-Z 在均衡回路里到底管什么MP2642GR-Z 是一颗面向多串电池管理的模拟前端核心能力包括电芯电压采集、均衡开关驱动、过压欠压保护以及温度监测接口。在两串应用里它最值钱的地方是电芯电压的采集精度和均衡 MOS 管的驱动能力。被动均衡的本质是给高电压电芯并联一个泄放电阻让它在充电或静置阶段缓慢放电直到两颗电芯电压拉平。这个泄放回路的开关如果由 MCU 的 GPIO 直接驱动会遇到两个问题一是 MCU 的驱动电流有限大电流泄放时 MOS 管可能工作在放大区而不是开关区发热严重二是 MCU 的 GPIO 在系统掉电时状态不确定可能导致均衡回路意外导通把电芯放亏。MP2642GR-Z 把均衡开关的驱动集成在芯片内部由它来控制外部泄放 MOS 管的栅极。芯片内部有专门的均衡定时器和状态机MCU 只需要通过寄存器告诉它“对哪颗电芯开启均衡、持续多久”剩下的时序和驱动由前端芯片自己完成。这样做的好处是均衡动作的实时性和安全性由硬件保证即使 MCU 跑飞或者通信中断前端芯片也能在超时后自动关闭均衡不会把电芯放空。另外MP2642GR-Z 的电压采集通道是差分输入对两串电芯的共模电压有很好的抑制。两串电芯串联后第二颗电芯的正极对地电压是第一颗的两倍如果直接用 MCU 的 ADC 分压采样电阻的温漂和分压比误差会直接吃掉精度。专用前端的内部基准和校准机制能把单颗电芯的采样误差控制在毫伏级这是被动均衡能准确判断“谁高谁低”的前提。2.2 PIC18F87J50 为什么适合做这个控制大脑PIC18F87J50 是一颗 8 位单片机主频可以跑到 48MHz自带 USB 控制器、I2C、SPI、多个定时器和比较器。选它来做两串电池的均衡控制主要看中三点通信接口丰富、低功耗模式灵活、开发工具成熟。通信接口方面MP2642GR-Z 通常通过 I2C 或 SPI 与主控交互。PIC18F87J50 的 MSSP 模块可以配置成 I2C 主机或 SPI 主机直接和前端芯片对接不需要额外的桥接芯片。如果备用电源系统需要把电池状态上报给上位机PIC18F87J50 自带的 USB 模块可以模拟成一个 HID 设备或者 CDC 串口插上电脑就能看到电压、电流、均衡状态调试阶段非常省事。低功耗方面备用电源系统很多时候处于待机状态MCU 不能一直全速跑。PIC18F87J50 有 idle 和 sleep 模式在待机时可以关掉大部分外设只留一个定时器周期性唤醒去读前端芯片的状态。均衡判断不需要毫秒级的实时性秒级的轮询完全够用这样整机的静态功耗可以压得很低。开发工具方面PIC 系列的编译器、调试器、代码示例在工程师圈子里积累了很多年遇到问题容易找到参考。对于两串电池这种量级的产品用一颗资源够用、生态成熟的 8 位 MCU比强行上 32 位 ARM 更划算——BOM 成本低代码量小认证也简单。2.3 两颗芯片之间的通信协议怎么定MP2642GR-Z 和 PIC18F87J50 之间的通信我建议用 I2C速率设在 100kHz 或 400kHz。I2C 只需要两根线占用引脚少而且总线上可以挂多个器件以后如果要扩展温度传感器或者电流计直接并联上去就行。SPI 虽然速率高但片选线多一根对于两串电池这种低速控制场景I2C 的速率完全够用。通信内容主要分三类配置寄存器、状态寄存器、均衡控制寄存器。配置寄存器用来设定过压阈值、欠压阈值、均衡开启的电压差门限状态寄存器用来读当前每颗电芯的电压、温度、故障标志均衡控制寄存器用来告诉前端芯片对哪颗电芯开启均衡、均衡占空比是多少。协议设计上有一个细节要注意读写寄存器时要加超时和重试。I2C 总线在电池包这种有强电磁干扰的环境里偶尔会出现时钟拉低或者数据错位。PIC18F87J50 的 I2C 模块有超时检测但软件层也要做重试连续三次读失败就报通信故障进入安全状态——关闭所有均衡开关等待下一次复位。3. 硬件连接与均衡回路设计从原理图到 PCB 的实操细节3.1 两串电芯与 MP2642GR-Z 的接线方式两串电芯的接线看起来简单但顺序和参考点很容易搞错。假设两颗电芯分别为 Cell1 和 Cell2串联后 Cell1 的负极是系统地Cell1 的正极接 Cell2 的负极Cell2 的正极是电池组正极。MP2642GR-Z 的电压采集引脚要分别接到 Cell1 正极、Cell2 正极和系统地注意每个采集引脚前面要加 RC 滤波电阻用 100Ω电容用 0.1μF截止频率大概在 16kHz 左右能滤掉开关噪声又不影响直流精度。均衡泄放回路的设计是重点。每颗电芯需要一个泄放电阻和一个 N 沟道 MOS 管。泄放电阻的阻值决定了均衡电流计算公式是I_balance V_cell / R_bleed假设单颗电芯电压 3.7V想要的均衡电流是 50mA那么 R_bleed 3.7V / 0.05A 74Ω取标准值 75Ω。泄放电阻的功率也要算P V_cell² / R_bleed 3.7² / 75 ≈ 0.18W所以至少要选 0.25W 的封装留一点余量用 0.5W 更稳妥。MOS 管选 N 沟道逻辑电平型号导通电阻要小栅极阈值电压要低于 MP2642GR-Z 的均衡驱动输出电压。如果前端芯片的驱动电压是 5V选 Vgs(th) 在 1V 到 2V 之间的 MOS 管就能可靠导通。MOS 管的漏极接泄放电阻泄放电阻另一端接电芯正极源极接电芯负极栅极接前端芯片的均衡驱动引脚。这样当前端芯片输出高电平时MOS 管导通泄放电阻并联到电芯两端电芯开始放电。3.2 均衡回路的 PCB 布局要点被动均衡的泄放电流虽然不大但布局不好照样出问题。第一个要点是泄放回路的环路面积要小。泄放电阻、MOS 管、电芯接线端子构成的环路要尽量紧凑减少对外辐射。第二个要点是采样线和泄放线要分开走。电压采集线是敏感信号泄放线是功率路径如果两者平行走线太长泄放电流在采样线上感应出的压降会直接叠加到采样结果上导致电压读数偏高均衡判断失准。我的做法是采样线从电芯端子直接引到前端芯片的采集引脚中间不经过任何功率器件泄放回路单独走一条粗线从电芯端子到泄放电阻再到 MOS 管最后回到电芯负极。两条路径在空间上尽量垂直交叉如果必须平行中间用地线隔开。第三个要点是散热。两颗电芯同时均衡时两个泄放电阻的功耗加起来接近 0.4W如果 PCB 铜皮面积不够电阻表面温度会很高。泄放电阻下面铺铜并通过过孔连接到内层地平面利用整板散热。实测中75Ω/0.5W 的电阻在 50mA 均衡电流下表面温升大概在 20℃ 到 30℃如果环境温度本来就高要留更多余量。3.3 PIC18F87J50 的外围电路与电源设计PIC18F87J50 的供电来自电池组正极经过 LDO 降压后的 3.3V 或 5V。LDO 的选型要注意静态电流备用电源系统待机时LDO 自身的功耗不能太大。如果整机待机电流目标是 100μA 级别LDO 的静态电流要选在 10μA 以下的型号。MCU 的复位引脚要接一个 10kΩ 上拉电阻和 0.1μF 电容保证上电复位可靠。晶振根据通信速率和定时需求选择如果 I2C 速率是 400kHzMCU 主频至少要在 4MHz 以上用内部振荡器也能跑但如果有 USB 通信需求必须用外部晶振保证 USB 时钟精度。I2C 总线的上拉电阻不能省典型值是 4.7kΩ。如果总线电容较大或者走线较长可以降到 2.2kΩ但要注意功耗。上拉电阻太小会增加总线静态电流备用电源系统里每一微安都要计较所以要在通信可靠性和功耗之间折中。我的经验是总线长度小于 10cm 时用 4.7kΩ大于 10cm 时用 2.2kΩ同时把 I2C 速率降到 100kHz。4. 均衡策略的软件实现状态机、门限与防抖4.1 均衡开启和关闭的电压门限怎么定被动均衡的触发条件不能只看“两颗电芯电压不相等”因为采样噪声和负载波动会导致电压瞬间跳动如果一有压差就开启均衡均衡开关会频繁动作既浪费能量又缩短 MOS 管寿命。合理的做法是设定一个开启门限和一个关闭门限两者之间留一个迟滞区间。举个例子开启门限设为 30mV关闭门限设为 10mV。当两颗电芯压差超过 30mV 时开启高电压电芯的均衡当压差降到 10mV 以下时关闭均衡。中间的 20mV 就是迟滞区间防止压差在门限附近来回抖动导致均衡反复开关。门限的具体数值要根据电芯特性和采样精度来定。磷酸铁锂电芯的电压平台很平压差 30mV 可能对应很大的容量差异三元电芯的电压曲线斜率大同样的压差对应的容量差异小一些。如果前端芯片的采样误差是 ±5mV门限至少要设在 15mV 以上否则噪声就能触发均衡。还有一个细节充电和放电阶段的均衡策略要分开。充电时高电压电芯会先到截止电压这时候开启均衡可以把高电压电芯压住让低电压电芯继续充电提升整组容量。放电时低电压电芯会先到欠压保护点这时候均衡高电压电芯没有意义反而会加速整组放电。所以我的做法是充电阶段允许均衡放电阶段禁止均衡静置阶段根据压差决定是否均衡。4.2 基于 PIC18F87J50 的均衡状态机设计状态机是均衡逻辑的核心。我一般把它分成五个状态空闲、检测、均衡中、冷却、故障。空闲状态下MCU 处于低功耗模式定时器每隔 1 秒唤醒一次读取前端芯片的电芯电压。如果压差超过开启门限进入检测状态。检测状态下连续读取 5 次电压每次间隔 100ms如果 5 次结果都显示压差超过门限才确认需要均衡。这一步是为了滤掉偶发的采样噪声。确认后进入均衡中状态。均衡中状态下MCU 通过 I2C 向前端芯片写入均衡控制命令开启高电压电芯的泄放回路。同时启动一个均衡定时器单次均衡时间不超过 30 分钟。如果 30 分钟内压差降到关闭门限以下提前结束均衡进入冷却状态如果 30 分钟到了压差还没降下来也强制结束进入冷却状态防止泄放电阻过热。冷却状态下关闭所有均衡开关等待 10 秒让电芯电压恢复稳定然后重新进入检测状态。如果连续三次均衡都没能把压差降到关闭门限以下说明两颗电芯的容量差异已经很大被动均衡解决不了进入故障状态上报“电芯不一致”告警。故障状态下关闭所有均衡开关保持通信等待上位机或者维护人员处理。这个状态机的关键点是单次均衡时间限制和冷却时间。没有这两个限制泄放电阻会一直发热MOS 管也可能因为长时间导通而加速老化。4.3 电压采样的滤波与校准MP2642GR-Z 输出的电压数据是数字量但数字量不代表没有噪声。电源开关、电机启停、外部充电器插拔都会在电芯电压上叠加干扰。软件层要做两件事滑动平均滤波和开路电压校准。滑动平均滤波的做法是维护一个长度为 8 的环形缓冲区每次读到新的电压值就存入缓冲区然后取平均值作为当前电压。这样可以把随机的采样噪声压下去代价是响应速度变慢。对于均衡判断这种秒级应用8 点滑动平均完全够用。开路电压校准是为了消除系统误差。在电池静置且没有均衡动作时用高精度万用表测量每颗电芯的实际电压然后和前端芯片的读数对比算出一个偏移量写入 MCU 的 Flash 或者前端芯片的校准寄存器。这个校准一次就够了但如果你换了电芯或者改了采样电路要重新校准。还有一个容易忽略的点采样时刻要避开均衡开关动作的瞬间。均衡开关导通和关断时泄放电流的突变会在采样线上感应出尖峰。我的做法是在均衡状态切换后延时 50ms 再采样等电压稳定下来再读。5. 实测中踩过的坑从误触发到通信死锁5.1 均衡误触发采样线上的共模干扰第一批板子调试时遇到一个怪现象两颗电芯明明压差只有 5mV均衡却偶尔自动开启。用示波器抓采样线发现每当附近的大电流负载启动时采样线上会出现几十毫伏的尖峰。前端芯片的采样保持电路在尖峰期间采到了错误的值MCU 读到压差超过门限就误开启了均衡。排查过程是这样的先怀疑是前端芯片的配置问题把采样速率降到最低误触发概率下降但没有消失。然后怀疑是电源噪声在 LDO 输出端加了 100μF 电解电容和 0.1μF 陶瓷电容改善有限。最后用示波器逐点测量才定位到采样线上的共模干扰。解决方案分两层硬件上在采样引脚前面加 RC 滤波电阻从 100Ω 增加到 1kΩ电容保持 0.1μF截止频率降到 1.6kHz对直流电压没有影响但能把尖峰滤掉大半软件上把检测状态的连续采样次数从 5 次增加到 10 次并且要求这 10 次采样的最大值和最小值之差小于 10mV 才认为数据有效。两层措施加上去之后误触发彻底消失。这个坑给我的教训是被动均衡的采样精度不仅取决于前端芯片还取决于采样路径的抗干扰设计。专用前端芯片的差分输入抑制的是低频共模高频尖峰还是要靠 RC 滤波和软件滤波一起解决。5.2 I2C 通信死锁时钟被从机拉低调试过程中还遇到过一次 I2C 死锁MCU 正常发送读取命令突然总线卡住SCL 被前端芯片拉低MCU 发时钟也拉不动。断电重启后恢复正常但运行几个小时又会出现。I2C 死锁的经典原因是主机在从机准备数据时复位或者中断从机还在等待时钟沿导致 SCL 被从机持续拉低。MP2642GR-Z 在均衡动作期间会占用内部状态机如果这时候 MCU 发起 I2C 读取前端芯片可能来不及响应把 SCL 拉低等待。解决办法有两个一是避免在均衡动作期间读取电压MCU 在开启均衡后延时 100ms 再发起 I2C 通信二是在 I2C 驱动里加总线恢复逻辑如果检测到 SCL 被拉低超过 10ms就把 SCL 配置成 GPIO手动发送 9 个时钟脉冲让从机释放总线然后重新初始化 I2C 模块。总线恢复逻辑我写成了一个函数每次 I2C 读写超时后调用。实测下来加上这个逻辑之后即使偶尔出现死锁系统也能在几百毫秒内自动恢复不需要人工断电。5.3 均衡电流的实际值与理论值偏差设计时按 75Ω 泄放电阻算均衡电流应该是 50mA。但实测用电流表串在泄放回路里读数只有 42mA。检查了一圈发现两个原因一是 MOS 管的导通电阻不是零几毫欧到几十毫欧的导通电阻在 50mA 下产生几毫伏的压降导致实际加在泄放电阻上的电压略低于电芯电压二是泄放电阻本身有 1% 的容差实际阻值可能偏大。42mA 和 50mA 的差异对均衡效果影响不大但如果你对均衡时间有严格要求就要把这两个因素算进去。我的做法是在软件里根据实测电流反推一个修正系数用来估算均衡所需时间。比如理论计算需要 2 小时实测电流偏小 16%就把预估时间乘以 1.2避免过早结束均衡。另外泄放电阻的温漂也要注意。普通厚膜电阻的温度系数是 100ppm/℃温度升高 50℃ 时阻值变化 0.5%对均衡电流的影响可以忽略。但如果用精密电阻成本上去了收益并不明显两串电池的被动均衡没必要用太高精度的电阻。5.4 低功耗模式下的唤醒异常备用电源系统要求待机功耗低MCU 在空闲时进入 sleep 模式靠定时器唤醒。调试时发现有时候 MCU 进入 sleep 后不再唤醒整机死机。查了数据手册发现是在 I2C 通信过程中进入 sleep 导致的。I2C 模块在通信未完成时进入 sleep会产生总线错误MCU 卡在错误状态里出不来。解决方法是在进入 sleep 之前确保 I2C 总线空闲并且关闭 I2C 模块的时钟。唤醒后重新初始化 I2C 模块再开始通信。另外定时器唤醒中断的优先级要设成最高保证 MCU 能及时响应。还有一个细节PIC18F87J50 的 sleep 模式下如果 I/O 引脚上有悬空输入会导致漏电流增加。所有未使用的引脚要配置成输出低电平或者输入带上拉不能悬空。这个细节在数据手册里有提但很容易被忽略实测中悬空引脚能让待机电流从 50μA 涨到 200μA。6. 被动均衡的边界与两串架构的扩展思路两串电池的被动均衡说到底是在成本、复杂度和效果之间找一个平衡点。MP2642GR-Z 加 PIC18F87J50 的组合把模拟采集和数字控制分开硬件负责安全和精度软件负责策略和通信分工清晰调试起来也容易定位问题。这套方案适合 10Ah 以下的备用电源系统均衡电流在 50mA 到 100mA 之间均衡时间在小时级对大多数中小功率应用来说够用了。但如果你的电池容量超过 20Ah或者对均衡速度有要求被动均衡的短板就暴露了50mA 的均衡电流相对于 20Ah 的容量要把 5% 的容量差异拉平需要几十个小时实际使用中根本等不起。这时候要么加大均衡电流但泄放电阻的功耗和散热会变成大问题要么换主动均衡用 Buck-Boost 或者电感储能的方式把能量搬过去效率高但电路复杂度和成本会上一个台阶。两串架构本身也有扩展空间。如果以后要做三串或者四串MP2642GR-Z 有更高串数的型号PIC18F87J50 的 I2C 总线可以挂多颗前端芯片软件上把状态机扩展成多电芯版本就行。但要注意串联电芯越多共模电压越高采样线的绝缘和滤波要求也越高PCB 布局的难度会明显增加。我在实际项目里还遇到过一个需求电池包要在低温环境下工作-20℃ 时电芯内阻增大电压跌落明显均衡判断容易被误触发。后来的做法是在低温时把均衡开启门限从 30mV 提高到 50mV并且降低均衡电流减少电芯自身的发热。这个策略写进了温度补偿逻辑里用前端芯片的温度读数作为判断依据。最后分享一个调试小技巧在均衡回路的泄放电阻两端并联一个 LED 和限流电阻均衡开启时 LED 微亮肉眼就能看到哪颗电芯在均衡。这个指示灯在调试阶段非常有用能快速判断是软件没发命令还是硬件没执行。量产时把 LED 去掉就行不影响电路功能。
RELATED

相关推荐

直播观看时长统计的C语言实现:CSV解析与哈希表聚合实战

直播观看时长统计的C语言实现:CSV解析与哈希表聚合实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/16 1:26:28
Ubuntu 22.04下GitLab私有服务从零部署与CI/CD实战

Ubuntu 22.04下GitLab私有服务从零部署与CI/CD实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/16 1:26:28
STM32CubeMX移植FatFs文件系统:SD卡挂载、读写与调试全攻略

STM32CubeMX移植FatFs文件系统:SD卡挂载、读写与调试全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/16 1:26:28
MORE NEWS

更多资讯

📰

Docker Desktop 数据迁移完整流程(Windows 10/11 x64)

前提 两台机器都是 Windows 10 / 11 x64 拥有管理员权限 知道旧机器 Docker Desktop 版本(例如4.31.1),很重要!!!! 旧机器已安装 WSL 功能 WSL功能检查和准备 如果安装过Docker Desktop会自动…

📰

Python本地实现横向联邦学习FedAvg全流程

简介:本资源是一份面向机器学习与分布式系统初学者的横向联邦学习本地模拟实践项目,聚焦Python生态下的端到端实现,解决隐私敏感场景下多设备协同建模的核心问题。资源共25个文件,含5个核心Python源码(server.py、clie…

📰

【图像去噪】论文精读:TM-BSN: Triangular-Masked Blind-Spot Network for Real-World Self-Supervised Image Denoisi

请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中) 文章目录 前言 摘要详解 1. Introduction 引言详解…

📰

YOLO12+A2C2f+DFFN:水果新鲜度检测系统的实战全解析

1. YOLO12-A2C2f-DFFN这套组合,一开始是怎么定的产品端给的诉求很直接:在分拣线或者农户收货的现场,拍一张番石榴的照片,系统能同时告诉我三个信息——画面里的果在哪里、这个果目前是什么状态、这种状态该归到哪一档。这个需求拆…

📰

PyTorch原型网络实战:少样本分类的轻量级方案与代码详解

简介:这是一个基于PyTorch实现的Prototypical Networks(原型网络)少样本学习项目,对应arXiv论文1703.05175,主要面向机器学习初学者、算法研究人员以及需要在少量标注样本条件下完成图像分类任务的开发者。项目以Omnig…

📰

2S电池组主动均衡系统:ATmega644+MP2642GR-Z设计实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬