单片机函数信号发生器设计与实现:从波形生成到调试实战
工程上搞过多年单片机和嵌入式开发的人都有体会调试电路或者验证一个模块到底通不通手里没个能随手出波形的家伙事儿心里总是没底。买成品函数信号发生器当然省事可面对某些非标频率、特殊幅度需求或者想把它集成到某个自动化测试环境里时总被各种限制捆住手脚。于是我用单片机做过一台函数信号发生器专门用来生成正弦波、方波、三角波、锯齿波这几种基础波形还能顺带调频率、调幅值。这篇文章就是把当时踩过的坑、验证过的方案、以及最后稳定跑起来的完整流程整理出来给同样有这类需求的开发者做个参考。这次只谈实测中靠谱、成本可控、且能真正上手复现的路径。1. 项目整体设计思路拆解1.1 函数信号发生器到底在解决什么问题函数信号发生器说人话就是能按设定输出不同波形的仪器。大家最常用的场景是给某个滤波器喂一个正弦波看它衰减多少给电机驱动板送一路PWM方波看它响应速度给音频电路灌入三角波测动态范围或者干脆作为传感器激励源做长期稳定性测试。整套设备核心的诉求可以拆成三条第一波形种类要够用不能只出正弦第二频率范围要覆盖实际工程中常见的几百赫兹到几十千赫兹某些场合甚至要到几百千赫兹第三幅度和偏移要可调至少能调到常见的TTL电平、运放供电范围以及音频信号范围。这三点基本决定了主控选型、波形生成方式和输出级电路的设计方向。很多人一开始把函数信号发生器想复杂了觉得要用专用的DDS芯片才算正经方案。实际上只要把频率上限约束在单片机的有效吞吐范围以内完全可以用查表加定时器中断的方式生成质量不错的波形。这个思路的好处是硬件简单、代码可控、调试方便对大多数非射频类的测试需求已经足够。1.2 为什么选用单片机而不是直接买成品成品仪器的优势不言而喻频带宽、精度高、界面友好。可它有两个让我不舒服的地方一是价格哪怕入门级型号也要几百块起步对于预算有限的学生党或者只是偶尔用一次的开发者来说有点肉疼二是封闭性成品大多不能按自己的测试逻辑去改比如想做一个扫频功能或者想在外触发模式下精确同步输出波形仪表固件根本不给你这个接口。单片机方案正好补上这两个短板。芯片可以从几块钱到二十块钱不等外围器件加起来一般不超过五十块。它灵活到什么程度呢想改波形形状、想加一个调制模式、想通过串口让上位机控制频率都只是改固件的问题。这种“软硬一体”的可塑性是台式仪器给不了的。当然也不是说把成品仪器一棍子打死。如果你需要的是高端测量级的信号纯度比如超低相位噪声、极低失真那单片机方案确实不适合毕竟它受限于DAC分辨率和主控时钟抖动底子就在那里。但对于嵌入式调试、控制电路验证、传感器激励、音频初步测试这些场景单片机输出波形的精度完全够用。1.3 整体链路规划与系统架构设计我在设计这个项目的时候把整个信号链路分成五个环节人机交互层、波形数据生成层、数模转换层、信号调理层、输出保护层。人机交互层按键或者旋钮编码器负责设定频率、波形类型、幅值数码管或者小屏幕负责显示当前参数。波形数据生成层负责在定时器的节拍下逐点输出波形数值。关键是选好每周期采样点数和更新频率这两个参数直接决定输出波形的频率分辨率和高频上限。数模转换层把数字波形值变成模拟电平。这里可以用单片机的内置DAC也可以用并行接口接外部DAC或者干脆用PWM加滤波。三种方案各有适用场景。信号调理层把DAC输出的弱信号放大到需要的幅度同时做阻抗匹配和低通滤波保证输出的波形干净、驱动能力够。输出保护层防止外部误接电压倒灌或者输出短路时烧坏主控和运放。整体链路想清楚之后剩下的事情就是照着每一层去选器件、画电路、写驱动。很多人上来就急着写正弦波查表代码结果后面因为输出阻抗太高导致带不动负载又回头改硬件反而浪费更多时间。先设计链路再逐层实现节奏要对。2. 硬件方案与核心器件选型2.1 主控芯片8位机与32位机的取舍主控是整台仪器的中枢。我在这个方案里实际采用了32位MCU但并不是说8位机做不了只是想清楚两者边界在哪。8位MCU的优势是生态简单、上手快、成本极低但波形更新需要定时器中断高频触发这个对CPU的上下文切换压力和中断延迟要求都不低。特别是在同时要做按键扫描、显示刷新、频率换算的时候8位机在多任务缝缝补补之间会显得捉襟见肘。当然有人能把8位做到很好但在项目时间不充裕的情况下没必要给自己添麻烦。32位MCU的优势主要体现在这几方面主频高能支撑更快的DAC更新率DMA可以直接把波形表数据往DAC寄存器送不占CPU内部Flash和RAM容量大甚至可以放多组波形表或做实时计算。选用它之后代码写起来心理负担小很多后面想扩展扫频、调幅、调制等功能也留足了余量。至于具体型号其实只要满足“有DAC、有定时器、有DMA、主频不低于几十兆”这四条都可以胜任。用某款常见国产MCU或国际大厂的通用系列都没问题不需要盲目追新。开发者手上有什么或者库函数用得顺手就用哪个不必在这上面纠结。2.2 DAC方案内置DAC、外置DAC与PWM滤波DAC决定了波形在幅度轴上的分辨率。这个项目里最常见的三个路线我从实际效果和性价比两个维度做了对比内置DAC很多32位MCU内部集成了12位DAC比如常见的某F系列就是双通道12位。优点是硬件省事、直接用库函数就能配置缺点是输出是电压型驱动能力很弱基本上后面必须接一级运放缓冲而且采样率受DAC本身转换时间的限制适合低频、中频段。并行外置DAC如果追求高更新率和高分辨率可以考虑并行的外部DAC芯片。但因为要占用大量GPIO而且涉及并行时序现在的MCU引脚资源往往不够宽裕除非做专用板否则不建议把它作为第一选择。PWM加低通滤波这个方案看似省钱但实际调过的都知道输出纹波大、建立时间长要得到平滑波形就得把滤波器的截止频率压得很低这会直接限制信号带宽。简单的应用可以玩但要做严肃的波形输出不建议选它。我最终的方案是“内置DAC 运放低通滤波”。12位分辨率在1V/5V的输出范围内能实现大概1.2mV级别的步进对绝大多数测试场景绰绰有余。而且双通道还能留一个备用以后做正交信号输出直接就有现成硬件。2.3 运放输出级与信号调理电路DAC出来的信号是有一个固定直流偏置的弱信号不处理直接拿出去用会出两个问题一是带不动负载接一个几百欧的电阻电压就掉下来了二是波形可能被抬升到一个不适合被测电路的直流电平上。所以运放输出级是本项目里我最重视的一环。第一级用高输入阻抗的运放做电压跟随把DAC输出和后面电路隔离开第二级用同相放大或者衰减网络把信号幅度规整到需要的输出范围并由一个电位器做连续调节。这样既解决了驱动能力问题又给用户留了一个“粗调细调”的调节手感。在选择运放型号时重点看三个参数输入偏置电流、压摆率、以及输出轨到轨能力。这里要特别提醒的是压摆率很多通用运放压摆率只有零点几伏每微秒输出5V峰峰值、频率上到200kHz时就会出现明显的波形履带失真。后来我把输出级换成了压摆率够高的运放问题迎刃而解。信号调理级还有一个隐藏功能就是用来做幅值校准毕竟DAC输出的参考电压有误差、运放增益也有误差最终在BNC端口的实测幅度和理论值之间往往需要一点点修正这部分在固件里做软件校准也行用电位器硬件校准也行我是两个都用上了。3. 波形生成算法与核心参数计算3.1 波形表与中断更新机制的配合输出一个平滑的正弦波最直接的思路是正弦查表在程序里预先算好一个周期的离散值然后定时器每次触发就把表里的下一个值送到DAC。听起来简单落地时有两个关键参数要定采样点数和更新周期。采样点数决定波形的相位分辨率和谐波含量。点数太少台阶感明显谐波杂散大点数太多占Flash空间且对更新率要求高。我的经验是一周期128点能在绝大多数频率下兼顾效果和开销。更新周期由主频分频得到输出频率的计算公式是F_out F_timer / N_samples其中F_timer是DAC更新频率N_samples是每周期采样点数。这个公式简单到一眼能看明白但是调试时反而容易忽略它背后的约束频率越高F_timer就得越高而F_timer受到DAC转换时间、中断开销和代码执行时间的多重限制。如果你用DMA定期把波形表数据搬到DAC寄存器MCU本身几乎不参与逐点搬运可以把F_timer推得更高这是32位平台最舒服的用法。3.2 频率调节从直接分频到相位累加器直接改定时器分频系数来调频率属于最朴素的做法。优点是思路直观缺点是输出频率等于基础时钟除以整数存在量化步进。假如基础节拍是1MHz你想要30kHz输出一周期128点那么更新率就要求128×30k3.84MHz这时1MHz不够用只能换分频比频率调起来非常别扭。更优雅的方案是相位累加器。每来一个采样节拍累加器加上一个频率控制字累加器的高位作为查表索引。输出频率公式变成F_out F_sample × Phase_step / 2^N其中F_sample是采样节拍频率Phase_step是每次累加的频率控制字2^N是累加器位宽。这样做的好处是频率分辨率只取决于累加器位宽想调多细就调多细而且查表索引可以搬移天然支持从正弦波表里截取任意相位段实现相位移相。我最终采用的正是相位累加器方案。它在代码里的直观体现是一个32位变量不断自加每次取其高8位或者高9位去查表。这样的实现方式稳定、通用后来我加扫频功能时只需要循环更新Phase_step就能获得平滑的频率变化完全没有跳变感。3.3 多种波形的统一查表框架很多人觉得一个函数信号发生器要做几种波形就得写几种不同的生成函数其实完全可以把它们统一在一个查表框架里。方法很朴素建立多个波形表或者在一个大表里分段存储然后用同一个相位累加器去取数。正弦表按sin函数预计算256点离散值。三角波表线性上升后线性下降本质上就是数学上分段直线计算时直接生成表项不需要依赖三角函数库。锯齿波表从0线性增加到满幅后瞬间跳回0。方波只需要两个数值0和满幅连表都不用建索引查表时直接判断相位是前半周期还是后半周期。这样做的好处体现在扩展性上。后面想加噪声输出不需要重新造轮子单独做一张随机数表塞进取数框架就行。想加双音合成直接弄两个相位累加器让它们分别查正弦表再把结果相加代码量也不大。这个“统一取数框架”的思路让我省了很多后续迭代时间。4. 实操搭建与调试记录4.1 焊板与接线注意事项硬件搭建开始之前我建议先理一理电源。单片机、运放、DAC供电要分清模拟和数字域至少保证模拟部分的供电用LDO单独给不要直接从USB的5V上乱拉。数字走线和模拟走线分开减小DAC输出的噪声。我在这块吃过亏一开始图省事负压和5V共地布线很乱导致输出波形上叠加了一个高次毛刺看起来不明显但对要求严格的测量就过不去。焊接顺序上优先焊电源部分通电确认各路电压正常后再焊主控接着是DAC和运放最后再接插座、编码器、屏幕这些外围。这种顺序的好处是便于分级排查一旦上电后电流异常可以快速缩小范围。接线中有一个很容易被忽略的细节运放输出端到BNC座之间尽量短而且信号线最好用带屏蔽层的线。否则长线会引入寄生电容高频段波形边缘变圆、幅值跌掉容易被误判为驱动能力不足其实是线路问题。4.2 调试顺序先看静止电平再看动态波形上电之后别急着输出波形。先写一个最简单的程序让DAC输出一个固定电压值用万用表测实际电压和设定值的偏差确认DAC和运放这一整条链路的静态精度是否正常。如果这里偏差就很大后面波形幅值再准也白搭。校准完静态电平再让它输出一个低频1kHz正弦波此时用示波器观测重点看波形是否平滑、有没有台阶感以及幅度是否与理论一致。低频验证没问题后开始逐步提高频率。这里有个重要的经验值当输出频率高于某个临界值后一周期128点的查表法会开始不够用。这时要不增加每周期采样点数要不提高定时器更新率二者必选其一。我当时在200kHz以上就遇到了这个问题经验是多做几组波形表低频用高点数平滑输出高频段适当降低点数以换取更高更新频率。4.3 实测波形数据分析这块我在自己的实测板上跑了一组数据方便你直观理解不同频率下的表现设定频率实测频率峰峰值误差波形形态1kHz999.9Hz1%平滑无明显台阶10kHz10.01kHz1%平滑边沿清晰50kHz49.96kHz1.5%轻微台阶感可接受200kHz197.4kHz2%边缘变圆幅值略降从数据里能看到两个趋势频率越高定时器分频误差和运放带宽限制的影响越明显幅值在高频段下跌是输出级运放带宽和PCB寄生电容综合作用的结果。做到200kHz还能稳定输出对自制的信号源来说已经是一个不错的成绩了。想要继续冲高频就得换更高带宽的运放并在输出级加入可选的50欧阻抗匹配网络。5. 常见问题速查与定位思路5.1 输出波形上有毛刺或台阶感这是做这个项目时最常遇到的问题。排查顺序我建议从简到繁先看DAC输出的数字信号部分是否干净。很多毛刺其实是数字信号干扰耦合到了模拟输出上。可以通过降低MCU输出翻转速率、加宽DAC供电的滤波电容来解决。其次检查DAC的参考电压引脚如果这个引脚没有足够的去耦电容输出上的毛刺会特别明显。台阶感则和波形表点数有关点数越多台阶越小但CPU负担变大。如果台阶只在高频出现通常是更新率不够提高F_timer后能明显改善。5.2 频率设置和实测差异大频率偏差点先不要怀疑芯片多数情况出在你的时钟源上。单片机内部RC振荡器误差通常在1%到2%之间做低速演示还凑合但函数信号发生器对频率精度有要求必须使用外部晶振。把系统时钟切换到外部晶振之后频率准确性会有明显提升。如果换完晶振仍然有固定比例偏差那么就是相位累加器公式里的分频系数或者时钟树配置出了问题。拿示波器测一下MCU实际主频再回算频率控制字就能找到症结。5.3 输出信号带载后幅值跌落明显这个问题几乎都是输出级驱动能力不足导致的。如果后端接的是几兆欧的示波器探头还好一旦接几十欧或者几百欧的真实负载DA直接输出肯定撑不住。解决方法是加电压跟随器再加功率输出级。如果加了运放还是跌大概率是运放的输出电流保护限制了可以计算一下负载需要的电流是否超出了运放的极限。还有一个容易被忽略的点如果输出有隔直电容低频时容抗很大会造成明显的幅值跌落这时要么提高隔直电容容量要么干脆用直流耦合。5.4 按键调节频率时波形偶尔卡顿这个问题的根源通常不在波形生成算法而在人机交互和中断的优先级搭配上。按键扫描、显示刷新可能在某个时刻打断了高优先级的DAC中断。解决办法是给DAC的采样节拍设置最高的优先级同时人机交互的界面刷新不要占用中断而是放到主循环里处理。如果真的需要极高频的更新还可以考虑用DMA方式代替中断方式彻底免除CPU参与每个点的搬运。6. 用这台信号发生器做了哪些实际验证做完这台仪器我第一时间拿它做了几组有意思的验证。试过给一个二阶低通滤波器扫频输入正弦波从100Hz慢慢爬到50kHz看幅频曲线的滚降情况整个过程完全由这台自制发生器驱动没有掉链子。试过给一块步进电机驱动板送入方波用来判断驱动芯片的响应延迟这个场景下方波的边沿质量和幅值稳定度直接决定了测量可信度。还试过把三角波灌进一个简易比较器电路用它产生特定阈值的触发脉冲也顺利跑通了。这些验证让我认识到自制信号发生器的价值不在参数上比肩台式仪器而在它把“可定制”这个自由度交还给了开发者。当你发现波形形状需要微调或者需要一个扫频起始频率、需要一组特定的双音信号时打开代码改几行就出结果这种效率是买成品很难体验到的。7. 经验总结与扩展思路如果让我重新做一遍这个项目第一件事仍是先把信号链和电源处理好再考虑算法细节。硬件底子好代码调试就顺硬件底子乱后面全是坑。在此基础上有几个扩展方向非常值得尝试。一是增加扫频模式相位累加器天然支持频率动态变化只需在主循环周期性更新频率控制字就能实现线性或对数扫频二是加入调制功能比如用慢速三角波作为幅度调制信号、乘以高频载波就能产生AM调制波形这些在原有框架上改动量都不大三是把系统做成上位机可程控通过串口或无线模块连接PC或者手机实现在电脑上画波形、调参数这在自动化测试里会特别实用。这种基于单片机开发的函数信号发生器最终的价值不只是那一堆波形而是对信号链路的深度理解。很多工程师用了好多年示波器和信号源却未必仔细思考过DAC输出、运放带宽、阻抗匹配以及采样理论这些底层机制。亲手搭一遍很多概念就通了这是买仪器带不给你的收获。

相关新闻

diagram-design:从草图到系统的图表设计方法论与实操指南

diagram-design:从草图到系统的图表设计方法论与实操指南

1. 从一张草图到一套系统:diagram-design 到底在解决什么问题 第一次看到 “diagram-design” 这个标题,很多人会以为它只是教你怎么画图——选个模板、拖几个框、连几条线,导出 PNG 就完事了。但真正做过技术方案、写过设计文档、给团队讲过…

2026/10/19 11:14:28 阅读更多 →
RH850 GPIO开发实战:寄存器配置与车载踩坑指南

RH850 GPIO开发实战:寄存器配置与车载踩坑指南

做车载ECU开发这些年,绕不开的MCU平台里,RH850绝对算一个。原因很简单:出货量大、车规级可靠性高、工具链成熟,不管是车身控制、BMS管理还是域控制器里的网关模块,到处都能看到它的影子。而所有嵌入式开发的第一步&…

2026/10/19 11:14:28 阅读更多 →
Kubernetes持久化存储实战:PV与PVC从原理到生产避坑指南

Kubernetes持久化存储实战:PV与PVC从原理到生产避坑指南

1. 从一个真实困境说起:Pod重启后数据去哪了刚接触Kubernetes那会儿,我做过一件现在想起来还觉得蠢的事。当时在测试环境部署了一个MySQL的Pod,跑得好好的,数据也写进去了。结果有天节点维护,Pod被调度到另一台机器上&…

2026/10/19 11:14:28 阅读更多 →

最新新闻

kubeadm离线安装Kubernetes集群:镜像准备与常见故障排查

kubeadm离线安装Kubernetes集群:镜像准备与常见故障排查

最近有个朋友问我,能不能在不折腾网络的前提下,用 kubeadm 装一个指定版本的 Kubernetes 集群。他试过几次 kubeadm init ,每次都在拉取 registry.k8s.io 这一步超时,要么就是预检阶段卡了几分钟直接报错。这个问题在受网络限…

2026/10/19 20:31:29 阅读更多 →
UDP+TCP+多线程+Swing:局域网P2P即时通信课设全解析

UDP+TCP+多线程+Swing:局域网P2P即时通信课设全解析

简介:广东工业大学计算机网络课程设计项目,实现基于P2P的局域网即时通信系统,面向计网课设、Java网络编程与P2P应用开发者。系统采用P2P架构,程序既是服务器又是客户端,通过3333端口扫描局域网在线对等方,完…

2026/10/19 20:29:26 阅读更多 →
约束路径规划+改进ICP:复杂曲面点云配准误差降88.2%

约束路径规划+改进ICP:复杂曲面点云配准误差降88.2%

1. 从一组实测数据说起:为什么基础ICP在复杂曲面上总是“差一口气”先把标题里那组数字摆出来:平均误差0.599mm,RMSE 0.826mm,相比基础ICP下降88.2%。做过三维重建的人看到这组数字,第一反应大概率是“降得有点狠”&am…

2026/10/19 20:29:26 阅读更多 →
基于SpringBoot+小程序的掌上智慧医疗预约挂号系统设计

基于SpringBoot+小程序的掌上智慧医疗预约挂号系统设计

1. 项目背景与选题价值每年毕设季都有大量同学私信问同一个问题:想做小程序类的管理系统,又怕撞题、怕做不出来、怕答辩被刁难。我给出的建议向来很直接——B端后台 C端小程序是毕业设计里性价比最高的组合,而这个"基于springboot小程序…

2026/10/19 20:28:21 阅读更多 →
五种经典边缘检测算子详解:从Roberts到Canny的MATLAB实现与对比

五种经典边缘检测算子详解:从Roberts到Canny的MATLAB实现与对比

1. 边缘检测与图像分割的整体思路做图像处理的人应该都有过这样的经历:拿到一张图,最先想知道的往往不是整幅图的颜色分布,而是“这张图里什么东西在哪个位置”。边缘检测就是回答这个问题的基础手段。所谓边缘,说白了就是图像中灰…

2026/10/19 20:28:21 阅读更多 →
中级开发者AI能力升级路线图:从会用AI到会评AI

中级开发者AI能力升级路线图:从会用AI到会评AI

给中级开发者的 AI 能力升级路线图这两年 AI 编程工具发展太快,几乎每隔几个月就有新东西出来。不少中级开发者心里其实挺焦虑的:一边是网上铺天盖地的“AI 取代程序员”论调,一边是各种新工具、新模型层出不穷,感觉不学就要掉队。…

2026/10/19 20:28:21 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →