老 MCU 没有 FPU 不是不能做矢量控制,几万台变频跑 Q 格式的机器就是证明。这篇把 Q15 的心法讲清楚。
定点就是"约定小数点在哪"
Q15:16 位,1 位符号 + 15 位小数,范围约 -1 ~ +0.99997。所有电压、电流标幺化之后都落在这个区间,乘法用 DSP 的 MAC 一条指令出 32 位积,取高 16 位就是 Q15 结果。
三条铁律
- 乘前防溢出:两个 Q15 相乘不会溢出,但 Q15×Q31 会,先右移再乘;
- 除法变乘法:Q15 没有除法,把 1/x 预先算成 Q15 常数表;
- 饱和要显式:
#define SAT15(x) ((x) > 32767 ? 32767 : ((x) < -32768 ? -32768 : (x))),别指望编译器。
/* PI 增量式,全 Q15 */
int16_t pi_step(int16_t err) {
integ = sat15(integ + (int16_t)((ki * err) >> 15));
int32_t out = (kp * err + (integ << 15)) >> 15;
return sat15(out >> 0);
}标幺化的艺术
基值选额定相电流峰值和母线电压,这样正常工况下所有变量都在 0.5 左右晃,留足 Headroom。调试时把关键变量按 Q15 转 10 进制打出来看,比盲猜快十倍。
定点调试苦一天,量产省心十年。这套东西我们用了快十年,跨了三代 MCU。