news 2026/9/20 19:16:53

基于STM32G431的PMSM无位置传感器FOC控制全流程实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于STM32G431的PMSM无位置传感器FOC控制全流程实战

1. 项目缘起与整体设计思路

1.1 为什么选择无位置传感器控制这条路线

做电机控制的人都有一个共识:永磁同步电机(PMSM)的矢量控制要想做得好,转子位置信息是绕不开的。传统方案靠旋转变压器或者光电编码器来获取角度,精度高、响应快,但问题也很直接——传感器本身要钱,安装要空间,线束要接口,而且在高温、高湿、强振动的环境下,传感器反而是整个系统里最容易出故障的环节。我之前做过一个水泵驱动的项目,客户反馈最多的就是编码器进水导致停机,后来换成无位置传感器方案之后,故障率直接降了一个数量级。

无位置传感器控制的核心思路,就是利用电机本身的电气量——定子电压、定子电流——通过算法把转子位置和转速“算”出来。听起来很美好,但实际操作中你会发现,不同转速段面临的困难完全不一样。低速时反电动势幅值极小,信噪比很差,单纯靠反电动势观测根本算不准;高速时反电动势够了,但逆变器的非线性、死区效应、参数漂移又会引入各种误差。所以一个能跑通全速域的方案,必须把多种观测器策略组合起来用。

这个项目我选的是基于滑模观测器(SMO)的中高速段估算 + 高频注入法辅助低速段的组合方案,主控芯片用STM32G431,它是ST家G4系列里专门为电机控制优化的型号,内置了CORDIC协处理器和FMAC滤波单元,跑FOC算法绰绰有余。电流采样用霍尔电流传感器,相比采样电阻方案,霍尔方案天然隔离,抗干扰能力强,调试起来也省心不少。

1.2 硬件架构的选型逻辑

先说一下整个硬件平台的构成。主控是STM32G431RB,170MHz主频,带FPU和CORDIC,跑一个完整的FOC环路加上滑模观测器,CPU占用率大概在40%左右,余量很充足。功率级用的是一块三相全桥驱动板,MOSFET选的是60V/30A的N沟道管,栅极驱动用IR2136,自带死区插入和过流保护。

电流采样这块我重点说一下。霍尔电流传感器选的是ACS712的替代型号(国产的CC6902),量程±20A,输出是模拟电压信号,零点在VCC/2。这里有个细节:霍尔传感器的输出需要经过RC低通滤波再送入ADC,截止频率我设在1.6kHz左右,太低了会引入相位滞后影响电流环带宽,太高了噪声滤不干净。实际调试时我用示波器看了ADC采样波形,1.6kHz对应的RC参数是R=1kΩ、C=100nF,效果比较均衡。

母线电压采样用的是电阻分压加隔离运放,分压比算下来是1:21,ADC满量程3.3V对应母线电压69.3V,留了足够的余量。温度采样用NTC热敏电阻贴在MOSFET散热片上,用来做降额保护。

注意:霍尔电流传感器的供电一定要用干净的线性稳压源,我试过直接用开关电源的5V给传感器供电,结果电流波形上叠加了大约50mA的高频纹波,直接导致低速时观测器抖动。后来加了一级LC滤波才解决。

1.3 软件架构的分层设计

软件部分我分成了三层:底层驱动层、算法层和应用层。底层驱动层负责ADC采样、PWM输出、定时器配置、串口通信这些基础外设;算法层包含Clarke变换、Park变换、SVPWM生成、电流环PI调节器、速度环PI调节器、滑模观测器、锁相环(PLL)角度跟踪;应用层负责状态机管理、故障保护、参数整定接口。

整个控制环路的中断频率设的是20kHz,也就是PWM载波频率。为什么选20kHz?因为人耳可听范围上限是20kHz,超过这个频率电机就不会有刺耳的啸叫声。但频率也不能太高,太高了开关损耗会显著增加,而且STM32G431的ADC在20kHz下采样时间需要仔细配置。实际配置是:PWM中心对齐模式,ADC由定时器触发在计数器的谷底和峰顶各采样一次,这样能准确采到电流纹波的平均值。

2. 核心算法细节与实操要点

2.1 SVPWM的七段式实现与零序注入

SVPWM是这个项目里最基础也是最关键的环节。它的本质是在六个基本电压矢量和两个零矢量之间做时间分配,使得在一个PWM周期内,电压矢量的平均值等于目标电压矢量。相比SPWM,SVPWM的直流母线电压利用率能提高约15.5%,这对于需要宽调速范围的场合非常重要。

七段式SVPWM的“七段”指的是一个PWM周期内开关序列被分成七段:零矢量V0、矢量V1、矢量V2、零矢量V7、矢量V2、矢量V1、零矢量V0。这种对称结构的好处是谐波含量低,而且每个PWM周期内每个桥臂只开关一次,开关损耗最小。

具体实现时,先判断目标电压矢量落在哪个扇区,然后计算相邻两个基本矢量的作用时间T1和T2,以及零矢量的作用时间T0。我用的计算公式是这样的:

// 扇区判断与作用时间计算(简化版) float Ualpha = Ualpha_ref; float Ubeta = Ubeta_ref; float U1 = Ubeta; float U2 = 0.8660254f * Ualpha - 0.5f * Ubeta; // sqrt(3)/2 float U3 = -0.8660254f * Ualpha - 0.5f * Ubeta; uint8_t sector = 0; if (U1 > 0) sector |= 0x01; if (U2 > 0) sector |= 0x02; if (U3 > 0) sector |= 0x04; // 根据扇区计算T1、T2 float T1, T2; switch(sector) { case 1: T1 = U2; T2 = U1; break; case 2: T1 = -U3; T2 = -U2; break; // ... 其他扇区 }

这里有个容易踩坑的地方:零序注入。标准的SVPWM其实等价于在正弦调制波上叠加了一个零序分量,这个零序分量是三相调制波最大值和最小值的平均值取反。我在代码里直接用了零序注入的方式来实现SVPWM,这样代码更简洁,而且方便后续加入过调制策略。零序注入的公式是:

float Vmax = fmaxf(Va, fmaxf(Vb, Vc)); float Vmin = fminf(Va, fminf(Vb, Vc)); float Voffset = -(Vmax + Vmin) * 0.5f; Va += Voffset; Vb += Voffset; Vc += Voffset;

实测下来,零序注入方式和传统扇区判断方式生成的PWM波形完全一致,但代码量少了将近一半,而且不容易在扇区边界处出错。

提示:七段式SVPWM的开关序列一定要用中心对齐模式,否则电流采样时刻和PWM边沿对不上,采到的电流值会严重失真。我在初期调试时用了边沿对齐模式,结果电流波形上出现了明显的尖刺,换成中心对齐后立刻干净了。

2.2 滑模观测器的设计与抖振抑制

滑模观测器(SMO)是无位置传感器控制里最常用的中高速观测器。它的基本思想是:构造一个电流观测器,让观测电流和实际电流的误差在滑模面上滑动,从而从等效控制量中提取反电动势,再通过反正切或PLL得到转子角度。

SMO的数学模型在α-β坐标系下是这样的:

// 电流观测器 float Ialpha_hat += (Ts/Ls) * (Ualpha - Rs*Ialpha_hat - Ealpha_hat); float Ibeta_hat += (Ts/Ls) * (Ubeta - Rs*Ibeta_hat - Ebeta_hat); // 滑模控制律(sign函数) float Ealpha_hat = Kslide * sign(Ialpha_hat - Ialpha); float Ebeta_hat = Kslide * sign(Ibeta_hat - Ibeta);

其中Kslide是滑模增益,选得太小观测器收敛慢,选得太大抖振严重。我实际调试时发现,Kslide取反电动势幅值的1.5到2倍比较合适。以这个电机为例,额定转速3000rpm时反电动势幅值约24V,Kslide取36V左右。

但sign函数是硬切换,抖振不可避免。我试过几种改进方案:用饱和函数sat代替sign函数、用Sigmoid函数、用边界层可变滑模。最后选的是饱和函数+低通滤波的组合,饱和函数的边界层厚度取0.05A,低通滤波截止频率取500Hz。这样处理后,角度估算的波动从±5°降到了±1.5°以内。

// 饱和函数替代sign float sat(float x, float delta) { if (x > delta) return 1.0f; if (x < -delta) return -1.0f; return x / delta; }

还有一个细节:SMO估算出的反电动势经过低通滤波后会产生相位滞后,这个滞后必须补偿。补偿角度等于滤波器的截止频率除以电机电角频率的反正切值。我在代码里做了实时补偿:

float theta_comp = atanf(omega_e / omega_cutoff); theta_est += theta_comp;

注意:滑模观测器在低速时反电动势太小,信噪比极差,估算角度会剧烈抖动。我的经验是,SMO在额定转速10%以上才能稳定工作,低于这个转速必须切换到高频注入法或者I/F启动。

2.3 锁相环角度跟踪与参数整定

从SMO得到反电动势后,传统做法是用反正切直接算角度:θ = atan2(-Ealpha, Ebeta)。但反正切对噪声非常敏感,而且没有滤波效果。更好的做法是用锁相环(PLL)来跟踪角度。

PLL的结构是:将估算的反电动势经过Park变换到估算的d-q轴上,如果估算角度和实际角度有偏差,那么q轴反电动势就不为零。用这个误差驱动一个PI调节器,PI的输出就是转速,积分后就是角度。

// PLL误差计算 float Ealpha_hat, Ebeta_hat; // 来自SMO float theta_est; // 当前估算角度 float Ed_hat = Ealpha_hat * cosf(theta_est) + Ebeta_hat * sinf(theta_est); float Eq_hat = -Ealpha_hat * sinf(theta_est) + Ebeta_hat * cosf(theta_est); // PI调节器 float omega_est = Kp_pll * Eq_hat + Ki_pll * integral_Eq; integral_Eq += Eq_hat * Ts; theta_est += omega_est * Ts;

PLL的PI参数整定有个经验公式:Kp_pll取反电动势幅值的0.1倍左右,Ki_pll取Kp_pll乘以带宽的1/10。我实际取的是Kp_pll=2.4,Ki_pll=120,对应的PLL带宽大约在80Hz,响应速度和抗噪性比较平衡。

调试PLL时我踩过一个坑:一开始把PLL带宽设得太高(200Hz以上),结果电机在突加负载时角度估算会短暂失锁,转速波形上出现明显的凹陷。后来把带宽降到80Hz,同时把SMO的滑模增益提高20%,问题就解决了。这说明观测器和PLL的带宽要匹配,观测器带宽应该至少是PLL带宽的3到5倍。

3. 完整实操流程与关键环节实现

3.1 硬件搭建与上电前检查

硬件搭建的顺序很重要,我一般按照“先电源后信号、先低压后高压”的原则来。第一步是焊接主控板,确认STM32G431的最小系统能正常下载程序,串口能打印信息。第二步是焊接功率板,但先不接电机,用万用表测三相桥臂的输出对地和对母线有没有短路。

上电前必须做的检查清单:

检查项方法合格标准
母线电容极性目视+万用表正负极无反接
桥臂短路万用表二极管档无短路蜂鸣
霍尔传感器供电示波器测输出零点在VCC/2±0.1V
栅极驱动供电万用表测VCC15V±0.5V
死区时间示波器看上下管波形死区约1μs

死区时间这个参数很关键。IR2136内部有硬件死区,大约0.5μs,但我在软件里又加了0.5μs的互补PWM死区,总共约1μs。为什么加软件死区?因为硬件死区的一致性不够好,不同批次的芯片差异可能有±0.2μs,软件死区可以精确控制。但死区也不能太大,太大会导致输出电压失真,低速时尤其明显。

3.2 电流采样校准与偏置补偿

霍尔电流传感器的零点偏置是必须校准的。我的做法是:上电后先不启动PWM,让电机处于静止状态,连续采样1000次电流ADC值,取平均作为零点偏置。这个偏置会随温度漂移,所以我在运行过程中每隔1秒更新一次偏置,更新时只取电流绝对值小于0.1A的采样点。

// 电流偏置校准 #define CALIB_SAMPLES 1000 int32_t sum_a = 0, sum_b = 0; for (int i = 0; i < CALIB_SAMPLES; i++) { sum_a += ADC_Read(ADC_CH_A); sum_b += ADC_Read(ADC_CH_B); delay_us(10); } offset_a = sum_a / CALIB_SAMPLES; offset_b = sum_b / CALIB_SAMPLES;

实际电流的计算公式是:I = (ADC_value - offset) * Vref / (4096 * Sensitivity)。以CC6902为例,灵敏度是100mV/A,Vref=3.3V,那么1A电流对应ADC变化约124个计数。

这里有个细节:霍尔传感器的输出有温漂,典型值是±0.5%/°C。我在电机连续运行30分钟后测过,偏置漂移了大约15个ADC计数,对应0.12A的误差。对于额定电流5A的电机来说,这个误差在低速时会影响观测器精度,所以定期更新偏置是必要的。

3.3 开环启动到闭环切换的完整流程

无位置传感器控制最棘手的就是启动。零速和极低速时反电动势为零,SMO完全无法工作。我的方案是三段式启动:强制对齐→I/F开环加速→SMO闭环切换。

第一阶段:强制对齐。给d轴通一个固定电流(比如额定电流的30%),q轴电流为零,持续500ms。这样转子会被拉到d轴对齐的位置,此时电角度为零。这个阶段电流不要太大,太大会导致电机发热;也不要太小,太小了对齐力矩不够。

第二阶段:I/F开环加速。保持电流幅值不变,让电流矢量的角度以设定的加速度增加。加速度的选择很关键:太快了电机会失步,太慢了启动时间太长。我的经验是加速度取额定角加速度的50%左右。以这个电机为例,额定转速3000rpm对应电角频率约314rad/s,启动时间设1秒,那么加速度就是314rad/s²。

// I/F启动 float theta_if = 0; float omega_if = 0; float accel = 314.0f; // rad/s^2 float I_mag = 1.5f; // A while (omega_if < omega_switch) { omega_if += accel * Ts; theta_if += omega_if * Ts; Id_ref = I_mag * cosf(theta_if); Iq_ref = I_mag * sinf(theta_if); // ... 执行FOC }

第三阶段:闭环切换。当转速达到SMO能稳定工作的阈值(我设的是额定转速的15%,即450rpm)后,切换到SMO闭环。切换时不能硬切,要做平滑过渡。我的做法是:在切换点附近,让SMO估算的角度和I/F角度做加权平均,权重在200ms内从0渐变到1。

// 平滑切换 float blend = (omega_if - omega_switch_low) / (omega_switch_high - omega_switch_low); blend = fmaxf(0, fminf(1, blend)); theta_final = (1 - blend) * theta_if + blend * theta_smo;

实测下来,这种平滑切换方式在空载和带载情况下都能可靠切换,切换过程中转速波动不超过2%。

提示:I/F启动的电流幅值要略大于实际负载所需电流,否则加速过程中容易失步。我一般取负载电流的1.2到1.5倍。但也不能太大,太大会导致电机在切换瞬间产生转矩冲击。

3.4 速度环与电流环的串级整定

整个控制系统的环路结构是:速度环外环、电流环内环。电流环的带宽通常设1kHz到2kHz,速度环带宽设100Hz到200Hz,两者相差10倍左右,这样串级控制才不会相互干扰。

电流环PI参数的计算:Kp = Ls * bandwidth,Ki = Rs * bandwidth。以这个电机为例,Ls=8mH,Rs=0.5Ω,带宽取1.5kHz(对应角频率9425rad/s),那么Kp=0.0089425=75.4,Ki=0.59425=4712。实际调试时我把Kp降到60,Ki降到4000,因为理论值没有考虑PWM延时和采样滤波的相位滞后。

速度环PI参数的计算:Kp = J * bandwidth / (1.5 * p * flux),Ki = Kp * bandwidth / 5。其中J是转动惯量,p是极对数,flux是永磁磁链。这个电机的J=0.0001kg·m²,p=4,flux=0.08Wb,带宽取150rad/s,算下来Kp=0.0125,Ki=0.375。实际取Kp=0.015,Ki=0.4,响应比较快而且没有超调。

整定顺序是先内环后外环。先把电流环整定好,给d轴阶跃指令,看电流响应上升时间是否在0.5ms以内,超调是否小于5%。然后再整定速度环,给速度阶跃指令,看转速响应是否有超调,恢复时间是否在100ms以内。

4. 常见问题与排查技巧实录

4.1 电流波形畸变与死区补偿

调试初期我最头疼的问题就是电流波形畸变。用示波器看相电流,过零点附近有明显的“平台”,导致电流THD高达8%以上。这个问题在低速时尤其严重,因为低速时反电动势小,死区导致的电压误差占比大。

死区补偿的思路是:根据电流方向,在PWM占空比上叠加一个补偿量。当电流为正时,实际输出电压比指令值小,需要补偿正电压;电流为负时反之。补偿量等于死区时间除以PWM周期再乘以母线电压。

