【实战】STM32 ADC采集数据乱跳?从参考源选型到软件滤波的工程调优笔记(附HAL库完整代码)
先说结论ADC数据乱跳八成问题出在硬件。参考源温漂大、模拟地没布好、电源纹波超标这些靠软件根本救不回来。我们在一个智慧供暖项目上STM32内置12位ADC采集温度原始数据跳了2%~3%换外部REF3030参考源限幅滑动平均滤波后全温区误差压到了0.15%以内。硬件决定上限软件只是拉高下限顺序别搞反。ADC采集是嵌入式开发里最常见的功能也是坑最多的功能之一。很多人觉得不就是调个HAL_ADC_Start嘛结果产品到现场数据跳得一塌糊涂回来查半个月才发现是PCB上一条地线走错了。这篇笔记把我们团队六年工业采集项目里踩过的坑、试出来的参数、验证过的代码全倒出来。分辨率、精度、采样率——这三个根本不是一回事刚入行的时候我跟客户说这个16位ADC精度很高被硬件老哥当场打脸。分辨率是ADC能输出多少位16位就是65536个刻度精度是测量值跟真实值差多少用%FS或者LSB表示采样率是每秒采多少次。分辨率高不代表精度高参考源差、噪声大16位可能还没12位准。选型看需求别盲目追高ADC类型典型分辨率典型精度采样率适用场景MCU内置ADC10~12位±1%~±3%FS几十kHz~几MHz电池电压、按键检测SAR型外置ADC12~16位±0.1%~±0.5%FS几百kHz~几MHz工业采集、多通道Σ-Δ型ADC18~24位±0.01%~±0.1%FS几Hz~几十kHz称重、温度、压力我们在智慧供暖项目里最开始用STM32F103自带的12位ADC采温度数据跳得跟心电图似的误差2%以上。客户要求0.5%以内换了ADS1115外置16位ADC配了个REF3030参考源精度直接拉到0.2%。内置ADC不是不能用是对精度要求高的场合内部干扰和参考源都撑不住。参考源选不好ADC再贵也白搭ADC的基准是参考电压Vref。参考源不准所有结果都带系统性偏差。标称2.5V实际2.45V差2%你采出来的值全差2%。参考源方案对比参考源方案初始精度温漂价格适用场景MCU内部参考±3%~±5%几十~上百 ppm/℃0元粗略测量TL431±0.5%~±1%~50 ppm/℃0.2元一般应用REF3030/REF3325±0.1%~±0.2%10~20 ppm/℃3~5元高精度工业级REF5025/ADR431±0.05%以内3~5 ppm/℃15~30元仪器仪表LTZ1000±0.005%以内0.05 ppm/℃上百元计量级基准// 这里容易踩坑TL431便宜但温漂大工业现场昼夜温差二三十度50ppm/℃ × 30℃ 0.15%加上其他误差累积就超标了。我们冬天出过事白天20度晚上零下数据飘了将近1%回来换成REF3030才稳住。给STM32配外部参考源很简单把VREF引脚接外部基准代码里注意一下// STM32 HAL库配置外部参考源 —— 实测在F103和F407上都验证过// VREF接外部REF3030的3.0V输出GND就近单点接地voidADC_ExternalVref_Init(void){hadc1.InstanceADC1;hadc1.Init.ScanConvModeADC_SCAN_ENABLE;// 多通道扫描hadc1.Init.ContinuousConvModeDISABLE;// 单次转换手动触发hadc1.Init.ExternalTrigConvADC_SOFTWARE_START;// 软件触发hadc1.Init.DataAlignADC_DATAALIGN_RIGHT;// 右对齐hadc1.Init.NbrOfConversion1;// 采样时间设长一点高阻抗信号源要多给点时间充电// 实测STM32F103的12位ADC采样时间设239.5 cycles输入阻抗50kΩ以内问题不大HAL_ADC_Init(hadc1);ADC_ChannelConfTypeDef sConfig{0};sConfig.ChannelADC_CHANNEL_0;sConfig.RankADC_REGULAR_RANK_1;sConfig.SamplingTimeADC_SAMPLETIME_239CYCLES_5;// 这里容易踩坑别用最短采样时间HAL_ADC_ConfigChannel(hadc1,sConfig);}// 读ADC值 —— 带软件延时多通道切换时前两次采样扔掉uint16_tADC_Read_Channel(uint32_tchannel){ADC_ChannelConfTypeDef sConfig{0};sConfig.Channelchannel;sConfig.RankADC_REGULAR_RANK_1;sConfig.SamplingTimeADC_SAMPLETIME_239CYCLES_5;HAL_ADC_ConfigChannel(hadc1,sConfig);// 多通道切换后别急着采等模拟开关稳定// 实测扔两次采样串扰从十几个LSB降到2~3个LSBHAL_ADC_Start(hadc1);HAL_ADC_PollForConversion(hadc1,100);HAL_ADC_GetValue(hadc1);// 第一次扔掉HAL_ADC_Start(hadc1);HAL_ADC_PollForConversion(hadc1,100);uint16_tvalHAL_ADC_GetValue(hadc1);// 第二次才用HAL_ADC_Stop(hadc1);returnval;}这段代码解决的是多通道采集时的通道间串扰问题。STM32内部模拟开关切换后采样电容上的电荷没放干净就切到下一个通道高阻抗输入时特别明显。扔前两次采样给模拟开关留出稳定时间串扰能降一个数量级。电源纹波和前端调理——藏在暗处的精度杀手ADC对电源噪声敏感得很。数字电路的开关噪声通过电源耦合到模拟部分数据上表现为无规律跳变。几个硬规矩AVCC和DVCC分开走线中间用磁珠或LDO隔离。别图省事一根线拉到底。ADC电源引脚旁边放0.1μF陶瓷电容10μF钽电容越近越好。我们一般把去耦电容放在ADC正下方引线不超过5mm。参考电压输出端加RC滤波比如100Ω1μF截止频率大概1.6kHz能把高频噪声压下去。开关电源别直接给模拟部分供电纹波太大。至少要过一级LDO或者用LC滤波。前端信号调理看传感器输出。毫伏级信号比如称重传感器必须上运放放大到ADC满量程附近不然分辨率浪费严重。运放选型别只看增益带宽积失调电压和温漂更重要。我们用过LM358做称重前端零点漂移惨不忍睹温度一变飘几十毫伏。换OP07级别的漂移小了将近一个数量级。PCB布局——一条线走错干扰跟半年模拟地和数字地分开、单点连接这个说烂了但照样有人错。多层板的话模拟层下面铺模拟地数字层下面铺数字地两个地平面只在ADC下方用一个过孔或者零欧电阻连起来。还有几个细节模拟信号线尽量短、尽量直别绕弯。高速数字信号SPI、时钟远离模拟部分串扰很烦人。参考源和去耦电容紧贴ADC引脚引线越短越好。长了就是天线专门接收干扰。重要的模拟信号线周围用地线包一圈像护城河一样。我们一块8通道采集板数据总有50Hz工频干扰查了很久才发现模拟输入线从一个LED旁边走过。LED电源是50Hz整流后的干扰直接耦合到模拟线上。把线改个方向干扰从几十个LSB降到5个LSB以内。PCB布局这事儿真的差之毫厘谬以千里。软件滤波——限幅滑动平均的工程实现硬件做得再好信号也有噪声。软件滤波就是拉高下限的利器。我们项目里最常用的组合是限幅滤波滑动平均先去掉尖脉冲再做平滑。// 限幅 滑动平均组合滤波 —— HAL库项目实测代码// 用在STM32F103的16位ADS1115采集上噪声从30个LSB压到8个LSB#defineFILTER_N12// 滑动窗口别太大延迟受不了#defineMAX_DIFF80// 限幅阈值单位LSB根据信号特性调typedefstruct{int32_tbuf[FILTER_N];uint8_tindex;int32_tsum;int32_tlast_valid;uint8_tfilled;}adc_filter_t;adc_filter_tg_filter{0};// 初始化滤波器 —— 上电时调一次voidADC_Filter_Init(adc_filter_t*f){memset(f,0,sizeof(adc_filter_t));f-last_valid-1;// -1表示还没收到有效值}// 限幅滑动平均滤波 —— 每采到一个新值就调一次int32_tADC_Filter_Process(adc_filter_t*f,int32_tnew_val){// 第一步限幅。跟上次有效值比跳变太大就认为是干扰弃用if(f-last_valid0){int32_tdiffnew_val-f-last_valid;if(diffMAX_DIFF||diff-MAX_DIFF){// 这里容易踩坑别直接返回last_valid极端情况下会锁死// 我们折中一下用上一次的有效值替代但连续限幅3次就强制更新staticuint8_tlimit_cnt0;limit_cnt;if(limit_cnt3){returnf-last_valid;}limit_cnt0;// 强制接受可能是信号真的跳变了}}// 第二步滑动平均。环形缓冲区减去最老的加上最新的f-sum-f-buf[f-index];f-buf[f-index]new_val;f-sumnew_val;f-index;if(f-indexFILTER_N){f-index0;f-filled1;// 缓冲区满了平均值有效}// 这里容易踩坑前N次数据没满的时候除数要跟着变// 不然前几次值偏小系统刚启动时数据异常int32_tavg;if(f-filled){avgf-sum/FILTER_N;}else{avgf-sum/(f-index1);// 除数动态变化}f-last_validavg;returnavg;}// 实际调用流程 —— 在主循环里周期性采样voidADC_Sample_Task(void){uint16_trawADC_Read_Channel(ADC_CHANNEL_0);// 读原始值int32_tfilteredADC_Filter_Process(g_filter,raw);// filtered就是滤波后的值可以直接用或者再去做校准// 实测12次滑动平均随机噪声压70%左右延迟大概12个采样周期}这段代码解决的是工业现场脉冲干扰随机噪声的叠加问题。纯滑动平均对尖脉冲没办法纯限幅又不够平滑组合起来效果最稳。窗口大小12是我们在一个温度采集项目上试出来的——10次的话噪声还有点大15次延迟又太长12次是个平衡点。两点校准——消除系统误差的必杀技参考源有误差、运放有失调、电阻有公差这些系统性偏差靠滤波滤不掉必须校准。两点校准是最实用的方法输入两个已知标准值比如0V和满量程算出增益系数和偏移量以后每次采样都用这个系数修正。// 两点校准 Flash存储 —— 带CRC校验防数据损坏// 我们在8通道采集板上实测校准后全温区误差从1.5%FS降到0.3%FS#defineCALIB_FLASH_ADDR0x0800F000// Flash最后一页根据芯片容量调#defineCALIB_MAGIC0x5A5A5A5A// 校准数据有效标志typedefstruct{floatgain;// 增益系数floatoffset;// 偏移量uint32_tcrc;// CRC校验uint32_tmagic;// 有效标志}calib_data_t;calib_data_tg_calib{1.0f,0.0f,0,0};// 简单的CRC32计算 —— 校准数据不大这个够用staticuint32_tCRC32_Calculate(uint8_t*data,uint16_tlen){uint32_tcrc0xFFFFFFFF;for(uint16_ti0;ilen;i){crc^data[i];for(uint8_tj0;j8;j){crc(crc1)^(0xEDB88320-(crc1));}}return~crc;}// 执行两点校准 —— 标准值用精密电压源或标准电阻给出voidADC_Calibrate_TwoPoint(floatstd1_v,uint16_tadc1,floatstd2_v,uint16_tadc2){// 这里容易踩坑两个标准点不能太近最好在量程的10%和90%附近// 离太近的话算出来的gain误差会被放大g_calib.gain(std2_v-std1_v)/(float)(adc2-adc1);g_calib.offsetstd1_v-g_calib.gain*(float)adc1;// 存Flash前算CRCg_calib.magicCALIB_MAGIC;g_calib.crcCRC32_Calculate((uint8_t*)g_calib,sizeof(g_calib)-8);// 写Flash —— 实际项目里要用HAL_FLASH_Program这里简写示意// Flash_Write(CALIB_FLASH_ADDR, (uint32_t *)g_calib, sizeof(g_calib)/4);}// 从Flash读校准参数 —— 上电时调用uint8_tADC_Load_Calibration(void){// Flash_Read(CALIB_FLASH_ADDR, (uint32_t *)g_calib, sizeof(g_calib)/4);if(g_calib.magic!CALIB_MAGIC){// 校准数据不存在用默认值gain1, offset0g_calib.gain1.0f;g_calib.offset0.0f;return0;// 加载失败}uint32_tcalc_crcCRC32_Calculate((uint8_t*)g_calib,sizeof(g_calib)-8);if(calc_crc!g_calib.crc){// 这里容易踩坑Flash数据可能损坏CRC校验不过就用默认值// 别硬着头皮算否则输出值会完全错乱g_calib.gain1.0f;g_calib.offset0.0f;return0;}return1;// 加载成功}// 获取校准后的实际电压值floatADC_Get_Voltage(uint16_tadc_raw){returng_calib.gain*(float)adc_rawg_calib.offset;}这段代码解决的是ADC系统误差校准和参数持久化问题。校准参数存在Flash里掉电不丢加上CRC校验防止数据损坏。我们在化工厂的项目里出厂前每个通道都做一次两点校准存好参数到现场直接读就用。一个真实项目的实测数据给一家化工厂做的8通道420mA采集模块要求±0.2%FS-2060℃工作。方案ADS1115两片级联8通道REF3030做3.0V参考源250Ω精密电阻转电压24V输入经DC-DC到5V再经LDO分3.3V数字和5V模拟。实测结果测试条件原始误差校准后加滤波后波动常温25℃±0.8% FS±0.15% FS±0.02% FS峰峰值低温-20℃±1.5% FS±0.3% FS±0.03% FS高温60℃±1.2% FS±0.25% FS±0.025% FS客户要求±0.5%FS我们做到±0.3%FS全温区余量充足。做工业产品一定要留余量设计指标最好是客户要求的2倍量产时元器件公差、焊接差异才不会把产品卡死。几个容易栽进去的坑说多了都是泪参考源直接用VCC代替。省事是真省事VCC上的纹波直接变成采样误差。高精度采集必须上独立参考源哪怕TL431也比VCC强。模拟地和数字地到处乱接。数字开关噪声通过地回路串到模拟部分数据上会出现规则的干扰纹波。分开布局、单点连接多层板铺地要分区。输入阻抗不够把信号拉低了。换传感器误差就变大概率是输入阻抗问题。高输出阻抗的传感器前面要加电压跟随器或者选输入阻抗更高的ADC。采样率不够还省抗混叠滤波。奈奎斯特定理别忘采样率低于信号最高频率2倍就会混叠。要么提高采样率要么在ADC前面加低通滤波把高频成分滤掉。多通道采集不扔前几次采样。STM32内部模拟开关切换需要时间稳定直接采的话串扰严重。切通道后等几微秒或者前两次采样扔掉数据稳很多。运放自激了还不知道。前端加了运放噪声反而变大大概率是自激。输出端加100Ω电阻驱动容性负载反馈电阻并联小电容做相位补偿拿示波器一看波形就知道。写在最后高精度ADC采集是个系统工程从参考源、前端运放、电源、PCB布局到软件滤波、校准每个环节都影响最终精度。硬件做扎实了软件稍微处理一下就能出好数据硬件没做好再复杂的算法也救不回来。希望这篇笔记对你有用。如果你的采集项目也遇到了精度或者干扰的问题欢迎评论区交流各种奇奇怪怪的坑咱们一起琢磨。还想接着看【实战】STM32挂4路传感器数据全乱从同步采到卡尔曼融合的调坑笔记——多通道传感器融合的进阶做法正好接在本文后面【实战】STM32做PID温控总是过调从参数整定到PWM脉冲输出的工程调优笔记——采完数据要做控制的话PID调参的经验也在博客里【实战】STM32低功耗实战电池供电终端功耗从8.6mA压到2.1mA的调优记录——做电池供电的采集节点低功耗设计不能少

相关新闻

组蛋白乳酸化与免疫:代谢信号如何通过表观修饰重塑免疫细胞功能?

组蛋白乳酸化与免疫:代谢信号如何通过表观修饰重塑免疫细胞功能?

组蛋白乳酸化作为连接细胞代谢状态与基因转录的新型表观遗传修饰,由肿瘤或炎症微环境中积累的乳酸驱动。最新研究发现,组蛋白乳酸化通过调控巨噬细胞表型转换、促进免疫抑制分子表达及影响自噬过程,在肿瘤免疫逃逸和炎症消退中发挥双向调节作…

2026/10/3 19:56:39 阅读更多 →
口碑过硬的GEO同城优化供应商,一起来看看

口碑过硬的GEO同城优化供应商,一起来看看

我们是口碑过硬的 GEO 同城优化供应商,深耕生成式引擎同城获客领域,长期服务海南各类实体企业,凭借稳定的优化效果与贴心的落地服务,收获众多合作客户的认可。在服务过程中,我们发现很多实体商家尝试线上引流&#xff…

2026/10/3 19:56:39 阅读更多 →
PCB改动实时呈现在KiCad界面上:KiCAD MCP Server的IPC实时同步后端深度解析

PCB改动实时呈现在KiCad界面上:KiCAD MCP Server的IPC实时同步后端深度解析

PCB改动实时呈现在KiCad界面上:KiCAD MCP Server的IPC实时同步后端深度解析 【免费下载链接】KiCAD-MCP-Server KiCAD MCP is a Model Context Protocol (MCP) implementation that enables Large Language Models (LLMs) like Claude to directly interact with Ki…

2026/10/3 19:56:39 阅读更多 →

最新新闻

网络协议面试高频八问:TCP三次握手、HTTP状态码与HTTPS原理

网络协议面试高频八问:TCP三次握手、HTTP状态码与HTTPS原理

最近帮几个准备大厂面试的朋友做了几轮模拟面试,发现一个特别有意思的现象:很多人聊分布式、聊数据库能讲十分钟,但一被问到网络协议的底层细节,立刻开始背概念。TCP三次握手背得滚瓜烂熟,被追问“为什么不能是两次”就…

2026/10/3 20:53:56 阅读更多 →
SpringBoot+Vue停车场管理系统毕设全解析:从架构设计到部署实战

SpringBoot+Vue停车场管理系统毕设全解析:从架构设计到部署实战

做毕设选“SpringBootVue停车场管理系统”这个题目的人,这两年是真的多。原因也很实在:技术栈主流、业务场景清晰、前后端分离的架构踩中当下企业开发的主流范式,答辩时既能讲业务又能讲技术,怎么都有话说。不过题目选得容易&…

2026/10/3 20:52:55 阅读更多 →
SSM+Vue教工公寓管理系统毕业设计:从项目搭建到论文答辩全指南

SSM+Vue教工公寓管理系统毕业设计:从项目搭建到论文答辩全指南

每年到这个时间点,就会有一批计算机专业的大四学生开始为毕业设计头疼。2026届的学弟学妹们,如果你正在纠结选题,或者已经选了“基于SSM的教工公寓管理系统”这类题目却不知道从何下手,这篇内容就是写给你看的。这套题目可以说是经…

2026/10/3 20:51:54 阅读更多 →
基于ZooKeeper的在线状态漂移检测与选主实现

基于ZooKeeper的在线状态漂移检测与选主实现

1. 先聊清楚:微信个人号多设备场景下的“在线状态漂移”是什么 1.1 多个实例同时工作,为什么会产生状态分歧 如果你搭过微信个人号相关的中台服务,一定遇过这种奇怪现象:后台明明显示账号在线,消息流水也正常&#xf…

2026/10/3 20:51:54 阅读更多 →
专科生AI辅助开题报告:9个实用工具、完整流程与学术诚信红线

专科生AI辅助开题报告:9个实用工具、完整流程与学术诚信红线

先说一个前提:这篇文章只聊合法合规的AI写作辅助,用来帮你把开题报告、文献综述这种东西从“憋不出来”变成“改得出来”。最终交上去的文档必须是你自己一个字一个字改过、认过、能讲清楚的,否则别往下看。 2026届专科生现在应该刚好要开题…

2026/10/3 20:51:52 阅读更多 →
路标检测数据集:1000张实拍图+YOLO/VOC/COCO三格式标签

路标检测数据集:1000张实拍图+YOLO/VOC/COCO三格式标签

简介:本资源是面向计算机视觉初学者与YOLO目标检测实践者的路标识别专项数据集及配套训练工具包,解决真实场景下交通标志检测模型训练缺乏高质量标注数据与完整流程支持的问题。压缩包共2000个文件,含1000张实拍路标图像、990个YOLO格式标签&…

2026/10/3 20:49:51 阅读更多 →

日新闻

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南 【免费下载链接】ex-skill 前任 skill 项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill 前任.skill 是一个运行在 Claude Code 上的开源 Skill:导入微信、iMessage、短信、…

2026/10/3 0:00:27 阅读更多 →
45个经典Linux面试题:从命令到网络排障的完整考点解析

45个经典Linux面试题:从命令到网络排障的完整考点解析

刚开始带应届生的时候,我最头疼的就是他们拿着一摞Linux面试题背得滚瓜烂熟,一上机全露馅。后来自己从被面的人变成面别人的人,才慢慢摸清楚:Linux面试题考的根本不是答案本身,而是你面对一个不确定的系统问题时&#…

2026/10/3 0:01:28 阅读更多 →
SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

简介:本资源是一份面向SAP ABAP开发人员、生产计划专员及ERP实施顾问的实操型操作指南,聚焦SAP生产预留核心业务场景,系统解决物料预留创建、查询、校验与批量处理等高频问题。文档以结构化方式覆盖预留背景原理、OMC2编码规则、工厂级参数配…

2026/10/3 0:01:28 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/3 9:14:33 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 9:47:50 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/3 9:42:31 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/3 9:42:36 阅读更多 →