PID控制从原理到实战:电机调速与恒温控制的闭环调参指南
开篇先聊个我这些年做项目经常遇到的场景某个电机调速系统空载时转速还挺匀一带上负载转速就往下掉某个恒温箱加热时温度冲到目标值以上好几度才慢慢回来某个四轮小车走直线一有偏差就左右来回画龙。这些问题看着五花八门根子其实都指向同一个控制问题系统有了偏离目标的偏差该怎么快速、平稳、不折腾地把偏差压回去。而绝大多数现场采用的方案就是今天要说的PID控制基础。PID控制这三个字母估计搞过自动化、嵌入式、机器人、电气、过程控制的兄弟都见过它由比例Proportional、积分Integral、微分Derivative三个环节组成。说它基础是因为它是所有自动控制入门的必修课说它有用是因为在绝大多数现场应用里一个调好参数的PID已经能解决80%以上的闭环控制需求不需要一上来就上什么模型预测、自适应控制那些复杂东西。这篇内容我打算用我自己从零到一搭建一个闭环控制的小项目来展开把PID的每个环节掰开揉碎讲清楚再把手动整定参数、代码实现、现场调参踩过的坑一并整理出来。适合刚入门自动控制的学生、搞嵌入式开发的工程师或者想把自己的加热、调速、温控系统做稳定的爱好者参考。文章里我不会堆一堆晦涩的传递函数公式尽量用大白话和实际案例把逻辑讲透。1. PID控制到底在解决什么问题1.1 开环控制的最大矛盾只管给指令不管结果先说个简单的场景我想让一个直流电机以每分钟300转的速度旋转直接给电机控制板一个固定占空比的PWM信号比如60%占空比。电机空载时实测转速可能刚好是300转但要是用手轻轻捏住电机轴转速立刻掉到200转甚至更低。这个过程中我给出去的PWM信号始终是60%压根不知道转速已经掉了更不会主动去补偿——这就是开环控制。开环控制的本质是“只下指令不看结果”。它在系统模型精确、外部干扰小、执行机构状态稳定的情况下可以用比如步进电机在不过载、不失步的前提下给多少脉冲走多少角度基本不用反馈也能凑合。可一旦负载变化、电源电压波动、机构摩擦变大开环系统的输出就跟着飘而且飘到哪算哪没有任何纠正机制。我调试这个电机转速项目时最直观的感受就是风速、轴摩擦、电池电压这些外部因素全在干扰转速开环根本稳不住。想用开环把转速稳定在目标值附近唯一的办法是把系统模型算到足够精细、反复校正控制量可现实中模型总会有偏差干扰也不可预测。所以闭环控制就成了绕不开的选择。1.2 闭环控制的本质让系统自己跟目标做比较闭环控制的核心思路说穿了很简单不断测量当前的实际值跟目标值比较算出偏差然后根据偏差大小和变化趋势决定控制量。还是那个电机如果加了编码器测转速控制器发现当前转速掉到250转、目标300转偏差50转那它就会增大力矩让转速回升直到偏差消失。PID控制器就是闭环控制里那个“根据偏差决定控制量”的算法环节。它把偏差喂进去一顿计算后输出一个控制量比如PWM占空比系统执行这个控制量后改变被控对象的状态再通过传感器测回新的实际值形成一整条信息回路。我习惯把PID拆成三个视角来看比例环节看“现在偏了多少”积分环节看“过去累计偏了多少”微分环节看“现在正在朝哪个方向偏、偏的速度有多快”。这三个视角合在一起控制器就能像一个有经验的操作员那样兼顾当前、过去和趋势来做出判断。1.3 PID控制为什么在各行各业都吃得开PID之所以这么普及除了算法直观、调参不需要精确数学模型之外还有几个很现实的原因一是它的计算量小在简单的单片机、PLC上都能以非常高的频率运行二是它对传感器和执行机构的适应性强温控、液位、转速、角度、流量、压力几乎都能用同一套逻辑套进去三是工程实践经验非常充足各种整定方法、经验公式、现场调试套路都成熟到可以直接抄作业。我做过的一个恒温箱项目加热盘是纯阻性负载温度传感器是一个热电偶在只用一个普通继电器的条件下就可以通过PID输出按一定周期开断继电器把温度稳定在目标值上下0.5度范围内。这种看似“简陋”的组合PID照样能控制得很好。这也是为什么很多工业现场控制柜里最常见的控制器就是一块带PID程序的仪表或者小型PLC。2. P、I、D三个环节到底各自在干什么2.1 P是定盘星偏差越大动作越猛比例环节的公式是Kp * e(t)Kp是比例系数e(t)是当前时刻的目标值与实际值之差。它的逻辑非常直白偏差大控制量就大偏差小控制量就小没有偏差控制量就是零在纯比例控制下。用一个生活化的比喻来理解你开车想保持跟前面车的距离如果前车突然急刹导致距离拉近你就会猛地踩一脚刹车如果距离只是稍微近了一点点你轻轻松一点油门就能修正。这个“距离偏差越大、脚下动作越猛”的对应关系就是比例环节在做的事。但纯比例控制有个天生短板系统带了负载、摩擦或者散热这些外部因素后光靠比例往往压不到精确目标。拿前面那个电机调速项目举例如果只靠P环节当系统达到某个稳态时控制量正好能抵消干扰这时候偏差就不再减小了但偏差也不会为零会留一个固定残差——这个残差就是我们常说的“稳态误差”。经验上记住一条加大Kp能让系统反应更快、稳态误差更小但Kp过大会导致超调变大、系统振荡甚至直接发散。2.2 I是补漏王历史亏欠还是要还的积分环节的公式是Ki * ∫e(t)dt也就是偏差对时间的累计值乘以积分系数。它的存在就是为了消灭纯P控制留下的稳态误差。只要偏差不为零积分项就会一直累计偏差为正积分越来越大增加控制量偏差为负积分越来越小甚至反向偏差为零积分值保持住不再增。继续用开车的例子前面说的“保持车距”场景如果路面是上坡车不踩油门就会越来越慢、车距越拉越大。纯比例控制踩的那点油门不够克服重力于是车距偏差会稳定在一个固定值。这时候如果加一个积分作用只要车距大于目标就慢慢把油门往上加直到车距越来越接近目标最后稳稳保持住。积分环节相当于在持续地把“欠下的账”一件件还清。积分环节的参数整定很容易踩坑。Ki太大会让系统“记账记太猛”输出快速冲到饱和造成超调和振荡Ki太小又会让消除稳态误差的过程拖得很慢。在温度控制这类惯性大的系统里如果Ki设置不当最典型的症状就是温度过冲好几度然后花很长时间拉锯。2.3 D是前瞻者提前刹车别等撞上了才反应微分环节的公式是Kd * de(t)/dt它看的是偏差的变化速度也就是偏差在往哪个方向变、变得有多快。微分项在偏差快速增大时提前输出反向校正在偏差快速缩小时也会反向作用起到“阻尼”效果。回到开车的比喻你离前车距离只剩一点同时前车还在急刹车、相对速度快速下降这时候你不能等到马上就要撞上了才猛踩刹车而是要根据相对速度的变化趋势提前重刹。微分项做的就是这件事——它不关心你现在偏了多少而是关心你正在以多快的速度偏离或者回归。微分项的引入能有效抑制超调让系统更快、更平稳地冲到目标位置。但它有个致命弱点对噪声极度敏感。传感器信号稍微有点毛刺或者被控对象本身就有高频抖动微分项就会被这些噪声放大导致控制量剧烈跳变执行机构跟着哆哆嗦嗦。所以工程上要么加低通滤波要么干脆少用甚至不用D环节。2.4 三个环节合在一起时的“话事权”分配实际工程里PID的三个环节很少是平均分配的。我调试过的项目大概有个经验规律温度、液位这类大惯性慢系统通常P为主、I为辅D可以少加一点点或者不加电机转速系统P和I都要用D在编码器信号质量好的情况下可以加一点角度平衡这类快系统P和D是主力I要很谨慎地用小值不然很容易振荡。参数之间的配合也很微妙。增大Kp后可能需要小幅增大Kd来压超调增大Ki后往往也需要加大Kd来抵消积分带来的振荡。调参的本质就是在这三个“话事人”之间找到一个平衡点而这个平衡点必须是结合具体被控对象来摸索的。下面我用一个实际项目的调试过程把这种配合讲透。环节主要作用直观表现参数过大时的典型症状比例P按当前偏差比例输出偏差大出力大、偏差小出力小超调大、持续振荡积分I消除稳态误差持续补偿历史偏差过冲严重、收敛慢微分D抑制趋势性变化提前反向加阻尼对噪声敏感、输出颤抖3. 实操一个直流电机稳速项目从零到稳3.1 项目背景与硬件构成这个模拟项目X的任务是让一个带编码器的直流减速电机稳定在指定转速负载会随时变化比如用手捏一下轴或者加个纸片做的风轮。硬件上我用了一块常见的STM32单片机、一个电机驱动模块、一个带霍尔编码器的直流减速电机再加一个电源模块。整个系统的采集与控制流程是编码器每转一圈输出若干脉冲单片机通过外部中断或定时器捕获脉冲数计算出当前转速然后把目标转速和当前转速的偏差送给PID算法输出一个PWM占空比给驱动模块驱动模块再控制电机两端电压。选择单片机而不是直接用PLC主要是为了把整个底层逻辑摸透。PID的代码没有多少行但把它跑在单片机上采样、计算、滤波这些细节都能暴露出来特别适合学习。如果有人想把这套方案搬去Linux嵌入式或者ROS机器人平台核心PID算法和调参思路完全通用。3.2 如何确定采样周期和转速计算PID是离散化运行的每隔一个固定的采样周期执行一次测一次转速、算一次偏差、算一次控制量、更新一次输出。采样周期怎么选电机转速系统的经验值一般取控制回路的1/10到1/20。如果电机时间常数是几十毫秒量级那采样周期选1到5毫秒比较合适。我实际项目里用了2毫秒也就是每秒执行500次PID计算这个频率对转速控制足够。转速计算我用的方法是“定时器计数”每2毫秒进一次定时器中断读取编码器在这段时间内的脉冲计数然后除以减速比和编码器线数换算成每秒多少转。用这种方式要注意在转速很低的时候2毫秒内的脉冲数可能只有几个甚至一两个转速分辨率会变得很差。这时可以考虑用“脉冲间隔定时法”也就是测两个脉冲之间的时间间隔来推算转速低速时分辨率高得多。3.3 PID代码的最小实现PID的实现方式有很多最常用的是位置式PID和增量式PID。位置式直接计算输出占空比的绝对值增量式计算输出占空比的变化量然后累加上一次输出。两种在电机调速里都常见我用增量式比较多因为它的输出变化是平滑叠加的不容易在设定值突变时产生过大的控制量冲击。下面贴一段我在这个项目里用过的位置式PID核心代码C语言去掉了硬件层只保留算法主干typedef struct { float target; // 目标值 float actual; // 当前实际值 float err; // 当前偏差 float err_last; // 上一次偏差 float integral; // 积分累计值 float kp; float ki; float kd; float out; float out_max; // 输出限幅上限 float out_min; // 输出限幅下限 } PID_TypeDef; void PID_Calc(PID_TypeDef *pid) { pid-err pid-target - pid-actual; // 积分项累加带限幅 pid-integral pid-ki * pid-err; if (pid-integral pid-out_max) pid-integral pid-out_max; if (pid-integral pid-out_min) pid-integral pid-out_min; // 比例项 float p_out pid-kp * pid-err; // 微分项 float d_out pid-kd * (pid-err - pid-err_last); pid-out p_out pid-integral d_out; // 输出限幅 if (pid-out pid-out_max) pid-out pid-out_max; if (pid-out pid-out_min) pid-out pid-out_min; pid-err_last pid-err; }这个实现虽然简单但已经把几个关键点都覆盖了积分限幅、输出限幅、偏差存储。实际使用中我还会在初始化时把integral和err_last清零避免上电瞬间的误动作。还有一点需要注意PID输出的物理量要和执行机构匹配。电机调速里PWM占空比的范围是0到100%PID输出的正负号代表方向输出大小可以归一化成占空比。如果目标转速小于当前转速偏差为负PID输出就会变为负方向这时要判断电机是否需要反转如果只是单向调速就应该把负值截为0或者用方向引脚来切换。3.4 手动整定从P开始一步步逼近稳定我手动整定的思路遵循一套很实用的流程适合新手直接照抄第一步把所有积分系数和微分系数都设为0只保留比例系数。从一个很小的Kp开始增大到系统开始出现振荡为止再把Kp退回振荡点的50%左右得到一个基础比例系数。第二步加入积分环节。把Ki设成一个很小的值一边观察稳态误差是否被消除一边慢慢增大。如果发现转速冲到目标值之后有明显的过冲说明Ki增太快了退回一点。积分系数一般比比例系数小一个数量级以上但具体要看采样周期我用2毫秒采样时合理Ki通常只有Kp的几分之一到几十分之一。第三步如果超调仍然偏大、系统收敛偏慢再考虑加入微分项。Kd从非常小的值开始加直到超调被明显抑制为止。注意观察电机声音和输出波形如果输出开始高频抖动说明Kd太大或者编码器噪声被放大。在调试中我习惯把目标转速设计成阶梯信号让目标从0跳到300再跳到600观察系统在设定值变化时的响应。一个调好的PID应该具备三个特征上升过程没有明显过冲、稳态误差在允许范围内、对外部干扰能在几秒内快速修正。3.5 调参过程中的几个关键参数记录我把这个项目中不同阶段整定的参数记在了表里方便对照理解阶段KpKiKd系统表现纯P0.800转速在负载变化后回不到目标稳态误差明显PI0.80.030稳态误差消除但带负载切换时有轻微过冲PID0.80.030.05超冲明显减小系统稳定时间缩短参数再加大1.50.080.1出现周期性振荡声音异常必须回调这套参数只对这个项目有效参考的意义在于参数变化的趋势P决定灵敏程度I决定稳态精度D决定抑制超调。真正的参数数值必须通过实验来标定。4. 常见问题与排查技巧实录4.1 问题一输出一直顶在最大值转速就是上不去现象电机启动后PWM占空比立刻顶到100%转速还是达不到目标值而且持续很长时间。原因这种症状最典型的是积分饱和。偏差持续存在时积分项不断累加PID的输出被限幅到最大但已经没有进一步增大的空间了。当转速终于接近目标值时积分项已经累计到了很高的值需要花很长时间才能“放下来”于是出现很大的超调和长时间的振荡。处理我已经在代码里加了积分限幅这是第一道防线。更有效的办法是“积分分离”或者“抗积分饱和”。积分分离的思路是当偏差绝对值大于某个阈值时暂停积分累加偏差缩小到阈值以内后再恢复积分。相当于偏差大的时候不让它“记账”偏差小的时候才让它消除稳态误差。我实际操作中把积分分离阈值设成目标转速的10%左右效果比较理想。这样在电机加速阶段积分不会疯狂累计到达目标附近的修正动作就会干净利落得多。4.2 问题二PWM输出高频抖动电机声音发尖现象电机转动时声音明显刺耳用示波器看PWM输出发现控制量在小幅高频变动。原因微分环节对噪声的放大是首要嫌疑。编码器信号在高速时如果抖动或者采样数据没有做滤波微分项会把这种高频噪声乘以Kd后直接反映到输出上。另外采样周期太短、PID计算频率太高也可能导致控制量在量化精度边缘抖动。处理先把Kd降到0看抖动是否小时。如果抖动消失说明问题出在微分噪声需要对编码器读数做低通滤波或者均值滤波。我用的是一阶低通滤波filtered alpha * raw (1 - alpha) * filtered_oldalpha取0.3左右滤波后微分项稳定很多。抖动问题如果还残留就检查PWM频率设置电机驱动的PWM频率最好设在15kHz以上避免开关频率落在人耳可听范围同时也让电流纹波更小。4.3 问题三转速在目标值附近来回振荡无法收敛现象转速波动范围大甚至出现类似正弦波的周期性摆动不管怎么调参数都压不住。原因几个可能混合在一起。一是Kp太大加上系统本身有滞后控制动作总是“晚半步”形成振荡二是PID采样周期和系统惯量不匹配采样太慢导致控制不连续三是执行机构电机驱动模块非线性严重死区附近控制量落地不稳。处理先降Kp再检查采样周期。如果系统时间常数很小采样周期就必须足够短。我用了一个经验公式采样周期取被控对象纯迟延时间的1/4到1/10。电机系统虽然迟延很小但如果PWM更新频率太低控制量的更新滞后也一样会导致振荡所以我把PWM更新和PID计算放在同一个定时器中断里频率一致从底层避免这个问题。关于死区工业阀门、液压系统里特别常见就是控制量很小的时候执行机构根本不动。在PID算法里加一个输出死区判断当偏差小于某个阈值时直接把控制量清零或保持上次值可以避免系统在小偏差处“一来一回”地反复动作。4.4 问题四目标值突变时系统猛烈超调现象把目标转速从100直接调到600电机转速冲过600后反弹过大甚至接近700才慢慢回来。原因目标值突变带来的本质问题是偏差突变。比例项瞬间变大积分项也开始大幅累计输出容易直接进入饱和。而且PID的微分项算的是偏差的变化量目标突变那一刻的变化量会特别大产生一个很大的反向校正实际系统中这个校正要么来不及要么过度。处理一方面用前面说的积分分离另一方面可以给目标值做个斜坡生成或者一阶滤波。也就是让目标值不是瞬间跳到600而是从100以每毫秒几个单位的速度爬升到600PID实际追逐的是一个缓变目标冲击自然小很多。这个方法在工业仪表里也叫“设定值斜坡”现场很实用。4.5 调参顺序总结与避坑清单我整理了一个调参顺序速查适合拿来当日常checklist先把I和D置零单独整定P让系统不振荡。加入I从很小的值开始每次增大后至少等系统稳定5到10秒再判断效果。若超调偏大再增加D但先确认传感器信号足够干净。每次只改一个参数记录改动前后的阶跃响应曲线。目标值和干扰都要测试只调响应速度不测试抗干扰到了现场多半要返工。避坑方面我反复提醒自己不要一次性把三个参数同时调大不要看到振荡就一味减小P因为振荡也可能是I或D造成的先锁定来源再动手。还有就是不要迷信网上抄来的参数就算同一个电机型号、同一个驱动模块机械装上负载之后惯量和摩擦力都不一样参数必须现场重调。5. 整定方法补充不靠手感也能起步5.1 用Z-N整定法拿到一套能用参数手动按经验调参是基本功但有时候项目赶时间、系统又不方便反复试这时候可以用一些经典整定公式。比较经典的是Ziegler-Nichols开环阶跃响应法流程是先把PID全部关掉只让系统开环然后给执行器一个固定的阶跃输入记录被控量的输出曲线。从曲线上可以读出两个关键量等效纯迟延时间τ和等效惯性时间常数T然后按公式计算初始PID参数。这个方法在温控、流量、液位这类慢系统里特别出名算出来的参数虽然不是最优但通常已经能稳定工作再手动微调一点就能收敛到不错的控制质量。这个方法有个必要前提一定要做开环阶跃实验而且输入幅度要合适让输出变化足够明显但又不至于触发保护或者进入非线性区。我实操时会在记录前确保系统处于稳定初态阶跃开始后持续记录到输出到达新的稳态附近为止。5.2 在MATLAB/Simulink里预仿真再下现场如果系统能做精确建模或者有传递函数我建议先在上位机软件里用工具包仿真一遍。为什么这么做因为现场调参的风险成本高错一次就可能烧驱动器或者撞限位。仿真里可以把P、I、D的参数随意试探看看响应曲线变化趋势形成直觉之后再回现场实测。但仿真结果只能提供参考不能完全照搬。我自己的经验是仿真里参数普遍偏“理想”到了现场要衰减到原来的60%到80%起步因为仿真模型没有把电机死区、驱动模块非线性、传感器噪声、时序延迟这些实际因素全部include进去。5.3 自适应和自整定概念要了解一下但别迷信现在不少控制器号称带“自整定”功能一键自动算出PID参数。原理通常是系统自动施加一个扰动测量响应曲线然后用内置公式计算参数。用在新项目上确实能省不少事但我的建议是自整定出来的参数可以作为初始值最终还是要人工微调特别是负载特性变化大的场合自整定结果往往过冲偏保守。更进一步的自适应PID会在线调整PID参数来应对系统特性的变化实现复杂度高工业现场一般也要建立在可靠的在线辨识基础上。对于绝大多数入门项目、常规工业回路固定参数PID在做好抗饱和、滤波、采样时序之后已经足够稳。6. 从PID基础到实际落地之间的最后一公里6.1 别忽略执行机构和传感器的现实约束PID算法只是一段代码真正决定控制质量上限的往往是执行机构和传感器的性能。电机驱动模块的供电电压波动会让同样的PWM占空比对应不同的输出力矩热电偶测温的滞后会让控制器以为温度还很低而继续加热结果过冲编码器安装在电机轴和非负载轴上的差异会导致测得的转速跟真实负载转速不一致。我在这方面吃过亏某次恒温控制项目里温度传感器离加热片太近PID显示温度已经到达目标并回调了可水箱中心温度其实还差很远。后来把传感器位置改到靠近出口的位置同时把系统的纯迟延时间算清楚再重新整定参数问题才解决。做PID项目一定要先搞清楚“测到的量”和“想控制的量”之间的对应关系。6.2 离散化采样的一些隐藏坑PID在单片机里是离散运行的这就带来一些连续PID没有的麻烦。比如微分项的数值微分在采样周期不稳定的情况下会产生很大的误差所以工程上很少直接用差值做微分而是一阶滤波后再微分或者直接就不用D。又比如积分项的累加在长时间开启时会出现数值漂移如果PID代码里的变量是float运行几天后可能误差越来越大需要定期对积分项做重置或小幅度衰减。另外就是控制器频率和控制量更新频率必须匹配。如果你在定时器里以2毫秒周期计算PID但PWM模块的寄存器要10毫秒才更新一次那计算再快也没用输出还是按10毫秒的节奏变。这个细节在调试时最容易忽视问题表现又是那种“参数怎么调都不对”的怪症状。6.3 我的个人体会先把调试环境搭好再去碰参数这几年调PID我最深的体会是参数本身不难难的是搭出一个能观察系统真实行为的调试环境。在PID项目里如果只能通过肉眼看看转速表指针来分辨好坏那调参效率会非常低。我建议在系统里留一个串口调试通道把目标值、实际值、PID输出、积分值、误差实时打印出来再用上位机软件画成曲线。有了曲线调参就像换了双眼睛超调多少、收敛快慢、稳态误差多大一眼就能看清楚不用靠猜。还有个小技巧把每次调参后的曲线截图存档标注当时的参数组合。时间久了你会发现自己已经积累出一套“参数和曲线对应关系”的经验库下次接手新系统时光靠看曲线特征就能猜出参数到底是哪里不对直接省掉一半的试错时间。6.4 PID以外的东西现在也需要了解PID基础可以解决大多数常规控制问题但有些场景它确实不够用。比如控制对象有很强的非线性或者系统状态会快速切换或者要求极高的动态响应这时候可能需要用串级PID、前馈PID、模糊PID甚至更现代的控制方法。串级PID我在温控项目中用过外环控制温度、内环控制加热功率响应比单级PID快很多抗扰动能力也更强。但不管是哪种高级方案底层的反馈思想、稳定性概念、参数整定直觉都是从PID这里打下的。把PID基础搞扎实了后面学什么控制方法都会顺很多。我建议各位无论是做毕设还是做工程项目都亲手从一个最朴素的PID闭环开始搭一遍别直接用现成库或者模块了事那点调试过程的积累是任何现成算法都给不了的。

相关新闻

5G毫米波OTA测试技术详解:暗室搭建、测试项与排障实战

5G毫米波OTA测试技术详解:暗室搭建、测试项与排障实战

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

2026/10/13 5:30:17 阅读更多 →
户外显示别迷信半透半反TFT:量产落地的四大隐形陷阱与替代方案

户外显示别迷信半透半反TFT:量产落地的四大隐形陷阱与替代方案

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

2026/10/13 5:29:37 阅读更多 →
DeepSeek续保方案实战拆解:数据体系、特征工程与流失预警模型

DeepSeek续保方案实战拆解:数据体系、特征工程与流失预警模型

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

2026/10/13 5:29:41 阅读更多 →

最新新闻

RAG检索后处理实用指南:重排、压缩与校正,让结果直接可用

RAG检索后处理实用指南:重排、压缩与校正,让结果直接可用

1. 检索结果“看着相关”和“真正可用”之间,隔着一整条流水线先从一个很常见的现象说起。你做一个知识库问答系统,检索部分做得不错了,向量召回、BM25 混合检索都上了,Embedding 模型也换过好几版,离线测评指标一直在…

2026/10/13 12:14:01 阅读更多 →
KernelSU GKI 模式与 LKM 模式完整选型指南:Android 内核 Root 从安装到卡砖救援一次跑通

KernelSU GKI 模式与 LKM 模式完整选型指南:Android 内核 Root 从安装到卡砖救援一次跑通

KernelSU GKI 模式与 LKM 模式完整选型指南:Android 内核 Root 从安装到卡砖救援一次跑通 【免费下载链接】KernelSU A Kernel based root solution for Android 项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU KernelSU 是一款运行在内核里、直…

2026/10/13 12:14:01 阅读更多 →
Scrapy Shell调试技巧:提升爬虫开发效率的交互式工具

Scrapy Shell调试技巧:提升爬虫开发效率的交互式工具

1. 为什么Scrapy Shell值得你花时间掌握刚接触Scrapy那会儿,我最烦的就是改一行代码跑一次爬虫。每次调试XPath或者CSS选择器,都要重新发起请求、重新解析页面,一个简单的选择器调半天,效率低得让人抓狂。后来被一位做数据采集的老…

2026/10/13 12:14:01 阅读更多 →
如何用3升和4升的桶,量出2升的水?

如何用3升和4升的桶,量出2升的水?

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

2026/10/13 12:14:01 阅读更多 →
VC++2010学习版实战:Win32 GUI、静态库与C运行时深度开发

VC++2010学习版实战:Win32 GUI、静态库与C运行时深度开发

简介:VC2010学习版是专为C语言初学者及计算机二级考试备考者打造的轻量级开发环境,完整集成Visual Studio 2010 Express C版本,提供编译、调试、项目管理一体化支持,有效降低Windows平台下C/C编程入门门槛。资源包共58个文件&…

2026/10/13 12:14:01 阅读更多 →
Linux匿名管道原理与实战:fork进程通信的零配置IPC机制

Linux匿名管道原理与实战:fork进程通信的零配置IPC机制

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

2026/10/13 12:13:00 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →