我最近在补电子电气,第一周被术语砸得晕头转向。占空比、反电动势、有效值、FOC,每个词单独查都能查到,但连在一起看电机代码,还是不知道那个变量到底是什么。
后来我想明白了一件事:我不是记不住,是没有挂钩。
背单词式的学法对软件人是浪费。你已经会时间片调度、会缓存、会限流平滑、会指数退避、会坐标变换——这些正好是电子电气里占空比、电容、滤波、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_limit、p_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 系数,其实就是在调这个 τ。看到 tau、time_constant、rc_filter 这些名字,想的就是这条先快后慢的曲线。
7. 分压器:两个电阻切一刀电压
Uout = Uin × R2 / (R1 + R2)
(R2 是下面那个,取它两端的电压)
分压器是硬件里用得最多的小电路,作用就是把一个高电压按比例缩小,好让后面的 ADC(模数转换器)能读。
类比就是一个固定比例的 scale() 函数。5V 的信号,ADC 只能读 3.3V,就用两个电阻分压缩到量程内,读完再在代码里乘回比例。你看到 divider_ratio、vsense = 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 一直在变。把 U² 在一个周期里平均,再开方,得到的就是”一个多大的直流能产生同样的热”。RMS 的本质是:换算成直流后的等效值。 这跟你算延迟不看瞬时值、看 p99 或均方是一个思路——你要的是一个能代表整体效应的标量。
软件类比:peak 像 max 延迟,avg 像平均延迟,rms 像能反映”总能量/总代价”的那个统计量。看到变量 i_rms、v_peak、i_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_c、theta(角度)、omega(角频率),脑子里就是转圈这张图。
阻抗:电阻的交流版
到了交流,电容电感也开始”挡电流”,但它们挡的方式跟电阻不一样——跟频率有关。
电容的容抗:Xc = 1 / (ω × C) 频率越高,越通
电感的感抗:Xl = ω × L 频率越高,越挡
总阻抗: Z = √(R² + X²)
一句话记住它们的性格:电容通高频、挡低频(隔直流);电感通低频、挡高频。 这正好是你做滤波器的两块积木——想滤掉高频噪声用电容,想滤掉高频尖峰用电感。
阻抗 Z 是电阻的推广,把纯电阻和这些跟频率有关的部分合到一起。你不用现在会算复数阻抗,只要知道:在交流里,”电阻”这个概念升级成了阻抗,而且它随频率变。 变量 impedance、Xc、Xl 就是这层意思。
交流这块对读代码来说,记住三个口径的电压(峰值/有效值/平均)不要搞混、记住相位是”错开角度”、记住电容电感在交流下变成随频率变的阻抗,够用了。
三、占空比与 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_pwm、pwm_freq、f_sw 就是这个开关频率。
分辨率:占空比不是连续的
占空比在代码里是个整数计数器凑出来的,所以它有最小步进:
n 位 PWM,占空比能分 2^n 档
分辨率 = 1 / 2^n
例:10 位 PWM → 1024 档 → 每档约 0.098%
这跟 ADC/DAC 的位数是同一回事:位数决定你能调多细。控制精度不够时,先看看是不是 PWM 位数不够。变量 pwm_resolution、duty_max(满量程对应的计数值,比如 1023)就是这层。
死区时间:防止上下管短路
这个概念在电机、电源的半桥/全桥里必然出现,值得单独记。
一个桥臂上有上下两个开关管,控制电流方向。逻辑上一个开另一个就该关,但开关管关断需要时间。如果上管还没完全关、下管就开了,电源正负极会被这俩管子直接短路,瞬间烧管。
解法:加死区时间(dead time)
上管关 → 等一小段死区(两个都关)→ 下管才开
t_dead 典型 几百 ns ~ 几 μs
死区就是硬件版的互斥锁保护间隙。 你切换两个不能同时持有的资源时,中间留一个都不持有的空档,确保旧的彻底释放了新的才拿。变量 dead_time、t_dead、deadband 就是这个保命的空档。它设小了会烧管,设大了会让输出波形失真、影响控制精度——又是一个折中。
延伸: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)固定,你通过控制”开多久关多久”的比例,把平均速率压到你要的值,电感电容则是那个把突发流量削平的缓冲队列。看到 buck、vout_ref、duty 一起出现,脑子里就是这套”斩波 + 平滑 + 反馈”。
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_rpm 和 omega 同时出现别慌,它俩是一个东西的两种单位,中间差一个 2π/60 的换算。这就像代码里同时有 duration_ms 和 duration_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)的系统,你推得越快,它顶回来的阻力越大。变量 bemf、back_emf、e_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_current、i_limit、stall_detect 就是这条保命逻辑。理解了反电动势,你就理解了为什么电机堵转会烧——因为保护它的那个背压消失了。
空载则相反,没负载,电流趋近 0,转速冲到最高,由电压和 Ke 决定。数据手册上的 no_load_speed、no_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_current、i_limit、stall_cnt、bemf_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_d、i_q、theta_e(电角度)、clarke、park 这些变量和函数名,脑子里就是”降维 + 转到旋转坐标系”这两步。
不用现在会推变换矩阵,只要知道 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,输出是 output 或 u。调 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 滤波的截止频率——留下慢变的真实信号,滤掉快变的噪声。所以电容硬件滤波和这段代码软件滤波,数学上是一回事,硬件用电容、软件用一行加法。变量 alpha、filtered、lpf(low-pass filter)、ema 就是它。
采样定理:想还原多快的信号,就得采多快
传感器是离散采样的,采多快有个硬下限:
Nyquist:f_sample > 2 × f_signal_max
想准确还原 1kHz 的信号,采样率至少 2kHz(实际取 5~10 倍更稳)
采样不够快,高频信号会伪装成低频混进来,叫混叠(aliasing)——就是车轮在视频里看着倒转的那个效应,摄像头帧率跟不上车轮转速。控制里如果采样率不够,高频噪声会伪装成你以为的真实信号,怎么滤都滤不掉。看到 f_sample、sample_rate、dt(采样周期)就想到这条下限。
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(原始码值)、vref、adc_bits 就是这层。
传感器:位置、电流、温度怎么读
控制的前提是”测得到”。电机代码里三类传感器出现最多,读源码前先知道它们各自给你什么数:
- 位置/角度:编码器(encoder)给转角,霍尔传感器(hall)给粗略的扇区。FOC 必须知道转子角度
theta_e,就靠它们。增量编码器给的是脉冲计数,代码里enc_cnt累加再换算成角度;绝对编码器直接给角度值。软件类比:编码器就是一个不断上报位置的position事件流。 - 电流:靠采样电阻(
R_shunt)加欧姆定律,或用霍尔电流传感器。第一节说过——测不到电流,就测采样电阻两端电压再除以 R。变量i_sense、adc_curr就是这条链路的产物,i_meas是它滤波后的结果。 - 温度:热敏电阻(NTC)阻值随温度变,测阻值反推温度;或用数字温度传感器直接给数。
temp_motor、temp_igbt是保护逻辑的关键输入,过温就降功率或停机。
传感器的数据几乎都要过一遍前面的链路:raw(原始码值)→ 滤波(filt)→ 换算成物理量。你在代码里看到 xxx_raw 和 xxx 成对出现,中间那步就是滤波加标定。
控制这一层,几个工具串起来就是一条完整链路:传感器把物理量读进来(raw)、滤波去噪(filt)、PID 算出该使多大劲、再经 PWM 输出给电机。采样定理管这条链”够不够快”、ADC 位数管”够不够细”。它们的公式本质都是你写过的算法,换了个应用场景而已。
六、工程英语:不背单词,靠拆解读懂变量
到这里,物理量和公式你已经有了心智模型。剩下最后一关:代码里的变量名是英文缩写拼出来的,fan_speed_est、i_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_ref和speed_est,分别是什么?(第六节)
最后一句
别指望两天变成硬件工程师,也不用。你的目标不是设计电路,是读懂别人写的电机、电源、控制代码,知道每个变量在物理上代表什么。这份教材的全部作用就是给你搭好那些挂钩。
真正上手时记住一件事:遇到陌生变量,先别查,先用”词根+后缀”拆一遍,八成能自己拆对。拆不对的那两成,才值得去查——查完补进你自己的表里。这样一个项目下来,工程英语这关就彻底过了。
公式会忘,类比不会。把”电容是缓存、PWM 是抖动、FOC 是坐标变换”这几个钩子记牢,具体公式忘了随时翻速查卡就行。









