云聚 AI Token Plan 满 199 减 35 元
port:80 AI Junkie
AI 重度玩家的工程笔记本
DigitalOcean 开发者云

软件人学电子电气:把公式当函数,把物理量当变量

云聚 AI Token Plan 满 199 减 35 元

我最近在补电子电气,第一周被术语砸得晕头转向。占空比、反电动势、有效值、FOC,每个词单独查都能查到,但连在一起看电机代码,还是不知道那个变量到底是什么。

后来我想明白了一件事:我不是记不住,是没有挂钩。

阿里云 OPC 一人公司创业装备库

背单词式的学法对软件人是浪费。你已经会时间片调度、会缓存、会限流平滑、会指数退避、会坐标变换——这些正好是电子电气里占空比、电容、滤波、RC 充电、FOC 的同一套思想,只是换了层皮。所以这份教材不按电工课本的顺序讲,而是按一个软件人已有的直觉去挂钩。

方法就一条,贯穿全文:

物理量  ↔  变量        (U 是电压,就像 count 是计数)
公式    ↔  函数签名     (P = U × I,就是 power(u, i) 的定义)
单位    ↔  类型系统     (V、A、W 不匹配,等于类型错误)

看完这份东西,目标不是让你会考电工,而是——看到电机、电源、控制算法里的一个变量,脑子里立刻知道它代表什么物理量、量纲对不对、大概什么数量级。

下面从最基础的七个电路公式开始,逐层往上到电机和控制。每个公式都配一个软件类比和一个真实代码里的变量名。最后一部分专门讲”工程英语”——怎么不死背就能读懂变量。

一、电路基础:七个公式撑起半壁江山

电路这一层,翻来覆去就是七个关系。把它们当成七个函数记住,后面所有硬件都是在这几个函数上叠加。

0. 先约定单位:软件人最爱栽的坑

正式公式之前,先解决单位。软件人读硬件代码翻车,很少栽在公式上,多半栽在数量级——把 μF 看成 mF,差一千倍。

常用 SI 前缀(记这几个就够):
G 吉  10^9      M 兆  10^6      k 千  10^3
m 毫  10^-3     μ 微  10^-6     n 纳  10^-9      p 皮  10^-12

各物理量的”典型长相”,看到就知道数量级对不对:

  • 电阻:几十 Ω 到几 MΩ,采样电阻常是毫欧(mΩ)级
  • 电容:现实里几乎没有 1F 的,都是 μF(滤波)、nF/pF(去耦、高频)
  • 电感:mHμH 为主
  • 电流:信号级 mA、功率级 A、大电机几十上百 A
  • 电压:mV(传感器)、V(逻辑/电源)、kV(高压)

量纲检查就是类型检查。 你算完一个式子,先看单位对不对:V / Ω = A 成立,V × A = W 成立,如果算出来单位不对,公式一定用错了——跟编译器报类型不匹配一个道理。代码里 _uv(微伏)、_ma(毫安)、_khz 这种带单位后缀的变量名,就是在帮你标类型,别忽略它。

养成一个习惯:看到硬件常量先在脑子里补单位。C = 100——100 什么?大概率是 100μF,不是 100F(那是超级电容的体量了)。这一步能帮你躲掉一大半低级错。

1. 欧姆定律:电阻是限流器

U = I × R
变量:U 电压(V) / I 电流(A) / R 电阻(Ω)
变形:I = U / R    R = U / I

类比水管最好懂:电压是水压,电流是水流量,电阻是管子粗细。管子越细(R 越大),同样水压下流过的水越少(I 越小)。

对软件人还有个更贴的类比:电阻就是限流器(rate limiter)。你给的压力(U)固定,限流阈值(R)越高,实际通过的流量(I)越低。这个式子是整个电学的 Hello World,后面全靠它。

代码里你会看到 R_shunt(采样电阻)、I = V_sense / R_shunt——这就是拿一个已知电阻,反过来量电流。你测不到电流,但你能测电压,于是用欧姆定律把电压翻译成电流。这个套路在电机驱动里到处都是。

2. 功率三兄弟:能量的流速

P = U × I          最常用
P = I² × R         已知电流和电阻时
P = U² / R         已知电压和电阻时
变量:P 功率(W)

功率是”单位时间的能量”,类比就是吞吐量(throughput)。电压是每个数据包的大小,电流是每秒多少个包,两者相乘就是带宽。

三个式子是同一个东西套欧姆定律换来的,别当三个记。知道任意两个量就能算功率,用哪个看你手上有什么。发热量算的就是 P = I²R——电流翻倍,发热是四倍,这是为什么大电流场景导线要粗、要散热。你后面看到 power_limitp_loss(损耗功率)这些变量,脑子里就是这个吞吐量。

3. 串联并联:电阻的加法与倒数

串联(首尾相接):R = R1 + R2 + ...
并联(并排):    1/R = 1/R1 + 1/R2 + ...

串联像流水线的多道工序,阻力累加。并联像多条车道,越并越通畅,总电阻反而变小。

一个反直觉但要记死的点:并联电阻永远比其中最小的还小。两条 100Ω 并联是 50Ω。类比就是加机器做负载均衡——多开一路,总的”通过能力”上升,等效阻力下降。

4. 电容:会充放电的蓄水池

Q = C × U              电荷 = 容量 × 电压
i = C × (dU/dt)        电流 = 容量 × 电压变化率
储能 E = ½ × C × U²
变量:Q 电荷(C) / C 电容(F) / dU/dt 电压变化速度

电容是电路里的缓存(buffer)。它存的是电荷,电压是它的”水位”。关键在第二个式子:电容上的电流,正比于电压的变化速度

翻译成人话:电容抗拒电压突变。你想让它两端电压瞬间跳变,需要无穷大电流,物理上办不到,所以电容天然把电压毛刺磨平。这就是为什么每个芯片电源脚旁边都要放个小电容(去耦电容)——它像一个本地缓存,CPU 突然要电时先从旁边这个电容取,不用等远处的电源赶过来。C_bulk(大容量储能)、C_decouple(去耦)就是干这个的。

5. 电感:有惯性的水轮

U = L × (di/dt)        电压 = 电感 × 电流变化率
储能 E = ½ × L × I²
变量:L 电感(H) / di/dt 电流变化速度

电感和电容正好是对偶的一对。电容抗拒电压突变,电感抗拒电流突变

类比转动惯量最准:电感像一个很重的水轮,电流是它的转速。想让它突然加速或停下,都要费很大劲(产生很高的电压)。这就是为什么继电器、电机这种带线圈的东西断电时会打火花——电流被强行切断,di/dt 极大,电感两端瞬间顶出很高的电压。开关电源、电机绕组的行为全靠这个式子解释。你看到 L_phase(相电感)就知道它在描述电流的”惯性”。

6. RC 时间常数:一阶充电就是指数退避

τ = R × C                         时间常数(秒)
充电:U(t) = U_final × (1 − e^(−t/τ))
放电:U(t) = U_start × e^(−t/τ)

这个软件人最有感觉。RC 电路充电的曲线,和你写的指数退避(exponential backoff)是同一条数学曲线。

τ(读 tau)是特征时间。经过 1 个 τ,电压充到目标的 63.2%;经过 5 个 τ,到 99.3%,工程上就当充满了。类比缓存预热或限流令牌桶的回填——不是线性上来的,是先快后慢逼近上限。

代码里的一阶低通滤波(后面第五部分细讲)本质就是这条曲线的离散版。你调滤波的 alpha 系数,其实就是在调这个 τ。看到 tautime_constantrc_filter 这些名字,想的就是这条先快后慢的曲线。

7. 分压器:两个电阻切一刀电压

Uout = Uin × R2 / (R1 + R2)
(R2 是下面那个,取它两端的电压)

分压器是硬件里用得最多的小电路,作用就是把一个高电压按比例缩小,好让后面的 ADC(模数转换器)能读。

类比就是一个固定比例的 scale() 函数。5V 的信号,ADC 只能读 3.3V,就用两个电阻分压缩到量程内,读完再在代码里乘回比例。你看到 divider_ratiovsense = adc * scale 这类,背后就是这个式子。

七个公式讲完了。它们之间的关系其实就三样东西:电压、电流、电阻,外加电容电感这两个”带记忆的元件”。把这七个当七个函数背下来,电路层你就不虚了。

二、交流:为什么 220V 不是 220V

上面讲的都当成恒定的直流。真实世界大量是交流——电压电流在正负之间来回摆。这里最容易把人绕晕的,是”一个来回摆的值,你说它是多少”。

峰值、有效值、平均值:三个都叫”电压”

先记一件事:家里插座标的 220V,既不是最高点也不是平均值,是有效值(RMS)

正弦波三个特征值:
峰值 U_peak    ——  波形最高点
有效值 U_rms   ——  和直流等效发热的那个值
平均值 U_avg   ——  一个周期的算术平均(纯正弦是 0)

关系(正弦波专用):
U_rms  = U_peak / √2  ≈ 0.707 × U_peak
U_peak = √2 × U_rms   ≈ 1.414 × U_rms

所以 220V 有效值,峰值其实到 311V。你选电容耐压、选器件的时候看的是峰值 311V,不是 220V——按 220V 选会击穿。这是新手第一个坑。

有效值(RMS,Root Mean Square,均方根)为什么这么定义?因为交流电压在电阻上发热是按 算的,而 U 一直在变。把 U² 在一个周期里平均,再开方,得到的就是”一个多大的直流能产生同样的热”。RMS 的本质是:换算成直流后的等效值。 这跟你算延迟不看瞬时值、看 p99 或均方是一个思路——你要的是一个能代表整体效应的标量。

软件类比:peak 像 max 延迟,avg 像平均延迟,rms 像能反映”总能量/总代价”的那个统计量。看到变量 i_rmsv_peaki_avg,别把它们当同一个数,它们是同一信号的三种统计口径。

角频率与相位:把时间换成角度

ω = 2π × f
变量:ω 角频率(rad/s) / f 频率(Hz)

瞬时值:u(t) = U_peak × sin(ω × t + φ)
φ 是相位(rad),决定波形起点错开多少

频率 f 是每秒多少个来回(Hz)。角频率 ω 是把它换算成”每秒转多少弧度”,因为正弦波数学上就是一个点在圆上转圈的投影。50Hz 的市电,ω = 2π × 50 ≈ 314 rad/s。

相位 φ 描述两个波形错开多少。类比就是两个周期任务之间的相位差——同样的周期,但起跑线不同。电机三相之间就是互相错开 120°,这个”错开”就是相位。看到 phase_a / phase_b / phase_ctheta(角度)、omega(角频率),脑子里就是转圈这张图。

阻抗:电阻的交流版

到了交流,电容电感也开始”挡电流”,但它们挡的方式跟电阻不一样——跟频率有关。

电容的容抗:Xc = 1 / (ω × C)     频率越高,越通
电感的感抗:Xl = ω × L           频率越高,越挡
总阻抗:    Z = √(R² + X²)

一句话记住它们的性格:电容通高频、挡低频(隔直流);电感通低频、挡高频。 这正好是你做滤波器的两块积木——想滤掉高频噪声用电容,想滤掉高频尖峰用电感。

阻抗 Z 是电阻的推广,把纯电阻和这些跟频率有关的部分合到一起。你不用现在会算复数阻抗,只要知道:在交流里,”电阻”这个概念升级成了阻抗,而且它随频率变。 变量 impedanceXcXl 就是这层意思。

交流这块对读代码来说,记住三个口径的电压(峰值/有效值/平均)不要搞混、记住相位是”错开角度”、记住电容电感在交流下变成随频率变的阻抗,够用了。

三、占空比与 PWM:数字世界怎么控制模拟量

你说被”空占比”轰炸——先纠正一个词。正确叫法是占空比(duty cycle)。”占”是导通时间占周期的比例,剩下那部分是关断,有人口语叫”空”的比例,其实是 1 − 占空比。别被这个词卡住,它是整份材料里最简单也最有用的一个概念。

这一节我多花点篇幅,因为对软件人来说,PWM 是理解硬件控制的那把钥匙——它就是数字世界和模拟世界之间的翻译层

占空比是什么

D = t_on / T
变量:D 占空比(0~1 或 0%~100%) / t_on 导通时间 / T 一个周期
周期与频率:T = 1 / f_sw   (f_sw 是开关频率)

开关只有两个状态:全开(比如接 12V)或全关(0V)。一个周期里开着的时间占比,就是占空比。D=0.5 就是半开半关,D=0.75 就是四分之三时间开着。

为什么它能控制模拟量:平均值

这里是全篇最值钱的一个直觉,慢慢看。

开关电压只有 0 和 12V 两个值,但如果开关切得足够快,负载(比如电机、LED、加热丝)感受到的是平均值

U_avg = D × U_supply
例:12V 电源,D = 0.3  →  平均 3.6V
电阻负载的平均功率:P_avg = D × (U_supply² / R)

D=0.3,负载就像接了 3.6V。你没有做出一个 3.6V 的电源,你只是用一个只会”开/关”的开关,通过控制开关的比例,凑出了任意中间值。

这跟软件里用离散手段模拟连续量是一模一样的思想。 你想在只能显示黑白的屏幕上表现灰色,就用抖动(dithering)——一半像素黑一半白,远看就是灰。你想让一个定时任务平均占用 30% 的 CPU,就让它跑 30ms、歇 70ms。PWM 就是硬件版的抖动 / 时间片轮转:用时间上的开关比例,换空间上的连续数值。

想通这一点,PWM 就再也不神秘了。调灯的亮度、调电机的转速、调加热的功率,底层全是在改一个 duty 变量。你在代码里写 set_duty(0.3),硬件就把开关按 30% 的比例切,负载就得到 30% 的效果。

频率怎么选:两个约束在拉扯

占空比决定”多少”,开关频率决定”切多快”。频率不是越高越好,是两个力在拔河:

  • 切得太慢,负载会感觉到一颗一颗的脉冲,不平滑。电机会抖、LED 会闪、耳朵能听到啸叫(几百 Hz~几 kHz 正好在听觉范围,这就是有些设备”吱吱”响的原因)。
  • 切得太快,每次开关本身有损耗(开关损耗),频率越高,白白发热越多,效率下降。

所以典型电机 PWM 选在 8~20kHz——高过人耳听觉上限(约 20kHz 边缘)以躲开啸叫,又没高到开关损耗失控。这是个工程折中,跟你选批处理的窗口大小一样:窗口太小每条都有固定开销,太大又不够实时。变量 f_pwmpwm_freqf_sw 就是这个开关频率。

分辨率:占空比不是连续的

占空比在代码里是个整数计数器凑出来的,所以它有最小步进:

n 位 PWM,占空比能分 2^n 档
分辨率 = 1 / 2^n
例:10 位 PWM → 1024 档 → 每档约 0.098%

这跟 ADC/DAC 的位数是同一回事:位数决定你能调多细。控制精度不够时,先看看是不是 PWM 位数不够。变量 pwm_resolutionduty_max(满量程对应的计数值,比如 1023)就是这层。

死区时间:防止上下管短路

这个概念在电机、电源的半桥/全桥里必然出现,值得单独记。

一个桥臂上有上下两个开关管,控制电流方向。逻辑上一个开另一个就该关,但开关管关断需要时间。如果上管还没完全关、下管就开了,电源正负极会被这俩管子直接短路,瞬间烧管。

解法:加死区时间(dead time)
上管关 → 等一小段死区(两个都关)→ 下管才开
t_dead 典型 几百 ns ~ 几 μs

死区就是硬件版的互斥锁保护间隙。 你切换两个不能同时持有的资源时,中间留一个都不持有的空档,确保旧的彻底释放了新的才拿。变量 dead_timet_deaddeadband 就是这个保命的空档。它设小了会烧管,设大了会让输出波形失真、影响控制精度——又是一个折中。

延伸:Buck 降压就是占空比的直接应用

上面说 U_avg = D × U_supply,把电容电感一配,这个平均值就能变成真正稳定的直流电压——这就是 Buck 降压电路,你手机充电器、板子上的电源芯片里全是它。

Buck 降压:Vout = D × Vin
例:12V 输入,想要 5V 输出 → D = 5/12 ≈ 0.42

Boost 升压:Vout = Vin / (1 − D)
例:3.7V 电池升到 5V → D = 1 − 3.7/5 = 0.26

Buck 的原理,就是第三节那个平均值加上第一节的电感电容:开关按占空比 D 斩波,电感把电流的惯性拉平、电容把电压的毛刺磨掉,输出就得到一个平稳的 D × Vin。想调输出电压,代码里就是调那个 duty——所以电源芯片的反馈环,本质是一个不断微调占空比、让 Vout 稳在目标的 PID。

软件类比:Buck 就像一个限速下载器,源头带宽(Vin)固定,你通过控制”开多久关多久”的比例,把平均速率压到你要的值,电感电容则是那个把突发流量削平的缓冲队列。看到 buckvout_refduty 一起出现,脑子里就是这套”斩波 + 平滑 + 反馈”。

Boost 升压反过来,靠电感储能再释放,把电压顶上去,占空比越大升得越高。记住两个式子的方向就行:Buck 输出正比于 D,Boost 输出随 D 增大而放大

一句话收束这节

PWM 三个旋钮:占空比调”多少”、频率调”多快”、死区保命。它们背后是一个统一的思想——用离散的开关,在时间维度上合成连续的模拟量。你已经在软件里用过这个思想无数次,只是没意识到硬件也这么玩。

四、电机:五个公式看懂驱动代码

电机是电能和机械能之间的翻译机。看电机代码卡壳,八成是卡在几个反复出现的量:转速、转矩、反电动势。这一节把直流电机吃透,无刷电机是它的三相版,一通百通。

先解决单位:转速和角速度

代码里转速有两套单位,来回换算是第一个坑:

n   转速,单位 rpm(转/分钟)——面向人,仪表盘用
ω   角速度,单位 rad/s(弧度/秒)——面向公式,算力矩用

换算:ω = 2π × n / 60      n = 60 × ω / (2π)
例:3000 rpm → ω = 2π×3000/60 ≈ 314 rad/s

为什么公式里非要用 rad/s?因为所有力学公式(功率、力矩)都是按弧度推的,rpm 是给人看的。看到 speed_rpmomega 同时出现别慌,它俩是一个东西的两种单位,中间差一个 2π/60 的换算。这就像代码里同时有 duration_msduration_s

直流电机的四个核心公式

一个直流电机,行为由四个式子完全决定。把它们当一组记:

① 反电动势  E = Ke × ω          转得越快,自己发的电压越高
② 电磁转矩  T = Kt × I          电流越大,扭矩越大
③ 电压方程  V = E + I × R       外加电压 = 反电动势 + 电阻压降
④ 机械功率  P_mech = T × ω = E × I

变量:E 反电动势(V) / T 转矩(N·m) / I 电流(A) / V 端电压(V)
      Ke 反电动势常数 / Kt 转矩常数 / R 绕组电阻

逐个拆,每个都有直觉:

① 反电动势(back EMF)——电机转起来,本身也变成了发电机,产生一个反向电压 E,正比于转速。这是电机最反直觉、也最关键的一个特性。软件类比:像一个带背压(backpressure)的系统,你推得越快,它顶回来的阻力越大。变量 bemfback_emfe_phase 就是它。无刷电机的无感控制(没有位置传感器)就是靠测这个反电动势反推转子转到哪了。

② 转矩正比于电流——这是电机控制的基石。你想控制扭矩(比如机器人关节的力),本质就是控制电流。所以电机控制的最内环永远是电流环。看到 i_ref(目标电流)、torque_cmd(转矩指令),它俩之间就差一个常数 Kt。记住这句话:控扭矩就是控电流。

③ 电压方程——你外面加的电压 V,一部分用来抵消反电动势 E,剩下的 V−E 才通过电阻 R 推动电流。转速上去后 E 变大,能推电流的余量 V−E 变小,所以电机转速会自然稳定在某个点。

④ 机械功率 = 转矩 × 角速度,和电功率 E×I 相等(不含损耗那部分)。这就是能量守恒:电进去,机械出来,中间 I²R 是发热损耗。

一个隐藏彩蛋:在国际单位制下,Kt 和 Ke 数值相等(一个单位 N·m/A,一个 V·s/rad,量纲上等价)。所以你只要标定一个,另一个就知道了。

两个极端状态:堵转和空载

这两个状态是理解电机行为的抓手,也是保护逻辑里天天判断的:

堵转(转不动,ω = 0):
  E = Ke × 0 = 0          反电动势消失
  I_stall = V / R         电流只受电阻限制 → 爆炸性的大
  T_stall = Kt × I_stall  这时扭矩最大,但电流也最危险

空载(不带负载,T ≈ 0):
  I ≈ 0                    几乎不需要电流
  E ≈ V                    反电动势顶到接近端电压
  ω_noload ≈ V / Ke       转速最高

堵转(stall)为什么危险:电机卡住不转,反电动势 E 归零,那个平时帮你挡电流的”背压”没了,电流瞬间冲到 V/R,可能是正常工作电流的十几倍,几秒就能烧绕组。所以驱动代码里必然有堵转检测和限流。变量 stall_currenti_limitstall_detect 就是这条保命逻辑。理解了反电动势,你就理解了为什么电机堵转会烧——因为保护它的那个背压消失了。

空载则相反,没负载,电流趋近 0,转速冲到最高,由电压和 Ke 决定。数据手册上的 no_load_speedno_load_current 就是这个状态测出来的。

一个例题:把四公式串起来算一遍

光看公式没感觉,拿一组真实数字走一遍。假设一个 12V 直流电机,绕组电阻 R = 1ΩKt = Ke = 0.05(SI 单位)。分三个工况算:

空载(转最快,几乎不带负载):
  ω_noload ≈ V / Ke = 12 / 0.05 = 240 rad/s ≈ 2292 rpm
  I ≈ 0,因为不需要出力

正常带载(比如稳定在 200 rad/s):
  E = Ke × ω = 0.05 × 200 = 10V      (反电动势顶到 10V)
  I = (V − E) / R = (12 − 10) / 1 = 2A
  T = Kt × I = 0.05 × 2 = 0.1 N·m

堵转(卡死不转):
  E = 0                              (反电动势消失)
  I_stall = V / R = 12 / 1 = 12A
  T_stall = Kt × 12 = 0.6 N·m

现在看这组数的意义。正常工作电流 2A,堵转电流 12A——堵转是正常的 6 倍。绕组是按 2A 附近的发热设计的,突然灌 12A,按 P = I²R 发热是 36 倍,几秒钟就能把绝缘烧穿。

这就是为什么驱动代码里 i_limit(电流限值)通常设在略高于正常工作电流、远低于堵转电流的位置,比如这颗电机可能限到 3~4A,再配一个堵转计时器:电流顶到限值且持续一段时间,就判定堵转、降功率或直接停机。你现在回头看第六节那些变量——stall_currenti_limitstall_cntbemf_est——它们串起来就是这道题的保护逻辑。公式不是拿来考试的,是拿来读懂代码里那些阈值为什么这么设的。

无刷电机和 FOC:把三相拍平

真实机器人、无人机、电动车用的多是无刷电机(BLDC / PMSM),它是直流电机的三相版本。三相就是三套错开 120° 的绕组(还记得第二节的相位吗),轮流通电,产生一个旋转的磁场拉着转子转。

问题来了:三个相的电流都在按正弦变化、互相错开,直接控制它们太乱。FOC(Field-Oriented Control,磁场定向控制)解决的就是这个乱。

FOC 的核心思想,软件人一句话就懂:坐标变换

Clarke 变换:三相(a,b,c) → 两相静止(α,β)     降维:3个量→2个量
Park  变换:两相静止(α,β) → 两相旋转(d,q)     跟着转子一起转

结果:在 d-q 坐标系里,
  Iq(交轴电流)→ 直接对应转矩(想使多大劲)
  Id(直轴电流)→ 通常控到 0(不做功的部分)

这就是把一个不停旋转的、三个交流量的复杂系统,换到一个跟着转子一起转的坐标系里,让它们变成两个不动的直流量。在这个坐标系里看,控制无刷电机就跟控制直流电机一样简单——Iq 管转矩,Id 管磁场。

类比太熟悉了:这就是把极坐标转成直角坐标,或者把一个旋转参考系拍平成静止参考系。你在图形学、信号处理里做过无数次坐标变换,FOC 就是电机版的坐标变换。看到 i_di_qtheta_e(电角度)、clarkepark 这些变量和函数名,脑子里就是”降维 + 转到旋转坐标系”这两步。

不用现在会推变换矩阵,只要知道 FOC 在干嘛:用坐标变换,把复杂的三相交流控制,简化成两个直流量的控制,其中一个(Iq)就是你要的转矩。 这层直觉建立了,看 FOC 代码就有骨架了。

五、控制与信号:PID、滤波、采样

有了电机,还得让它听话——转到你要的位置、稳在你要的转速。这就是控制。这一节的公式其实软件人最容易上手,因为它们本来就是算法。

PID:过去、现在、未来的加权和

PID 是工业控制里出现频率最高的算法,没有之一。它要解决的问题很朴素:目标值和实际值有偏差,怎么调输出让偏差归零。

误差:   e = target − measured        (目标 − 实测)
输出:   u = Kp×e + Ki×∫e·dt + Kd×(de/dt)

P 项 Kp×e         看现在:偏差多大,就使多大劲
I 项 Ki×∫e·dt     看过去:误差累积,专治"总差一点"的稳态误差
D 项 Kd×(de/dt)   看未来:误差变化趋势,提前刹车防超调

三项分工,用一句话记死:P 是现在,I 是过去,D 是未来。

  • P(比例):偏差越大输出越大。像你开车发现偏离车道,偏得越多打方向越猛。只有 P 的问题是会一直差一点点到不了位,还容易来回震荡。
  • I(积分):把历史误差累加起来。专门消灭那个”总差一口气”的稳态误差——只要还有偏差,I 项就持续累积加大输出,直到彻底归零。副作用是容易积过头(积分饱和 windup),所以代码里常有 i_max 限幅。
  • D(微分):看误差变化多快。快到位时提前收力,防止冲过头。像快到停车位了提前松油门。对噪声敏感,所以 D 项前面往往要先滤波。

代码里这三个增益就是 kp / ki / kd,误差是 error,输出是 outputu。调 PID 是门手艺,但看懂它只要记住这三项各管一段时间:现在、过去、未来。离散实现里,积分变成累加 integral += error * dt,微分变成差分 (error − last_error) / dt——积分和微分在代码里就退化成加法和减法。

一阶低通滤波:就是加权移动平均

传感器读数总有噪声。最常用的去噪就是一阶低通滤波,而它的代码,你一定写过:

y[k] = y[k−1] + α × (x[k] − y[k−1])
等价于:y = α×新值 + (1−α)×旧值

α 越接近 1:几乎不滤,跟得快但噪声大
α 越接近 0:重度平滑,稳但迟钝

这就是指数加权移动平均(EMA)——你在做监控指标平滑、做学习率衰减时用过的同一个式子。α 是新数据的权重,1−α 是历史的惯性。

它跟第一节的 RC 时间常数是同一个东西的两副面孔:α 大约等于 dt / (τ + dt)。你调 alpha,本质就是在调那个 RC 滤波的截止频率——留下慢变的真实信号,滤掉快变的噪声。所以电容硬件滤波和这段代码软件滤波,数学上是一回事,硬件用电容、软件用一行加法。变量 alphafilteredlpf(low-pass filter)、ema 就是它。

采样定理:想还原多快的信号,就得采多快

传感器是离散采样的,采多快有个硬下限:

Nyquist:f_sample > 2 × f_signal_max
想准确还原 1kHz 的信号,采样率至少 2kHz(实际取 5~10 倍更稳)

采样不够快,高频信号会伪装成低频混进来,叫混叠(aliasing)——就是车轮在视频里看着倒转的那个效应,摄像头帧率跟不上车轮转速。控制里如果采样率不够,高频噪声会伪装成你以为的真实信号,怎么滤都滤不掉。看到 f_samplesample_ratedt(采样周期)就想到这条下限。

ADC 分辨率:模拟世界的量化精度

ADC 把模拟电压转成数字,能转多细由位数决定:

LSB = V_ref / 2^n            最小能分辨的电压
例:12 位,参考 3.3V → LSB = 3.3 / 4096 ≈ 0.8 mV

n 位 ADC 把量程切成 2^n 档,每档大小就是 LSB(最低有效位对应的电压)。这跟浮点数的精度、图像的位深是同一个概念——位数决定你能分辨多细的差异。控制精度上不去时,先确认是不是 ADC 位数不够,量化误差把有效信息淹了。变量 adc_raw(原始码值)、vrefadc_bits 就是这层。

传感器:位置、电流、温度怎么读

控制的前提是”测得到”。电机代码里三类传感器出现最多,读源码前先知道它们各自给你什么数:

  • 位置/角度:编码器(encoder)给转角,霍尔传感器(hall)给粗略的扇区。FOC 必须知道转子角度 theta_e,就靠它们。增量编码器给的是脉冲计数,代码里 enc_cnt 累加再换算成角度;绝对编码器直接给角度值。软件类比:编码器就是一个不断上报位置的 position 事件流。
  • 电流:靠采样电阻(R_shunt)加欧姆定律,或用霍尔电流传感器。第一节说过——测不到电流,就测采样电阻两端电压再除以 R。变量 i_senseadc_curr 就是这条链路的产物,i_meas 是它滤波后的结果。
  • 温度:热敏电阻(NTC)阻值随温度变,测阻值反推温度;或用数字温度传感器直接给数。temp_motortemp_igbt 是保护逻辑的关键输入,过温就降功率或停机。

传感器的数据几乎都要过一遍前面的链路:raw(原始码值)→ 滤波(filt)→ 换算成物理量。你在代码里看到 xxx_rawxxx 成对出现,中间那步就是滤波加标定。

控制这一层,几个工具串起来就是一条完整链路:传感器把物理量读进来(raw)、滤波去噪(filt)、PID 算出该使多大劲、再经 PWM 输出给电机。采样定理管这条链”够不够快”、ADC 位数管”够不够细”。它们的公式本质都是你写过的算法,换了个应用场景而已。

六、工程英语:不背单词,靠拆解读懂变量

到这里,物理量和公式你已经有了心智模型。剩下最后一关:代码里的变量名是英文缩写拼出来的,fan_speed_esti_q_ref 这种,看不懂就等于前面白学。

但你不需要背四六级。工程代码的变量名遵循很死的构词法,学会拆解规则,比记单词表管用十倍

拆解法:一个变量分三层

看到任何一个变量,按三层拆:词根(物理量)+ 后缀(这个量的哪种口径)+ 缩写习惯

current_ref
  current → 电流(词根)
  ref     → reference 参考/目标(后缀)
= 目标电流

fan_speed_est
  fan   → 风机
  speed → 转速
  est   → estimate 估计(后缀)
= 估算的风机转速

拆解一旦成习惯,你不是在”翻译英语”,是直接读出这个变量的业务含义。下面三张表,是你要真正记住的东西——加起来不到七十个词,覆盖工业代码 90%。

第一层:物理量词根(约 30 个)

英文 中文 常见变量
Voltage 电压 u, v, volt
Current 电流 i, curr, amp
Resistance 电阻 r, res
Power 功率 p, pwr
Torque 转矩/扭矩 t, trq, torque
Speed 转速 n, speed, rpm
Position 位置 pos, x
Angle 角度 theta, ang
Velocity 速度 vel, v
Acceleration 加速度 acc, a
Frequency 频率 f, freq
Phase 相位/相 phase, ph
Flux 磁通 flux, psi
Temperature 温度 temp, t
Motor 电机 motor, mtr
Fan 风机 fan
Battery 电池 batt, bat
Voltage bus 母线电压 vbus, vdc
Duty 占空比 duty, d
Error 误差 err, e
Gain 增益 gain, k
Offset 偏置 offset, off
Threshold 阈值 thr, thresh
Limit 限值 lim, limit
Feedback 反馈 fb, fbk
Target 目标 tgt, target
Direction 方向 dir
Enable 使能 en, enable
Fault 故障 fault, flt
Status 状态 sts, state

第二层:后缀(比词根还重要)

后缀决定这个物理量是”哪一版”——测的、目标的、滤过的、限过的。同一个物理量,加不同后缀就是完全不同的变量,这层最值钱。

后缀 英文 中文 例子
m / meas measured 测量值 i_meas 实测电流
ref reference 参考/目标 speed_ref 目标转速
set / sp setpoint 设定值 temp_set 设定温度
cmd command 指令 torque_cmd 转矩指令
fb / fbk feedback 反馈值 pos_fbk 位置反馈
est estimate 估计值 speed_est 估算转速
raw raw 原始未处理 adc_raw 原始码值
filt filtered 滤波后 i_filt 滤波电流
avg average 平均 temp_avg 平均温度
rms root mean square 有效值 i_rms 有效值电流
peak peak 峰值 v_peak 峰值电压
max / min maximum/minimum 最大/最小 i_max 最大电流
out / in output/input 输出/输入 v_out 输出电压
prev / last previous 上一次 err_prev 上次误差
sum / acc accumulated 累加 err_sum 误差累加

拿到这两张表,你已经能把大量变量当场拆开。看到 i_q_ref → 电流(i) 的 q 轴分量 的 目标值(ref) → FOC 里的目标转矩电流。看到 temp_motor_filt → 电机温度的滤波值。

第三层:工业缩写习惯

这些是构词里反复出现的缩写,认脸即可:

缩写 全称 中文
cfg config 配置
param parameter 参数
ctrl control 控制
calc calculate 计算
init initialize 初始化
coeff coefficient 系数
idx index 索引
num / cnt number/count 数量/计数
freq frequency 频率
volt voltage 电压
curr current 电流
pos position 位置
vel velocity 速度
acc acceleration 加速度
temp temperature 温度

20 个真实变量拆解练习

规则学会了要练。下面 20 个是从真实电机/电源/机器人代码里挑的,先自己拆,再看答案:

1.  v_bus_meas        → 母线电压 · 实测值
2.  i_q_ref           → q轴电流(转矩电流) · 目标值
3.  speed_fbk         → 转速 · 反馈值
4.  theta_e           → 电角度(转子的电气位置)
5.  duty_a            → A相 · 占空比
6.  temp_igbt_max     → IGBT(功率管)温度 · 最大限值
7.  i_phase_rms       → 相电流 · 有效值
8.  pos_err           → 位置 · 误差
9.  kp_speed          → 转速环的 · 比例增益
10. bemf_est          → 反电动势 · 估计值
11. i_lim_cont        → 电流限值 · 持续(continuous)档
12. vdc_filt          → 直流母线电压 · 滤波后
13. flux_ref          → 磁通 · 目标值
14. err_sum_i         → 电流误差 · 累加(积分项)
15. omega_mech        → 机械角速度
16. t_dead            → 死区时间
17. stall_cnt         → 堵转计数器
18. adc_offset        → ADC · 零点偏置
19. fan_pwm_out       → 风机PWM · 输出
20. fault_code        → 故障 · 代码

拆到第 10 个左右,你会发现自己不再”翻译”,而是扫一眼就知道意思。这就是目标状态。

行业高频术语表

最后是一批必须认识的固定术语,它们是词组不是拼缩写,单独记:

  • back EMF(反电动势):电机转动时自身产生的反向电压,正比于转速。无感控制靠它测转子位置。
  • stall current(堵转电流):电机卡死时的电流,接近 V/R,极大,是保护的重点。
  • PWM(Pulse Width Modulation,脉宽调制):用开关占空比合成模拟量,见第三节。
  • FOC(Field-Oriented Control,磁场定向控制):用坐标变换简化三相电机控制,见第四节。
  • SVPWM(Space Vector PWM,空间矢量调制):FOC 里生成三相 PWM 的一种高效方法,母线利用率比普通 PWM 高约 15%。
  • PID:比例-积分-微分控制器,见第五节。
  • BLDC / PMSM:两类无刷电机(无刷直流 / 永磁同步),机器人和无人机主力。
  • IGBT / MOSFET:两类功率开关管,电机驱动的”肌肉”,MOSFET 多用于低压、IGBT 多用于高压大功率。
  • torque ripple(转矩脉动):电机输出扭矩的周期性波动,影响平稳度,FOC 就是为了压它。
  • d-q axis(d 轴 / q 轴):FOC 旋转坐标系的两个轴,d 管磁场、q 管转矩。
  • duty cycle(占空比):就是你被轰炸的那个”空占比”,导通时间占周期的比例。
  • dead time(死区时间):桥臂上下管都关断的保护间隙,防短路。

这份术语表配上前面三张拆解表,就是你自己那本《电机工程英语速成》的核心。不用买单词书,把这几张表贴代码旁边,用几次就长在脑子里了。

七、两天怎么学,附速查卡

前面把该懂的都铺开了。真要落地,别一口气啃。给你一个两天的最小闭环,每天两小时,够把这份教材变成肌肉记忆。

Day 1:建立”量 ↔ 公式 ↔ 类比”的映射

第一天不碰变量名,只干一件事:把物理量和公式的直觉刻进去。方法是用软件类比复述,不是抄公式。

  • 上午(1 小时):过第一、二节。合上教材,用自己的话讲出来——欧姆定律是限流器、电容是缓存、电感是惯性、RC 是指数退避、RMS 是换算成直流的等效值。讲不顺的回去再看。
  • 下午(1 小时):过第三、四节。重点是两个主洞察——PWM 是”时间维度的抖动”、FOC 是”坐标变换降维”。这两个想通了,占全部理解的一半。

Day 1 的验收标准很简单:看到一个物理量,能说出它的软件类比。 说得出,就过。

Day 2:把变量名拆开

第二天专攻工程英语,目标是看变量不再卡壳。

  • 上午(1 小时):背三张表(词根 / 后缀 / 缩写)。别硬背,用第六节的拆解法边拆边记。
  • 下午(1 小时):做那 20 个变量拆解练习,遮住答案自己拆。然后找一份真实的开源电机库(比如 SimpleFOC、ODrive 的源码),随便翻,逼自己拆里面的变量名。

Day 2 的验收标准:遮住答案,20 个变量能拆对 15 个以上。 到这一步,你读电机代码就不会再被变量名挡住。

公式速查卡(贴代码旁边)

学完了留一张卡,忘了随时翻,不用重看全文:

【电路】
欧姆定律   U = I × R
功率       P = U × I = I²R = U²/R
电容       i = C × dU/dt          抗电压突变(缓存)
电感       U = L × di/dt          抗电流突变(惯性)
RC时间常数 τ = R × C              1τ到63%,5τ到99%
分压       Uout = Uin × R2/(R1+R2)

【交流】
有效值     U_rms = U_peak / √2    220V(rms) → 峰值311V
角频率     ω = 2π × f
容抗/感抗  Xc = 1/(ωC)   Xl = ωL  电容通高频/电感通低频

【PWM】
占空比     D = t_on / T
平均电压   U_avg = D × U_supply
周期频率   T = 1 / f_sw

【电机】
转速换算   ω = 2π × n / 60        rpm ↔ rad/s
反电动势   E = Ke × ω             转得快,背压大
转矩       T = Kt × I             控扭矩=控电流
电压方程   V = E + I × R
机械功率   P = T × ω = E × I
堵转电流   I_stall = V / R        E=0,电流爆炸

【控制】
PID        u = Kp·e + Ki·∫e + Kd·(de/dt)   现在/过去/未来
低通滤波   y = α·x + (1−α)·y_prev          就是EMA
采样定理   f_sample > 2 × f_max
ADC分辨率  LSB = Vref / 2^n

自测清单

想知道自己到没到位,过一遍这几个问题,答不上来就回对应章节:

  • 220V 插座的峰值电压是多少,为什么选器件要看峰值?(第二节)
  • 为什么一个只会开关的管子,能让电机无级调速?(第三节)
  • 电机堵转为什么会烧,反电动势在里面起什么作用?(第四节)
  • FOC 用一句话说是在干嘛?(第四节)
  • PID 三项分别看的是哪个时间维度?(第五节)
  • 看到 i_q_refspeed_est,分别是什么?(第六节)

最后一句

别指望两天变成硬件工程师,也不用。你的目标不是设计电路,是读懂别人写的电机、电源、控制代码,知道每个变量在物理上代表什么。这份教材的全部作用就是给你搭好那些挂钩。

真正上手时记住一件事:遇到陌生变量,先别查,先用”词根+后缀”拆一遍,八成能自己拆对。拆不对的那两成,才值得去查——查完补进你自己的表里。这样一个项目下来,工程英语这关就彻底过了。

公式会忘,类比不会。把”电容是缓存、PWM 是抖动、FOC 是坐标变换”这几个钩子记牢,具体公式忘了随时翻速查卡就行。

阿里云函数计算 一键部署 AI 大模型
赞(0)
未经允许不得转载:80aj » 软件人学电子电气:把公式当函数,把物理量当变量
赞助推荐 FoxCode Claude Code 稳定中转
阿里云函数计算 一键部署 AI 大模型

GLM Claude Code · 国产平替不封号

官方 Claude Code 又涨价又要 KYC,封号还得重配环境?智谱 GLM 兼容 Claude Code,稳定不封号、价格友好,注册后把现有 Claude Code 工作流直接切过来继续用。

立即体验 GLM查看套餐价格