// 死区补偿 float T_dead = 1e-6f; // 1us float T_pwm = 50e-6f; // 20kHz float V_comp = (T_dead / T_pwm) * Vdc; if (Ia > 0.05f) Va_comp = V_comp; else if (Ia < -0.05f) Va_comp = -V_comp; else Va_comp = 0; // 零电流附近不补偿

这里有个技巧:零电流附近不要补偿,因为电流方向不确定,补偿反而会引入振荡。我设了一个±0.05A的死区,在这个范围内补偿量为零。加上死区补偿后,电流THD从8%降到了3.5%,低速时的观测器抖动也明显减轻了。

4.2 观测器角度估算偏差的排查

SMO观测器调试时,我发现估算角度和实际角度之间始终有大约5°到8°的稳态偏差。这个偏差会导致id和iq解耦不彻底,电机效率下降。排查过程是这样的:

第一步,确认电机参数是否准确。我用LCR表测了电机的相电阻和相电感,发现数据手册上给的Ls=8mH,实际测量是9.2mH,差了15%。把参数修正后,角度偏差从8°降到了4°。

第二步,检查反电动势常数。我用手转动电机,用示波器测了线反电动势,算出实际的反电动势常数是0.078V/(rad/s),而数据手册给的是0.085。修正后角度偏差降到了2°。

第三步,检查ADC采样延时。STM32G431的ADC在20kHz下,采样加转换大约需要1.5μs,对应的电角度延时在3000rpm时是1.6°。我在角度估算中加了这个延时补偿,最终角度偏差控制在1°以内。

注意:电机参数辨识是无位置传感器控制的基础,参数不准,再好的算法也白搭。我建议在调试前一定要实测电机的Rs、Ls和反电动势常数,不要迷信数据手册。

4.3 低速段抖振与高频注入的取舍

SMO在低速段(额定转速10%以下)的抖振问题,我试过几种解决方案。第一种是降低滑模增益,但这样观测器收敛变慢,动态响应变差。第二种是加大低通滤波截止频率的降低幅度,但相位滞后补偿变得困难。第三种就是引入高频注入法。

高频注入法的原理是:在d轴注入一个高频电压信号(比如1kHz、10V),由于电机的凸极效应,q轴会感应出高频电流,这个电流的幅值包含转子位置信息。通过解调这个高频电流,就能提取角度。但这个方法有个前提:电机必须有凸极效应,表贴式永磁同步电机的凸极率接近1,高频注入效果很差。

我用的这台电机是表贴式的,凸极率只有1.05,高频注入的信号非常微弱。实测下来,注入10V高频电压,q轴感应电流只有20mA左右,信噪比很差。后来我改用低频信号注入+旋转高频电压注入的组合,在零速和极低速时用旋转高频注入,在5%到15%额定转速之间用低频注入过渡,15%以上切换到SMO。这样全速域都能稳定工作,但算法复杂度增加了不少。

对于表贴式电机,如果对低速性能要求不高,我建议直接用I/F启动到15%额定转速再切SMO,这样最简单可靠。如果确实需要零速大转矩,那就要考虑用凸极率更高的内置式电机,或者加装一个低速用的霍尔传感器做混合方案。

4.4 常见故障速查表

现象可能原因排查方法解决方案
上电即过流保护桥臂直通示波器看上下管驱动波形检查死区时间,确认互补PWM配置
电机启动时抖动不转I/F加速度太大逐步降低加速度加速度降到额定值的30%
低速时电流噪声大死区补偿不当看电流过零点波形调整死区补偿阈值
高速时角度失锁SMO增益不足看估算角度和实际角度偏差提高滑模增益20%
切换时转速跌落PLL带宽太高看切换瞬间转速波形降低PLL带宽到80Hz
带载能力差电流环带宽不足给d轴阶跃看响应提高电流环Kp,检查采样延时
电机发热严重id不为零看id反馈值检查角度补偿,修正电机参数

这张表是我调试过程中一点点积累的,基本上涵盖了90%以上的常见问题。每次遇到新问题,我都会先查表,如果表里没有,再从头分析。

5. 实测数据与性能评估

5.1 稳态性能测试

在额定转速3000rpm、额定负载5N·m的条件下,我测了系统的稳态性能。转速波动小于±5rpm,电流THD约3.2%,估算角度误差小于1.5°。效率方面,控制器整体效率约96.5%,电机效率约91%,系统总效率约87.8%。

动态响应方面,突加50%额定负载时,转速跌落约80rpm,恢复时间约120ms;突卸负载时,转速超调约60rpm,恢复时间约100ms。这个性能对于水泵、风机这类负载来说完全够用,但对于伺服应用来说还有提升空间。

5.2 全速域切换测试

从零速启动到额定转速的完整过程,我录了波形。0到450rpm用I/F开环,耗时约1.2秒;450rpm切换到SMO闭环,切换过程约200ms,转速波动小于10rpm;450到3000rpm用SMO闭环加速,耗时约0.8秒。整个启动过程约2.2秒,对于大多数应用场景来说是可以接受的。

低速段(50到450rpm)用高频注入法,角度估算误差在3°以内,但电流噪声比中高速段大,THD约6%。这是高频注入法的固有代价,注入信号本身就会带来额外的电流谐波。

5.3 参数敏感性分析

我特意做了参数偏差对观测器性能的影响测试。当定子电阻偏差±20%时,角度估算误差变化约±2°;当定子电感偏差±20%时,角度误差变化约±3°;当反电动势常数偏差±10%时,角度误差变化约±4°。可以看出,反电动势常数对观测精度影响最大,其次是电感,电阻影响最小。

这也解释了为什么很多无位置传感器方案在电机运行一段时间后性能会下降——电机温度升高导致永磁体磁链下降,反电动势常数变化,观测器就偏了。解决办法是加入在线参数辨识,实时修正反电动势常数。我在代码里加了一个简单的磁链观测器,用q轴电压方程反推磁链,实测能把温升导致的角度误差从5°压缩到2°以内。

6. 写在最后的一些实操体会

这个项目从方案选型到最终跑通,前后花了大约三个月时间,其中大部分时间都花在调试和排查问题上。有几点体会特别深:

第一,电机参数实测比什么都重要。我一开始偷懒用了数据手册的参数,结果角度估算一直有偏差,后来老老实实用LCR表和示波器把Rs、Ls、反电动势常数都测了一遍,问题迎刃而解。参数辨识的代码我也整理了一份,用最小二乘法在线辨识Rs和Ls,效果不错。

第二,死区补偿和采样延时补偿是无位置传感器控制的两大隐形杀手。这两个因素在开环测试时看不出来,一旦闭环就会导致角度偏差和电流畸变。我的建议是在调试初期就把这两个补偿加上,不要等到出了问题再回头找。

第三,切换策略决定了启动的可靠性。I/F到SMO的切换,硬切几乎必然失败,必须做平滑过渡。我试过直接切换、延时切换、加权切换三种方式,加权切换最可靠,但需要仔细调整权重变化的速率。

第四,STM32G431的CORDIC和FMAC单元一定要用起来。我一开始用软件浮点算三角函数和滤波,CPU占用率到了70%以上,后来把Park变换和PLL的三角函数交给CORDIC,滤波交给FMAC,CPU占用率降到了40%以下,而且运算精度还提高了。

这个方案目前已经在一个小批量的水泵驱动上验证过了,连续运行了2000小时没有出现失步或过流故障。后续我打算把参数辨识和故障诊断再完善一下,特别是匝间短路的早期检测,这个对于工业应用来说价值很大。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 19:14:50

AD转换器与DA转换器仿真:量化、FFT指标与闭环验证

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

作者头像 李华
网站建设 2026/9/20 19:14:07

4 步导出 QQ 空间全部历史说说,老动态不再丢

4 步导出 QQ 空间全部历史说说&#xff0c;老动态不再丢 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 翻到 2014 年那条生日说说&#xff0c;配图全灰了。GetQzonehistory 跑一遍&…

作者头像 李华
网站建设 2026/9/20 19:13:44

Navicat安装指南:免费版与试用版全攻略,从下载到连接MySQL避坑

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

作者头像 李华
网站建设 2026/9/20 19:12:34

IsaacLab 安装 rsl-rl 依赖解析失败?3 种修法快速修复完整指南

IsaacLab 安装 rsl-rl 依赖解析失败&#xff1f;3 种修法快速修复完整指南 【免费下载链接】IsaacLab Unified framework for robot learning with multi-physics/renderer support 项目地址: https://gitcode.com/GitHub_Trending/is/IsaacLab 刚跑 pip 装 IsaacLab 就…

作者头像 李华