LDC1000金属探测程序完整版:从校准到动态阈值的嵌入式实现

简介:这份资源是面向电子设计竞赛参赛者与嵌入式开发者的LDC1000金属探测程序完整工程,围绕TI杯金属位置探测器赛题展开,解决从传感器驱动到目标检测的完整实现问题。压缩包共40个文件,约101KB,以C语言源文件、头文件、Keil工程文件(uvproj、uvopt)、编译产物(hex、obj、lst、m51)及汇编启动文件为主,覆盖硬件接口、信号处理、目标检测、用户界面与异常管理等关键模块,可直接导入开发环境编译调试。目前已有670人学习下载,适合具备8051单片机与C语言基础、希望深入理解LDC1000低频电感耦合传感原理的读者。通过研读代码,可掌握寄存器配置、原始数据滤波校正、阈值设定与金属位置判定等实现思路,并借鉴其工程组织方式,将理论知识转化为可运行的非接触式探测方案,对备赛与嵌入式项目开发均有较高参考价值。

1. 从一块 LDC1000 说起:这套金属探测程序到底能跑出什么

如果你手头正好有一块 LDC1000 电感数字转换芯片,或者正在准备 TI 杯这类需要非接触式金属检测的赛题,那这套「LDC金属探测程序完整版」大概率能帮你省掉最磨人的那段底层调试时间。LDC1000 这颗芯片本身不复杂,它把线圈电感的变化转成数字量,通过 SPI 吐给单片机,但真正上手你会发现:寄存器配置、谐振频率匹配、阈值判定、串口上位机联调,每一步都有坑。这套程序的价值就在于,它把从芯片初始化到金属判定输出的完整链路都串好了,你拿到手改几个参数就能跑。

它适合三类人:一是第一次用 LDC1000 做金属探测、不想从零啃数据手册的嵌入式新手;二是赛题时间紧、需要快速搭出可演示原型的参赛者;三是想拿它当参考,理解电感式检测信号链怎么落地的人。不适合指望它直接做成工业级产品的人——它是一套可复现的验证程序,不是量产固件。下面我按「信号链原理 → 程序怎么跑 → 参数怎么调 → 坑在哪」的顺序拆开讲,你跟着走一遍,基本能把这套东西跑通。

2. LDC1000 信号链拆解:从线圈电感变化到数字量输出

2.1 电感式检测的物理基础与 LDC1000 的角色

金属探测的底层逻辑其实很朴素:一个 LC 谐振回路,当金属物体靠近线圈时,金属表面会产生涡流,涡流反过来改变线圈的等效电感,谐振频率随之偏移。LDC1000 干的事,就是把这个频率偏移量精确地测出来,转成一个 24 位的数字量。它内部有一个频率计数器,配合外部 LC 回路工作,输出的是「传感器频率」的倒数关系量。

关键参数有三个:一是谐振频率 f_sensor,由外部电感和电容决定;二是 LDC1000 的参考频率 f_ref,通常用内部或外部时钟;三是转换后的 Proximity Data,也就是接近度数据。金属越近,涡流越强,等效电感变化越大,Proximity Data 的读数就越偏离基准值。这套程序的核心判定逻辑,就是围绕这个偏离量做阈值比较。

常见做法是让 LC 回路谐振在 1MHz 到 5MHz 之间,具体值取决于你的线圈匝数和电容选型。线圈直径越大,检测距离越远,但灵敏度会下降;线圈越小,灵敏度高但检测范围窄。这个取舍在程序里体现为阈值的设定,后面会细说。

2.2 程序整体架构与数据流

这套完整版程序大致分四层:底层 SPI 驱动、LDC1000 寄存器配置层、数据采集与滤波层、判定与输出层。数据流是这样的:单片机通过 SPI 周期性读取 LDC1000 的 Proximity Data 寄存器,原始数据经过滑动平均滤波去掉抖动,然后和预设阈值比较,超过阈值就判定为「检测到金属」,通过串口或 GPIO 输出结果。

程序里通常会有两个工作模式:一个是校准模式,用来采集当前环境下的基准读数;另一个是检测模式,实时比较当前读数和基准值的偏差。校准这一步很关键,因为不同线圈、不同安装环境下的基准值差异很大,不校准直接跑,阈值根本没法设。

// LDC1000 寄存器配置示例(SPI 写操作) // 以下为常见配置项,具体地址以数据手册为准 #define LDC1000_CMD_RP_MAX 0x01 // Proximity 最大响应值 #define LDC1000_CMD_RP_MIN 0x02 // Proximity 最小响应值 #define LDC1000_CMD_SENSOR_FREQ 0x03 // 传感器频率设置 #define LDC1000_CMD_LDC_CONFIG 0x04 // 转换配置 #define LDC1000_CMD_CLK_CONFIG 0x05 // 时钟配置 void LDC1000_Init(void) { SPI_Write(LDC1000_CMD_RP_MAX, 0x80); // 设置响应上限 SPI_Write(LDC1000_CMD_RP_MIN, 0x00); // 设置响应下限 SPI_Write(LDC1000_CMD_SENSOR_FREQ, 0x10); // 传感器频率分频 SPI_Write(LDC1000_CMD_LDC_CONFIG, 0x17); // 转换频率与死区时间 SPI_Write(LDC1000_CMD_CLK_CONFIG, 0x00); // 内部时钟,分频系数 }

这段初始化代码的逻辑是:先设定 Proximity 数据的有效范围,再配置传感器频率分频系数,最后设置转换配置和时钟源。参数说明上,RP_MAX和RP_MIN决定了 Proximity Data 的满量程范围,一般设成 0x80 和 0x00 覆盖大部分场景;SENSOR_FREQ的分频值要根据你的 LC 谐振频率来算,设错了读数会完全不对;LDC_CONFIG里的转换频率决定了采样率,太高会引入噪声,太低响应迟钝。我一般会先把这几个寄存器按典型值配好,跑起来看读数是否在合理范围,再微调。

2.3 数据采集与滑动平均滤波

原始 Proximity Data 抖动是常态,尤其在线圈引线较长或者电源不稳的情况下。程序里一般用滑动平均滤波,窗口大小取 8 或 16。窗口太小滤波效果差,太大响应延迟明显。对于手持式探测或者动态检测场景,窗口取 8 比较均衡。

#define FILTER_WINDOW 8 static uint32_t filter_buf[FILTER_WINDOW]; static uint8_t filter_idx = 0; uint32_t LDC1000_GetFilteredData(void) { uint32_t raw = SPI_Read(LDC1000_CMD_PROXIMITY); // 读原始数据 filter_buf[filter_idx] = raw; filter_idx = (filter_idx + 1) % FILTER_WINDOW; uint32_t sum = 0; for (uint8_t i = 0; i < FILTER_WINDOW; i++) { sum += filter_buf[i]; } return sum / FILTER_WINDOW; // 返回平均值 }

这段代码每次读取新数据后替换最旧的一个样本,然后求平均。逻辑说明:滑动平均能有效抑制随机噪声,但对突变响应有延迟,窗口越大延迟越大。参数说明:FILTER_WINDOW建议在 4 到 16 之间选,静态检测可以取大一点,动态检测取小一点。如果发现滤波后数据仍然跳变,先查电源纹波和 SPI 时钟是否过高,再考虑加大窗口。

3. 程序跑起来:校准、阈值设定与串口联调

3.1 校准流程与基准值采集

校准是这套程序能不能用的分水岭。我见过太多人跳过校准直接设阈值,结果换个环境就翻车。校准的逻辑很简单:在确认没有金属物体的环境下,连续采集 N 个 Proximity Data,取平均值作为基准值 baseline。N 一般取 50 到 100,太少基准不稳,太多浪费时间。

uint32_t LDC1000_Calibrate(uint16_t samples) { uint64_t sum = 0; for (uint16_t i = 0; i < samples; i++) { sum += SPI_Read(LDC1000_CMD_PROXIMITY); delay_ms(5); // 等待转换完成 } return (uint32_t)(sum / samples); // 返回基准值 }

逻辑说明:校准期间要确保检测区域干净,线圈安装位置和实际使用一致。参数说明:samples建议 50 到 100,delay_ms要大于 LDC1000 的转换周期,否则读到重复值。校准完成后把 baseline 存到变量或 Flash 里,检测时用当前读数减去 baseline 得到偏差量。

3.2 阈值判定与灵敏度调节

有了基准值,判定逻辑就是:偏差量超过阈值就输出「检测到金属」。阈值设多少,取决于你的检测距离要求和环境噪声水平。一般做法是先设一个保守值,比如偏差超过 baseline 的 5% 就触发,然后根据实测调整。

#define DETECT_THRESHOLD_PERCENT 5 // 触发阈值百分比 uint8_t LDC1000_DetectMetal(uint32_t baseline) { uint32_t current = LDC1000_GetFilteredData(); uint32_t diff = (current > baseline) ? (current - baseline) : (baseline - current); uint32_t threshold = baseline * DETECT_THRESHOLD_PERCENT / 100; if (diff > threshold) { return 1; // 检测到金属 } return 0; }

逻辑说明:这里用的是绝对偏差百分比,好处是不同基准值下阈值自适应。参数说明:DETECT_THRESHOLD_PERCENT越小灵敏度越高,但误触发也越多;一般从 5% 开始试,如果检测距离不够就降到 3%,如果误触发多就升到 8% 到 10%。注意,金属种类不同,涡流强度不同,铝和非磁性不锈钢的响应会比铁弱很多,阈值要留余量。

3.3 串口输出与上位机观察

调试阶段强烈建议把数据通过串口打出来,用上位机画曲线。你能直观看到基准值稳不稳、金属靠近时偏差量多大、阈值设得合不合理。程序里一般会格式化输出当前读数、基准值、偏差量和判定结果。

void UART_ReportData(uint32_t baseline, uint32_t current, uint8_t detected) { printf("BASE:%lu CUR:%lu DIFF:%ld DET:%d\r\n", baseline, current, (long)(current - baseline), detected); }

逻辑说明:printf重定向到串口后,上位机按行解析即可。参数说明:波特率一般用 115200,数据格式8N1。如果串口输出乱码,先查时钟配置和波特率是否匹配。我一般会在上位机里同时画 baseline 和 current 两条线,baseline 应该是平直的,current 在金属靠近时出现明显偏移,这样一眼就能判断程序是否正常。

4. 避坑与排查:LDC1000 调试中最容易翻车的五个点

4.1 读数始终为零或满量程

现象:上电后 Proximity Data 一直是 0 或者 0xFFFFFF,怎么改阈值都没反应。原因通常是 SPI 通信没通,或者 LDC1000 根本没进入正常工作状态。先查 SPI 的 CS、CLK、MOSI、MISO 四根线有没有接反或虚焊,再用示波器看 CLK 有没有波形。如果 SPI 正常,查 LDC1000 的供电和复位引脚,有些模块需要外部给一个复位脉冲。解决:用逻辑分析仪抓一次 SPI 时序,确认读写地址和数据的顺序符合数据手册要求,特别注意 LDC1000 的 SPI 是上升沿采样还是下降沿,配错了读回来全是 0。

4.2 基准值漂移导致误触发

现象:校准完放那儿不动,过几分钟就自己触发一次。原因是基准值随温度或电源电压漂移了。LDC1000 的读数对电源纹波很敏感,尤其模拟供电部分。解决:给 LDC1000 的供电加 LC 滤波,数字地和模拟地分开走线;程序里加一个自动跟踪机制,当连续多次读数都在基准附近小幅波动时,缓慢更新 baseline,但更新速率要远低于检测响应速率,避免把真实检测信号也跟踪掉。

4.3 检测距离远低于预期

现象:线圈明明不小,但金属要贴得很近才有反应。原因可能是 LC 谐振频率没匹配好,或者 RP_MAX/RP_MIN 范围设得太窄。解决:先确认线圈电感和电容算出来的谐振频率在 LDC1000 支持范围内,一般 1MHz 到 5MHz;然后检查SENSOR_FREQ分频值是否对应这个频率。如果都正确,尝试增大线圈直径或减少匝数,同时把RP_MAX调大,让 Proximity Data 的动态范围更宽。

4.4 不同金属响应差异巨大

现象:铁块一靠近就触发,铝片靠近几乎没反应。这是物理特性决定的,铁磁性金属涡流强,非磁性金属涡流弱。解决:如果应用场景需要检测多种金属,阈值要按最弱响应的金属来设,或者用两个阈值分档判定。程序里可以加一个「信号强度等级」输出,而不是简单的 0/1 判定,这样上位机可以根据强度做二次判断。

4.5 串口数据跳变但实际没有金属

现象:串口打印的偏差量时不时跳一下,但检测区域确实没有金属。原因可能是 SPI 读取时序被中断打断,读到了半截数据,或者滤波窗口太小。解决:读 SPI 时关中断,保证一次读取原子性;把滤波窗口从 4 加大到 8 或 16;检查电源上是否有大功率器件周期性工作引入干扰。如果以上都排除了,用示波器看 LDC1000 的模拟输出引脚,确认芯片本身输出是否稳定。

5. 进阶技巧:用差分线圈和动态阈值把稳定性再提一档

如果你已经把基础版跑通,但觉得稳定性还差口气,可以试试两个进阶做法。第一个是差分线圈结构:用两个参数相同的线圈,一个作为检测线圈,一个作为参考线圈,分别接到两路 LDC1000 或者通过模拟开关切换。环境温度变化和电源漂移会同时作用于两个线圈,相减之后共模干扰被抵消,剩下的就是金属靠近引起的差模信号。这个做法在 TI 杯这类赛题里很实用,能明显降低误触发率。

第二个是动态阈值。固定阈值在环境变化大的场景下很吃力,动态阈值的思路是:持续统计最近一段时间内偏差量的均值和标准差,把阈值设成均值加三倍标准差。没有金属时,偏差量围绕零波动,阈值自动收紧;有金属靠近时,偏差量突增,超过动态阈值触发。这样既保证了灵敏度,又抑制了误触发。

// 动态阈值简化实现 #define STAT_WINDOW 32 static int32_t diff_buf[STAT_WINDOW]; static uint8_t stat_idx = 0; uint8_t LDC1000_DetectMetalDynamic(uint32_t baseline) { uint32_t current = LDC1000_GetFilteredData(); int32_t diff = (int32_t)(current - baseline); diff_buf[stat_idx] = diff; stat_idx = (stat_idx + 1) % STAT_WINDOW; // 计算均值和标准差 int32_t sum = 0; for (uint8_t i = 0; i < STAT_WINDOW; i++) sum += diff_buf[i]; int32_t mean = sum / STAT_WINDOW; int32_t sq_sum = 0; for (uint8_t i = 0; i < STAT_WINDOW; i++) { int32_t d = diff_buf[i] - mean; sq_sum += d * d; } int32_t stddev = sqrt(sq_sum / STAT_WINDOW); int32_t dynamic_threshold = mean + 3 * stddev; // 三倍标准差 if (diff > dynamic_threshold) return 1; return 0; }

逻辑说明:每次采集新偏差量后更新统计窗口,计算均值和标准差,阈值随环境自动调整。参数说明:STAT_WINDOW取 32 或 64,太小统计不稳,太大响应迟钝;三倍标准差是常用经验值,要求更灵敏可以降到两倍,但误触发会增加。注意这个实现里用了sqrt,在单片机上如果没浮点单元,可以改用平方比较避免开方。

还有一个细节:线圈的安装方式对稳定性影响极大。线圈引线要尽量短且固定,避免晃动改变分布电容;线圈背面可以贴一层屏蔽铜箔,减少背面方向的干扰。这些是硬件层面的功夫,程序再优化也替代不了。

从那以后我每次调 LDC1000,都强制先跑一遍校准、再看串口曲线、最后才设阈值,顺序颠倒一次就多调半天。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

PyQt与深度学习的急性胰腺炎智能辅助诊断系统:医工结合毕设全解析

PyQt与深度学习的急性胰腺炎智能辅助诊断系统:医工结合毕设全解析

带“计算机毕设”标签的项目&#xff0c;大家最关心的往往不是“能不能跑通”&#xff0c;而是“答辩能不能过”“创新点够不够”“导师问到原理时能不能扛住”。今天我要拆的这个题目&#xff0c;是典型的多技术栈综合题&#xff1a;PyQt基于深度学习的急性胰腺炎智能辅助诊断…

2026/10/21 4:00:36 阅读更多 →
PyQt与深度学习驱动的急性胰腺炎CT影像辅助诊断系统开发实践

PyQt与深度学习驱动的急性胰腺炎CT影像辅助诊断系统开发实践

急性胰腺炎这类病&#xff0c;起病急、进展快&#xff0c;影像科医生拿到CT影像后往往需要快速给出结论。放在毕业设计的语境里&#xff0c;我们要做的不是训练一个模型让它自己“看病”&#xff0c;而是搭建一套完整可落地的系统&#xff1a;前端用PyQt做桌面客户端&#xff0…

2026/10/21 4:00:36 阅读更多 →
用先知AI精炼产品语言:把男装概念变成爆款的翻译方法论

用先知AI精炼产品语言:把男装概念变成爆款的翻译方法论

做了几年男装产品开发&#xff0c;我越来越觉得&#xff0c;爆款和滞销款之间&#xff0c;差的往往不是运气&#xff0c;而是一套能贯穿始终的“产品语言”。很多团队拿着一堆概念开会&#xff0c;最后做出来的衣服却四不像&#xff0c;就是因为概念在传递过程中被稀释、被误解…

2026/10/21 4:00:36 阅读更多 →

最新新闻

彻底搞懂 torch.manual_seed:从随机种子原理到完整复现配置指南

彻底搞懂 torch.manual_seed:从随机种子原理到完整复现配置指南

有一段时间我被一个现象折磨得不轻&#xff1a;同一份训练代码&#xff0c;连超参数都没动&#xff0c;下午跑出来的模型和早上跑的模型&#xff0c;准确率能差上两个点。排查到最后&#xff0c;问题根源锁定在所有随机数的源头——torch.manual_seed() 这个函数上。准确地说&a…

2026/10/21 4:49:55 阅读更多 →
REA建模实践指南:用资源、事件、代理重构业务系统

REA建模实践指南:用资源、事件、代理重构业务系统

看到"rea"这个题目&#xff0c;我第一反应是可能有人想写"React"但少打了一个"ct"&#xff0c;也可能是随手起的名字。真要按网络热词去搜&#xff0c;确实能搜出一堆不相干的结果。但在做业务系统设计和架构落地的人眼里&#xff0c;"REA&…

2026/10/21 4:49:55 阅读更多 →
破解AI五大迷思:从魔法到失控,正确评估与落地AI的关键指南

破解AI五大迷思:从魔法到失控,正确评估与落地AI的关键指南

我在一线做AI落地项目已经有几年了&#xff0c;见过太多团队在“AI时代的迷思”里打转&#xff1a;有人把AI当成许愿池&#xff0c;有人把AI当成毁灭者&#xff0c;还有人干脆觉得AI就是个高级搜索引擎。这些认知偏差&#xff0c;比模型本身的缺陷更危险。因为带着错误预期去立…

2026/10/21 4:49:54 阅读更多 →
ArcGIS中长三角shp底图的坐标系、图层配置与出图指南

ArcGIS中长三角shp底图的坐标系、图层配置与出图指南

简介&#xff1a;面向ArcGIS用户的最新长三角shp矢量底图&#xff0c;覆盖上海直辖市及江苏、浙江、安徽三省共27个地级及以上城市中心区&#xff0c;适合区域规划、经济地理、交通物流等领域的专题制图与空间分析。资源包共10个文件&#xff0c;以shp矢量主文件为核心&#xf…

2026/10/21 4:49:54 阅读更多 →
从0到1搭建AI虚拟员工平台:选型、配置与上线全流程实操

从0到1搭建AI虚拟员工平台:选型、配置与上线全流程实操

大家好&#xff0c;我是那个喜欢把开源项目往生产环境里折腾的人。前阵子帮团队搭建了一套AI虚拟员工平台&#xff0c;从最开始的源码获取&#xff0c;到本地跑通&#xff0c;再到正式环境上线&#xff0c;整个过程花了一周多。如果你正准备搞类似的东西&#xff0c;我先把话放…

2026/10/21 4:49:54 阅读更多 →
YOLOv11集成DCNv4:提升遮挡与形变目标检测精度的实战指南

YOLOv11集成DCNv4:提升遮挡与形变目标检测精度的实战指南

做目标检测调试最怕什么&#xff1f;不是模型不收敛&#xff0c;而是看起来收敛得不错&#xff0c;一测遮挡目标、拉伸形变目标就全线垮掉。这正是我此前在一个检测项目里用YOLOv11时遇到的现状。YOLOv11把骨干和颈部安排得很顺手&#xff0c;但底层还是普通卷积&#xff0c;对…

2026/10/21 4:48:54 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →